VBAs IsDate-funksjon forteller deg visstnok om en tekststreng kan tolkes som en dato. For eksempel, alle følgende uttrykk evalueres til True:
IsDate(“25/5/2015”)
IsDate(“16. januar”)
IsDate(“12-1”)
IsDate(“12/1/15”)
IsDate(“2/30”)
IsDate(“30/2”)
I de to siste eksemplene, legg merke til at IsDate ikke er kresen når det gjelder rekkefølgen på dagen og måneden. Begge disse strengene kan tolkes som en dato, så IsDate returnerer True (uavhengig av systeminnstillingene for datoformat).
Her er litt informasjon fra en Microsoft Support-artikkel :
VBA-datofunksjonene IsDate, Format, CDate og CVDate bruker en funksjon som finnes i OLE Automation (OleAut32.dll). Denne funksjonen søker i alle mulige datoformater ved å tokenisere hver av de separerte verdiene i strengen som representerer datoen og returnerer en boolsk verdi som indikerer om inndata kan representeres som en dato.
Dette er viktig å huske når du bruker funksjonen til å tolke en dato som inneholder et 2-sifret år. Ulike lokaliteter bruker forskjellige datoformater (det vil si mm/dd/åå, åå/mm/dd, " DD MMM ÅÅ " , " ÅÅ MMM DD " og så videre) og derfor prøver funksjonen sifrene i alle posisjoner til funksjonen har funnet en gyldig dato eller brukt alle muligheter.
Bare fordi IsDate gjenkjenner en streng som en dato, betyr det ikke at strengen kan konverteres pålitelig til en dato. I noen tilfeller er resultatet tvetydig. Hva med dette uttrykket for eksempel?
IsDate(“29-Feb-01”)
29. februar 2001 er ikke en gyldig dato. Dette uttrykket returnerer imidlertid True fordi 1. februar 1929 (og 2. januar 1929) er gyldige datoer. Og det samme er de samme datoene i 2029.
Et søk etter IsDate-dokumentasjon ble tomt. Basert på testing godtar IsDate ett av følgende som skilletegn: en skråstrek (/), en bindestrek (-), et komma (,), en prikk (.) og et mellomrom.
Derfor returnerer alle følgende uttrykk True:
IsDate(“5.1”)
IsDate(“30 6”)
IsDate(“30,6”)
IsDate(“1/2”)
Men så er det denne anomalien: Følgende uttrykk returnerer True:
IsDate(“5.1.5”)
IsDate(“5.1.05”)
Ueksplisitt returnerer imidlertid dette uttrykket False:
IsDate(“5.1.2005”)
Anta at du opprettet et brukerskjema med en InputBox der brukeren legger inn en dato. Det bør være klart at det ikke er veldig pålitelig å bruke IsDate for å validere oppføringen.
Ting blir enda mer forvirrende når du innser at IsDate også dekker tidsverdier. (Det er ingen tilsvarende IsTime-funksjon.) Så følgende uttrykk returnerer alle True:
IsDate(“4:45”)
IsDate(“4.45”)
IsDate(“4 45”)
IsDate(“4/45”)
IsDate(“23:59”)
Disse uttrykkene returnerer False:
IsDate(“4:60”)
IsDate(“24.45”)
Det er viktig å påpeke at IsDate ikke viser alle disse særhetene når du passerer et Range-argument. For eksempel:
IsDate(Range(“A1”))
Det ser ut til at IsDate er helt pålitelig til å identifisere celler som inneholder en dato eller et klokkeslett. Den identifiserer for eksempel ikke en celle som inneholder 5.1 som en dato. Hvis koden din trenger å finne ut om en streng kan tolkes som en dato, er den beste løsningen å sette den strengen inn i en celle, og deretter skrive kode for å sjekke celleinnholdet.