Funkce IsDate VBA vám údajně říká, zda lze textový řetězec interpretovat jako datum. Například všechny následující výrazy se vyhodnotí jako True:
IsDate(“25. 5. 2015”)
IsDate(“16. ledna”)
IsDate(“12-1”)
IsDate(“12/1/15”)
IsDate(“2/30”)
IsDate(“30/2”)
V posledních dvou příkladech si všimněte, že IsDate není vybíravé, pokud jde o pořadí dne a měsíce. Oba tyto řetězce lze interpretovat jako datum, takže IsDate vrátí True (bez ohledu na vaše systémové nastavení formátu data).
Zde je několik informací z článku podpory společnosti Microsoft :
Funkce data VBA IsDate, Format, CDate a CVDate využívají funkci nalezenou v OLE Automation (OleAut32.dll). Tato funkce prohledává všechny možné formáty data tokenizací každé z oddělených hodnot v řetězci představujícím datum a vrací booleovskou hodnotu označující, zda lze vstup reprezentovat jako datum.
To je důležité mít na paměti, když používáte funkci k interpretaci data, které obsahuje 2 číslice roku. Různá národní prostředí používají různé formáty data (tj. mm/dd/rr, rr/mm/dd, „ DD MMM RR “ , „ RR MMM DD “ atd.), a proto funkce zkouší číslice na všech pozicích, dokud funkce našla platné datum nebo vyčerpala všechny možnosti.
To, že IsDate rozpoznává řetězec jako datum, neznamená, že řetězec lze spolehlivě převést na datum. V některých případech je výsledek nejednoznačný. Co například tento výraz?
IsDate("29-Feb-01")
29. únor 2001 není platné datum. Tento výraz však vrátí hodnotu True, protože 1. únor 1929 (a 2. leden 1929) jsou platná data. A tak jsou stejná data v roce 2029.
Hledání dokumentace IsDate bylo prázdné. Na základě testování přijímá IsDate jako oddělovací znaky libovolné z následujících znaků: lomítko (/), spojovník (-), čárku (,), tečku (.) a mezeru.
Proto všechny následující výrazy vrátí hodnotu True:
IsDate(“5.1”)
IsDate(“30 6”)
IsDate(“30,6”)
IsDate(“1/2”)
Ale pak je tu tato anomálie: Následující výrazy vrátí True:
IsDate(“5.1.5”)
IsDate(“5.1.05”)
Neexplicitně však tento výraz vrací False:
IsDate(“5.1.2005”)
Předpokládejme, že jste vytvořili UserForm s InputBox, kde uživatel zadá datum. Mělo by být jasné, že použití IsDate k ověření záznamu není příliš spolehlivé.
Věci se ještě více zamotají, když si uvědomíte, že IsDate zahrnuje také časové hodnoty. (Neexistuje žádná odpovídající funkce IsTime.) Takže všechny následující výrazy vracejí True:
IsDate(“4:45”)
IsDate(“4.45”)
IsDate(“4 45”)
IsDate(“4/45”)
IsDate(“23:59”)
Tyto výrazy vrací False:
IsDate(“4:60”)
IsDate(“24.45”)
Je důležité zdůraznit, že IsDate nevykazuje všechny tyto zvláštnosti, když předáte argument Range. Například:
IsDate(Rozsah(“A1”))
Zdá se, že IsDate je dokonale spolehlivý při identifikaci buněk, které obsahují datum nebo čas. Neidentifikuje například buňku obsahující 5.1 jako datum. Pokud váš kód potřebuje určit, zda lze řetězec interpretovat jako datum, nejlepším řešením je vložit tento řetězec do buňky a poté napsat kód pro kontrolu obsahu buňky.