Waarom wordt foute datum automatisch gecorrigeerd?

  • Onderwerp starter Onderwerp starter Jemp
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Jemp

Gebruiker
Lid geworden
18 feb 2012
Berichten
145
Resultaat van MyDate = CDate ("10/01/2012") : MyDate = 10/01/2012
Resultaat van MyDate = CDate ("10/13/2012") : MyDate = 13/10/2012

Is het zo dat CDate een onmogelijke datum automatisch corrigeert en ... is dit te vermijden?

Groetjes
JP
 
Laatst bewerkt:
Cdate corrigeert geen 'onmogelijke' datums; probeer 29-14-2011 maar eens. 10/13/2012 daarentegen is een datum in de Amerikaanse datumnotatie. Daarbij staat de maand vooraan, gevolgd door de dag. Oftewel: 13 oktober. En die krijg je dus terug. Je hebt dan nog mazzel dat 10/01 niet wordt uitgelezen als 1 oktober. Wil je zeker weten dat je datum klopt, dan zul je dus een betere check moeten uitvoeren. Zelf vertaal ik een datum altijd naar het brongetal (met CDbl([datum]) bijvoorbeeld), en maak ik er naderhand met CDate weer een datum van. Hoe jij het moet aanpakken hangt een beetje van de situatie af; daar zeg je verder niks over.
 
Juist door die "mazzel" is de oorzaak tamelijk duister voor een VBA-beginner. :D

Ik voeg voor alle duidelijkheid effe mijn code hieronder toe.
Het InvoerForm dat ik gebruik bevat een txtBox (txtVervaldatum) waar de invoer gebeurt onder de vorm ddmmjj (6 cijfers dus en vandaar de "20" in de variale "DateStr").

Zoals reeds gezegd loopt het bij "CDate" dus verkeerd.

Code:
If txtVervaldatum.Text = "" Then
            Exit Sub
        Else
            DateStr = Left(txtVervaldatum.Text, 2) & "/" & Mid(txtVervaldatum.Text, 3, 2) & "/" & "20" & Right(txtVervaldatum.Text, 2)
            MyDate = CDate(Format(DateStr, "dd/mm/yyyy"))
            If IsDate(MyDate) Then
                Verbruikgegevens(3) = MyDate
            Else
                Exit Sub
            End If
        End If
 
Laatst bewerkt:
Na heel wat denkwerk ben ik toch tot de conclusie gekomen dat de "correcties" wel degelijk automatisch gebeuren. Onderstaande procedure is daar wel het bewijs van dacht ik zo.

Code:
Private Sub CommandButton1_Click()
Dim DateStr As Date

MsgBox "1/2/2004"
DateStr = "1/2/2004"
MsgBox (DateStr & "   Via variabele")

MsgBox "1/13/2004"
DateStr = "1/13/2004"
MsgBox (DateStr & "   Via variabele")

MsgBox "32/13/2004"
DateStr = "32/13/2004"
MsgBox (DateStr & "   Via variabele")

End Sub

1/2/2004 geeft rechtstreeks of via variabele zelfde resultaat (1/2/2004)
1/13/2004 geeft enkel via variabele 13/1/2004
32/13/2004 kan niet gecorrigeerd worden en geeft dus een error !!

Nu nog uitzoeken hoe ik (?) dit oplos voor mijn programma :(
 
Je beschrijving klopt, je interpretatie niet. Er vindt geen correctie plaats, wel iets anders:

Je zegt dat de variable een datum is met 'Dim'
de tekstreeks in de variabele wordt beoordeeld naar het door jou ingestelde datumsysteem: dd-mm-yyyy
Als dat geen geldige waarde oplevert valt VBA terug naar de defaulttaal US. en wordt de tekstreeks geinterpreteerd volgens het VS-systeem: mm-dd-yyyy.
Als dat tot een geldige datum leidt wordt deze - Ameriaakse- datum gepresenteerd.
Als geen van beide interpretaties tot een geldige datum leidt is het resultaat een foutmelding.

Er zou pas van 'correctie' sprake zijn, als binnen hetzelfde systeem een wijziging zou worden aangebracht.
 
Laatst bewerkt:
Hoi snb

Ik blijf zoeken naar wat er juist gebeurt zodat ik het voor eens en altijd begrijp :) (wat blijkbaar niet altijd even evident is in Excel)
Hoe wordt in jouw redenering (die ik logisch vind) verklaard dat de onderstaande code toch 13/maart/2004 oplevert en niet 13/march/2004?

Code:
DateStr = "3/13/2004"
MsgBox (Format(DateStr, "dd / mmmm / yyyy"))
 
De redenering van snb komt overeen met mijn uitleg, en die is: als een string geen datum oplevert in de standaard landnotatie (dag-maand-jaar in Nederland) dan wordt de datum gelezen als een Amerikaanse datum: maand-dag-jaar. De 13 staat dan niet meer voor de maandwaarde (we hebben geen 13e maand) maar voor de dag. En de dag wordt dan gelezen als maand: maand 3 dus. Pas bij datums als "32/13/2004" gaat het verkeerd, omdat noch de dag, noch de maand een geldige waarde oplevert voor de maand.
Een Amerikaanse datum is overigens niet hetzelfde als een datumweergave in het Engels :)
 
Laatst bewerkt:
ok tx voor jullie uitleg :thumb:
Ik bouw in mijn code gewoon een bijkomende controle in op de maand (<12) en dat moet wel werken.

Groetjes
JP
 
Waarom controleren achteraf als je fouten vooraf kunt voorkomen ?

- vul een combobox met geldige datumwaarden en laat de gebruiker daaruit kiezen.
- gebruik een datepicker control
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan