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#