Avatar billede folj Forsker
21. februar 2013 - 11:45 Der 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

-----/Udpluk fra min Sub-----

Hvad kan årsagen være til at typen er mismatch ?
Avatar billede folj Forsker
22. februar 2013 - 10:29 #1
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?
Avatar billede folj Forsker
22. februar 2013 - 12:10 #2
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...
Avatar billede folj Forsker
22. februar 2013 - 12:39 #3
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?
Avatar billede somalpe Nybegynder
22. februar 2013 - 13:26 #4
Hvordan ser koden i ReturnHelligdag ud ?
Avatar billede folj Forsker
22. februar 2013 - 13:42 #5
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

EDate = DateSerial(y, eMonth, eDay)
Easterday = EDate

End Function
-------------

Beklager at jeg ikke forstår at lave de blå kasser til at putte koden ind i, her på eksperten.dk
Avatar billede somalpe Nybegynder
22. februar 2013 - 14:02 #6
Å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

end if
Avatar billede folj Forsker
25. februar 2013 - 10:10 #7
@somalpe> Det var lige de "Guldkorn" der manglede... Det er simpelthen sagens kerne.

Jeg er lidt præget af at jeg også skriver scripts til php, og der ville det godt kunne skrives på min måde...

Men Super nu virker den del, i ivert fald.

Smider du lige et svar også - der er lidt points til dig.
...og ud over det, skal du have tak for hjælpen.
Avatar billede somalpe Nybegynder
25. februar 2013 - 10:27 #8
Det var så lidt :)
Avatar billede folj Forsker
25. februar 2013 - 10:43 #9
Lige en lille komentar til svaret...

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".
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester