21. februar 2013 - 11:45Der er
8 kommentarer og 1 løsning
Datoinput i funktionskald
Jeg har en egen funktion der beregner skæve helligdage. Funktonen kræver et datoinput, og det fejler på "Type mismatch"
-----Udpluk fra min Sub----- Dim ActiveDate As Date Dim i, ActiveDateYyyy, ActiveDateMm, ActiveDateDd As Integer
For i = 0 To AntalGange ActiveDate = DatoArray(i + 1, 1) ' henter dato ind fra arrayet, og hvis jeg skriver den ud med en MsgBox, så har den første hentning har værdien 31-12-2012 ActiveDateDd = Left(ActiveDate, 2) ' henter datoen ud af værdien 31-12-2012 ActiveDateMm = Mid(ActiveDate, 4, 2) ' henter måneden ud af værdien 31-12-2012 ActiveDateYyyy = Right(ActiveDate, 4) ' henter årstal ud af værdien 31-12-2012 If ReturnHelligdag(DateSerial(ActiveDateYyyy, ActiveDateMm, ActiveDateDd)) Then ' hvis funktionen returnerer andet end False, er det en helligdag ' herefter vi jeg indsætte den returnerede værdi i mit array End If Next i
Har lige gjort en lille opdagelse der måske forklarer noget...
ActiveDateDd = Left(ActiveDate, 2) ' returnerer talværdien 31 ud fra værdien 31-12-2012 ActiveDateMm = Mid(ActiveDate, 4, 2) ' returnerer værdien "12" ud fra værdien 31-12-2012 (men med "" gåseøjne, så det opfattes måske som tekststreng og ikke integer) ActiveDateYyyy = Right(ActiveDate, 4) ' returnerer værdien "2012" ud fra værdien 31-12-2012 (igen med "" gåseøjne, så det opfattes måske son tekststreng og ikke integer)
Hvis værdierne er blevet til tekststrenge - hvordan får jeg dem konverteret til talværdier?
Det er åbenbart ikke problemet med "gåseøjnene", der skal løses...
Jeg fik fjernet gåseøjnene ved hjælp af CInt, der konverterer strengen til Integer. Altså hhv. CInt(Format(ActiveDate, "mm")) og CInt(Format(ActiveDate, "yyyy")) fjerne de gåseøjnene, men scriptet fejler stadig på "Type Mismatch" når jeg kalder funktionen... Hjælp mig...
Jeg har selv testet videre... Jeg synes det begynder at blive mystisk...
Når jeg skriver datoinputtet direkte ind som tal, så fejler den stadig på "Type Mismatch".
eksempel: If ReturnHelligdag(DateSerial(2012, 12, 31)) Then ' hvis funktionen ikke returnerer False, er det en helligdag End If
Skulle det ikke være muligt at skrive tallene direkte ind og være sikker på at de opfattes som tal?
Når debuggeren markerer linien gul, er det vel altid der fejlen skal findes - altså er det ikke en fejl der ligger i funktionen der kaldes. Har jeg ret i det?
Her kommer lige min funktion, der senere kalder kunktionen Easterday, fordi det er påskedag der styrer alle de skæve helligdage.
------------- Function ReturnHelligdag(InDate As Date) ' Funktionen kræver et dato-input, og returener navnet på søgnehelligdagen hvis det er en sådan ' Hvis dato ikke er en søgnehelligdagen, returnerer fuktionen False
Dim OutText As String Dim EDate As Date EDate = Easterday(InDate) ' beregner datoen for påskedag i det pågældende år i den anden funktion Easterday
'årets faste søgne-helligdage, beregnes udfra de faste datoer If (Day(InDate) = 1) And (Month(InDate) = 1) Then OutText = "Nytårsdag" ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." ReturnHelligdag = OutText End If If (Day(InDate) = 1) And (Month(InDate) = 5) Then OutText = "Arbejdernes Kampdag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If (Day(InDate) = 5) And (Month(InDate) = 6) Then OutText = "Grundlovsdag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If (Day(InDate) = 24) And (Month(InDate) = 12) Then OutText = "Juleaften" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If (Day(InDate) = 25) And (Month(InDate) = 12) Then OutText = "Juledag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If (Day(InDate) = 26) And (Month(InDate) = 12) Then OutText = "2. Juledag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If (Day(InDate) = 31) And (Month(InDate) = 12) Then OutText = "Nytårsaften" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If 'Skæve helligdage, beregnes udfra Påskedag If InDate = EDate - 3 Then OutText = "Skærtorsdag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If InDate = EDate - 2 Then OutText = "Langfredag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If InDate = EDate Then OutText = "Påske" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If InDate = EDate + 1 Then OutText = "2. Påskedag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If InDate = EDate + 26 Then OutText = "St. Bededag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If InDate = EDate + 39 Then OutText = "Kristi Himmelfart" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If InDate = EDate + 49 Then OutText = "Pinse" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If If InDate = EDate + 50 Then OutText = "2. Pinsedag" ReturnHelligdag = OutText ' MsgBox Outtext & " fundet..." & InDate, vbOKOnly, "Helligdag fundet..." End If
If OutText <> "" Then ReturnHelligdag = OutText Else ReturnHelligdag = False End If End Function -------------
Function Easterday(Year As Date) 'Funktionen får et datoinput, trækker årstallet ud af det, og beregnder datoen hvor påskedag falder det pågældende år.
' Påsken er altid placeret første søndag efter første fuldmåne efter forårsjævndøgn ' Nedenstående funktion beregner påsken ud fra ' Fischer Lexikon Astronomie, p. 50: Algorithm of C.F. Gauá (1777-1855)
Dim y, a, b, c, d, e, n, m, eDay, eMonth As Integer ' declare vars Dim EDate As Date y = Format(Year, "yyyy")
' værdierne m og n er faste værdier, ' men de er begrænset til at dække årene 1900 til 2099, ' men det burde være nok til de fleste (hvis man ikke regner med at blive unaturligt gammel)
m = 24 n = 5
a = y Mod 19 b = y Mod 4 c = y Mod 7 d = ((19 * a) + m) Mod 30 e = ((2 * b) + (4 * c) + (6 * d) + n) Mod 7 eDay = 22 + d + e eMonth = 4
If eDay <= 31 Then eMonth = 3 Else If ((d = 28) And (e = 6) And (a > 10)) Then eDay = 18 Else If ((d = 29) And (e = 6)) Then eDay = 19 Else eDay = d + e - 9 End If End If End If
Årsagen til at du får fejl er at når du kalder funktionen på denne her måde:
If ReturnHelligdag(DateSerial(ActiveDateYyyy, ActiveDateMm, ActiveDateDd)) Then
så forventes der at funktionen returnerer True eller False (Boolean)Funktionen returnerer en tekst streng hvilket gør at kaldet til funktionen skal anderledes
Det er meget enkelt at løse problemet. Sørg for at kalde funktionen som følger:
If ReturnHelligdag(DateSerial(ActiveDateYyyy, ActiveDateMm, ActiveDateDd)) <> False Then
Det skulle gerne virke.
Da du beskriver at du skal bruge teksten som funktionen returnerer i dit array, så ville jeg gøre det på følgende måde:
returText = ReturnHelligdag(DateSerial(ActiveDateYyyy, ActiveDateMm, ActiveDateDd)) if returText <> False then
Nu kan jeg jo godt li' at variabler er deklareret i toppen af scriptet, men hvis jeg deklarerer variablen ReturText som String, så vil den ikke acceptere at få værdien False retur fra fuktionen.
Efter jeg fjernede min deklarering, så virkede scriptet igen, uden at fejle på "Type Mismatch".
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.