A VBA IsDate függvénye állítólag megmondja, hogy egy szöveges karakterlánc értelmezhető-e dátumként. Például a következő kifejezések mindegyike igaz:
IsDate (“2015.05.25.”)
IsDate (“január 16.”)
IsDate ("12-1")
IsDate ("12/1/15")
IsDate ("2/30")
IsDate ("30/2")
Az utolsó két példában figyelje meg, hogy az IsDate nem válogat a nap és a hónap sorrendjében. Mindkét karakterlánc dátumként értelmezhető, így az IsDate True értéket ad vissza (függetlenül a rendszerdátumformátum-beállításoktól).
Íme néhány információ a Microsoft támogatási cikkéből :
A VBA dátumfüggvényei IsDate, Format, CDate és CVDate az OLE Automationban (OleAut32.dll) található függvényt használnak. Ez a függvény megkeresi az összes lehetséges dátumformátumot úgy, hogy a dátumot jelentő karakterláncban minden elválasztott értéket tokenizál, és egy logikai értéket ad vissza, jelezve, hogy a bemenet dátumként ábrázolható-e.
Ezt fontos megjegyezni, amikor a függvényt olyan dátum értelmezésére használja, amely egy 2 számjegyű évet tartalmaz. A különböző területi beállítások különböző dátumformátumokat használnak (azaz mm/nn/éé, éé/hh/nn, “ DD HMM YY ” , “ YY HMM DD ” és így tovább), ezért a függvény minden pozícióban megpróbálja a számjegyeket, amíg a függvény érvényes dátumot talált, vagy kimerítette az összes lehetőséget.
Csak azért, mert az IsDate dátumként ismer fel egy karakterláncot, még nem jelenti azt, hogy a karakterlánc megbízhatóan dátummá alakítható. Egyes esetekben az eredmény nem egyértelmű. Például mi a helyzet ezzel a kifejezéssel?
IsDate ("29-20-01"
2001. február 29. nem érvényes dátum. Ez a kifejezés azonban igaz értéket ad vissza, mert 1929. február 1. (és 1929. január 2.) érvényes dátumok. És ugyanezek a dátumok 2029-ben is.
Az IsDate dokumentáció keresése üresen jött. A tesztelés alapján az IsDate a következők bármelyikét elfogadja elválasztó karakterként: perjel (/), kötőjel (-), vessző (,), pont (.) és szóköz.
Ezért a következő kifejezések mindegyike igaz értéket ad vissza:
IsDate ("5.1")
IsDate ("30 6")
IsDate("30,6")
IsDate ("1/2")
De akkor van ez az anomália: A következő kifejezések True-t adnak vissza:
IsDate ("5.1.5")
IsDate(“5.1.05”)
Ez a kifejezés azonban kimondatlanul False értéket ad vissza:
IsDate(“2005.1.5.”)
Tegyük fel, hogy létrehozott egy felhasználói űrlapot egy InputBox-szal, ahol a felhasználó beír egy dátumot. Világosnak kell lennie, hogy az IsDate használata a bejegyzés érvényesítésére nem túl megbízható.
A dolgok még zavarosabbá válnak, ha rájössz, hogy az IsDate az időértékeket is lefedi. (Nincs megfelelő IsTime függvény.) Tehát a következő kifejezések mindegyike True-t ad vissza:
IsDate ("4:45")
IsDate ("4,45")
IsDate ("4 45")
IsDate ("4/45")
IsDate ("23:59")
Ezek a kifejezések hamis értéket adnak vissza:
IsDate ("4:60")
IsDate(“24.45”)
Fontos kiemelni, hogy az IsDate nem mutatja meg ezeket a furcsaságokat, amikor átadjuk a Range argumentumot. Például:
IsDate (Tartomány ("A1")
Úgy tűnik, hogy az IsDate tökéletesen megbízható a dátumot vagy időt tartalmazó cellák azonosításában. Nem azonosít például dátumként egy 5.1-et tartalmazó cellát. Ha a kódnak meg kell határoznia, hogy egy karakterlánc értelmezhető-e dátumként, a legjobb megoldás az, ha a karakterláncot egy cellába helyezi, majd kódot ír a cella tartalmának ellenőrzéséhez.