VBA:n IsDate-funktio oletettavasti kertoo, voidaanko tekstimerkkijono tulkita päivämääräksi. Esimerkiksi kaikkien seuraavien lausekkeiden arvo on tosi:
IsDate ("25.5.2015")
IsDate ("16. tammikuuta")
IsDate("12-1")
IsDate("12/1/15")
IsDate("2/30")
IsDate("30/2")
Kahdessa viimeisessä esimerkissä huomaa, että IsDate ei ole nirso päivän ja kuukauden järjestyksen suhteen. Molemmat merkkijonot voidaan tulkita päivämääräksi, joten IsDate palauttaa True (riippumatta järjestelmän päivämäärämuoto-asetuksista).
Tässä on tietoja Microsoftin tukiartikkelista :
VBA-päivämääräfunktiot IsDate, Format, CDate ja CVDate käyttävät funktiota, joka löytyy OLE Automationista (OleAut32.dll). Tämä funktio etsii kaikista mahdollisista päivämäärämuodoista tokenisoimalla jokaisen erotetun arvon päivämäärää edustavassa merkkijonossa ja palauttaa Boolen arvon, joka osoittaa, voidaanko syöte esittää päivämääränä.
Tämä on tärkeää muistaa, kun toimintoa käytetään tulkitsemaan päivämäärää, joka sisältää 2-numeroisen vuoden. Eri kieliasetukset käyttävät erilaisia päivämäärämuotoja (eli kk/pp/vv, vv/kk/pp, " DD MMM YY " , " YY MMM DD " ja niin edelleen) ja siksi toiminto yrittää numeroita kaikissa paikoissa, kunnes toiminto on löytänyt kelvollisen päivämäärän tai käyttänyt kaikki mahdollisuudet.
Se, että IsDate tunnistaa merkkijonon päivämääräksi, ei tarkoita, että merkkijono voidaan luotettavasti muuntaa päivämääräksi. Joissakin tapauksissa tulos on epäselvä. Entä esimerkiksi tämä ilmaus?
IsDate ("29-2-01"
29. helmikuuta 2001 ei ole kelvollinen päivämäärä. Tämä lauseke palauttaa kuitenkin arvon Tosi, koska 1. helmikuuta 1929 (ja 2. tammikuuta 1929) ovat kelvollisia päivämääriä. Ja niin ovat samat päivämäärät vuonna 2029.
IsDate-dokumentaation haku tuli tyhjäksi. Testauksen perusteella IsDate hyväksyy minkä tahansa seuraavista erotinmerkeiksi: kauttaviiva (/), yhdysmerkki (-), pilkku (,), piste (.) ja välilyönti.
Siksi kaikki seuraavat lausekkeet palauttavat True:
IsDate("5.1")
IsDate("30 6")
IsDate("30,6")
IsDate("1/2")
Mutta sitten on tämä poikkeama: Seuraavat lausekkeet palauttavat True:
IsDate("5.1.5")
IsDate("5.1.05")
Tämä lauseke palauttaa kuitenkin epäselvästi False:
IsDate("5.1.2005")
Oletetaan, että loit käyttäjälomakkeen, jossa on InputBox, johon käyttäjä syöttää päivämäärän. Pitäisi olla selvää, että IsDate-toiminnon käyttäminen merkinnän vahvistamiseen ei ole kovin luotettavaa.
Asiat muuttuvat vielä hämmentävämmiksi, kun huomaat, että IsDate kattaa myös aika-arvot. (Ei ole vastaavaa IsTime-funktiota.) Joten kaikki seuraavat lausekkeet palauttavat True:
IsDate("4:45")
IsDate("4.45")
IsDate("4 45")
IsDate ("4/45")
IsDate("23:59")
Nämä lausekkeet palauttavat False:
IsDate("4:60")
IsDate("24.45")
On tärkeää huomauttaa, että IsDate ei osoita kaikkia näitä omituisuuksia, kun ohitat Range-argumentin. Esimerkiksi:
IsDate(alue("A1")
Näyttää siltä, että IsDate on täysin luotettava tunnistamaan soluja, jotka sisältävät päivämäärän tai ajan. Se ei esimerkiksi tunnista solua, joka sisältää päivämääränä 5.1:n. Jos koodisi on määritettävä, voidaanko merkkijono tulkita päivämääräksi, paras ratkaisu on laittaa merkkijono soluun ja kirjoittaa sitten koodi tarkistaaksesi solun sisällön.