Discussion:
Argumenttyp ByRef unverträglich
(zu alt für eine Antwort)
Thomas Seichter
2004-08-11 17:20:09 UTC
Permalink
Hallo NG,

Ich versuche eine eigene Excel-Fkt. über VBA zu
programmieren. Meine Funktion verwendet zur
Eingabekontrolle/Fehlerüberprüfung zwei Hilfsfunktionen,
denen ich beim Aufruf Argumente übergebe, die innerhalb
der Funktionen speziell formatiert werden sollen. Die
formatierten Werte sollen 'by reference' zurückgegeben
werden, die Funktionen selbst liefern nur boolsche Werte
zurück.
Leider erhalte ich immer die Fehlermeldung "Argumenttyp
ByRef unverträglich".
Gibt es Beschränkungen, wann ich Referenzen übergeben kann
bzw. wann nicht?
Danke Thomas
Melanie Breden
2004-08-11 17:52:53 UTC
Permalink
Hallo Thomas,
Post by Thomas Seichter
Ich versuche eine eigene Excel-Fkt. über VBA zu
programmieren. Meine Funktion verwendet zur
Eingabekontrolle/Fehlerüberprüfung zwei Hilfsfunktionen,
denen ich beim Aufruf Argumente übergebe, die innerhalb
der Funktionen speziell formatiert werden sollen. Die
formatierten Werte sollen 'by reference' zurückgegeben
werden, die Funktionen selbst liefern nur boolsche Werte
zurück.
Leider erhalte ich immer die Fehlermeldung "Argumenttyp
ByRef unverträglich".
Gibt es Beschränkungen, wann ich Referenzen übergeben kann
bzw. wann nicht?
ohne den Code zu kennen, lässt sich schwer eine Diagnose stellen.
Poste doch mal deine Aufrufe und die Funktion hierher.

--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Melanie Breden
2004-08-11 19:44:56 UTC
Permalink
Hallo Thomas ,
die Fkt. AddTime soll Minutenangaben zu Uhrzeiten addieren.
Die zu addierende Zeit kann in einem beliebigen Format
(z.B. 342 Min oder 1:07 Std.) vorkommen, die Fkt. soll das
handeln können. Die Zellen, aus denen die Werte an die
Fkt. übergeben werden sind als Textzellen formatiert
Public Function AddTime(p_strStart As String, p_strTime As String) As String
Application.Volatile
die Funktion 'AddTime' wird als Tabellenfunktion eingesetzt?
Die beiden Argumente sollen vermutlich zwei Zahlenwerte im Stringformat
bzw. Werte aus Bezügen übernehmen.
=AddTime("342" ;"1:07") oder =AddTime(A1;B1)

Wenn dem so ist, kannst du auf Application Volatile verzichten.
Die Funktion wird autmatisch neu berechnet, wenn sich entweder ein Wert in der Formel
oder im angegebenen Bezug ändert.
Dim nOffset, nHour, nMinute As Integer
Dim strHour, strMinute As String
Bei deinen Variablendeklarierungen werden lediglich die letzten Variablen als
Integer, bzw. String deklariert. Die vorderen Variablen sind gar nicht deklariert
und somit automatisch vom Datentyp Variant.
Hinter jeder Variablen muss ein Datentyp angegeben werden.
Deklariere z.B. so:
Dim nOffset As Integer, nHour As Integer, nMinute As Integer
Dim strHour As String, strMinute As String
....
If Not CheckStart(p_strStart) Then
AddTime = "#Wert#"
Exit Function
End If
.....
Wenn die Funktionsargumente falsche Werte enthalten, soll der Fehlerwert '#WERT!'
als Funktionsergebnis in die Zelle geschrieben werden?
Das erreichst du mit:
AddTime = CVErr(xlValue)
Da dieser Wert vom Datentyp Variant ist, muss die Funktion ebenfalls als Variant deklariert werden,
da sie Werte von verschiedenen Datentypen zurückliefern kann.
Die Hilfsfunktion CheckStart überprüft, ob es sich bei
p_strStart um eine gültige Zeitangabe handelt und
formatiert die Zeit in hh:mm. Hat das funktioniert, gibt
die Funktion True zurück.
Private Function CheckStart(ByRef p_strValue As String) As
Boolean
Standardmäßig werden Argumente in einer Funktion ByRef übergeben, deswegen
muss dieses Schlüsselweort nicht unbedingt angegeben werden.

Ich denke aber, hier hast du einen Denkfehler!
Was genau soll die Funktion tun? Einen Warheitswert liefern,
*oder* einen Wert neu berechnen/formatieren?

Bei mir funktioniert der Funktionsaufruf einwandfrei.
In welchen Modulen sind die Funktionen gespeichert?
Sie sollten alle in einem Standardmodul sein.

Insgesamt sieht dein bisheriger Code bei mir so aus und läuft einwandfrei durch:

Public Function AddTime(p_strStart As String, _
p_strTime As String) As Variant
Dim nOffset As Integer, nHour As Integer, nMinute As Integer
Dim strHour As String, strMinute As String

If Not CheckStart(p_strStart) Then
AddTime = CVErr(xlValue)
Exit Function
End If
End Function

Private Function CheckStart(ByRef p_strValue As String) As Boolean

End Function

BTW:
Welche Excel Version verwendest du?
Warum postest du nicht den gesamten Code, dann kann man generell mal drüber schauen :-)

--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#

Loading...