VBA's IsDate-funktion fortæller dig angiveligt, om en tekststreng kan fortolkes som en dato. For eksempel evalueres alle følgende udtryk til Sand:
IsDate ("25/5/2015")
IsDate ("16. januar")
IsDate(“12-1”)
IsDate(“12/1/15”)
IsDate(“2/30”)
IsDate ("30/2")
I de sidste to eksempler skal du bemærke, at IsDate ikke er kræsen med hensyn til rækkefølgen af dagen og måneden. Begge disse strenge kunne fortolkes som en dato, så IsDate returnerer True (uanset dit system datoformatindstillinger).
Her er nogle oplysninger fra en Microsoft Support-artikel :
VBA-datofunktionerne IsDate, Format, CDate og CVDate bruger en funktion, der findes i OLE Automation (OleAut32.dll). Denne funktion søger i alle mulige datoformater ved at tokenisere hver af de adskilte værdier i strengen, der repræsenterer datoen, og returnerer en boolsk værdi, der angiver, om input kan repræsenteres som en dato.
Dette er vigtigt at huske, når du bruger funktionen til at fortolke en dato, der indeholder et 2-cifret årstal. Forskellige lokaliteter bruger forskellige datoformater (dvs. mm/dd/åå, åå/mm/dd, " DD MMM ÅÅ " , " ÅÅ MMM DD " og så videre), og derfor prøver funktionen cifrene i alle positioner, indtil funktion har fundet en gyldig dato eller opbrugt alle muligheder.
Bare fordi IsDate genkender en streng som en dato, betyder det ikke, at strengen pålideligt kan konverteres til en dato. I nogle tilfælde er resultatet tvetydigt. Hvad med dette udtryk for eksempel?
IsDate(“29-Feb-01”)
29. februar 2001 er ikke en gyldig dato. Dette udtryk returnerer dog True, fordi 1. februar 1929 (og 2. januar 1929) er gyldige datoer. Og det samme er de samme datoer i 2029.
En søgning efter IsDate-dokumentation kom op tom. Baseret på test accepterer IsDate ethvert af følgende som separatortegn: en skråstreg (/), en bindestreg (-), et komma (,), en prik (.) og et mellemrum.
Derfor returnerer følgende udtryk alle Sand:
IsDate(“5.1”)
IsDate(“30 6”)
IsDate("30,6")
IsDate(“1/2”)
Men så er der denne anomali: Følgende udtryk returnerer Sand:
IsDate(“5.1.5”)
IsDate(“5.1.05”)
Men ueksplicit returnerer dette udtryk False:
IsDate(“5.1.2005”)
Antag, at du har oprettet en brugerformular med en inputboks, hvor brugeren indtaster en dato. Det bør være klart, at det ikke er særlig pålideligt at bruge IsDate til at validere posten.
Tingene bliver endnu mere forvirrende, når du indser, at IsDate også dækker tidsværdier. (Der er ingen tilsvarende IsTime-funktion.) Så de følgende udtryk returnerer alle True:
IsDate(“4:45”)
IsDate(“4.45”)
IsDate(“4 45”)
IsDate(“4/45”)
IsDate("23:59")
Disse udtryk returnerer Falsk:
IsDate(“4:60”)
IsDate(“24.45”)
Det er vigtigt at påpege, at IsDate ikke udviser alle disse særheder, når du sender et Range-argument. For eksempel:
IsDate(Range(“A1”))
Det ser ud til, at IsDate er fuldstændig pålidelig til at identificere celler, der indeholder en dato eller et klokkeslæt. Den identificerer for eksempel ikke en celle, der indeholder 5.1 som en dato. Hvis din kode skal afgøre, om en streng kan fortolkes som en dato, er den bedste løsning at sætte den streng ind i en celle og derefter skrive kode for at kontrollere celleindholdet.