Η συνάρτηση IsDate του VBA υποτίθεται ότι σας λέει εάν μια συμβολοσειρά κειμένου μπορεί να ερμηνευτεί ως ημερομηνία. Για παράδειγμα, όλες οι παρακάτω εκφράσεις αξιολογούνται ως True:
IsDate (“25/5/2015”)
IsDate ("16 Ιανουαρίου")
IsDate ("12-1")
IsDate ("12/1/15")
IsDate ("2/30")
IsDate ("30/2")
Στα δύο τελευταία παραδείγματα, παρατηρήστε ότι το IsDate δεν είναι επιλεκτικό ως προς τη σειρά της ημέρας και του μήνα. Και οι δύο αυτές συμβολοσειρές θα μπορούσαν να ερμηνευτούν ως ημερομηνία, επομένως το IsDate επιστρέφει True (ανεξάρτητα από τις ρυθμίσεις μορφής ημερομηνίας του συστήματός σας).
Ακολουθούν ορισμένες πληροφορίες από ένα άρθρο υποστήριξης της Microsoft :
Οι συναρτήσεις ημερομηνίας VBA IsDate, Format, CDate και CVDate χρησιμοποιούν μια συνάρτηση που βρίσκεται στο OLE Automation (OleAut32.dll). Αυτή η συνάρτηση αναζητά όλες τις πιθανές μορφές ημερομηνίας με διακριτικό καθεμιάς από τις διαχωρισμένες τιμές στη συμβολοσειρά που αντιπροσωπεύει την ημερομηνία και επιστρέφει μια Boolean τιμή που υποδεικνύει εάν η είσοδος μπορεί να αναπαρασταθεί ως Ημερομηνία.
Αυτό είναι σημαντικό να θυμάστε όταν χρησιμοποιείτε τη συνάρτηση για να ερμηνεύσετε μια ημερομηνία που περιέχει ένα έτος 2 ψηφίων. Διαφορετικές τοπικές ρυθμίσεις χρησιμοποιούν διάφορες μορφές ημερομηνίας (δηλαδή, μμ/ηη/εε, εε/μμ/ηη, « ΗΗ ΜΜΜ ΕΕΕ » , « ΕΕ ΜΜΜ ΗΗ » και ούτω καθεξής) και επομένως η συνάρτηση δοκιμάζει τα ψηφία σε όλες τις θέσεις έως ότου η λειτουργία βρήκε έγκυρη ημερομηνία ή εξάντλησε όλες τις δυνατότητες.
Ακριβώς επειδή το IsDate αναγνωρίζει μια συμβολοσειρά ως ημερομηνία δεν σημαίνει ότι η συμβολοσειρά μπορεί να μετατραπεί αξιόπιστα σε ημερομηνία. Σε ορισμένες περιπτώσεις, το αποτέλεσμα είναι διφορούμενο. Για παράδειγμα, τι γίνεται με αυτή την έκφραση;
IsDate (“29-Feb-01”)
Η 29η Φεβρουαρίου 2001 δεν είναι έγκυρη ημερομηνία. Ωστόσο, αυτή η έκφραση επιστρέφει True επειδή η 1η Φεβρουαρίου 1929 (και η 2 Ιανουαρίου 1929) είναι έγκυρες ημερομηνίες. Και το ίδιο και οι ίδιες ημερομηνίες το 2029.
Μια αναζήτηση για τεκμηρίωση IsDate ήταν κενή. Με βάση τη δοκιμή, το IsDate δέχεται οποιοδήποτε από τα ακόλουθα ως διαχωριστικούς χαρακτήρες: μια κάθετο (/), μια παύλα (-), ένα κόμμα (,), μια τελεία (.) και ένα κενό.
Επομένως, όλες οι παρακάτω εκφράσεις επιστρέφουν True:
IsDate ("5.1")
IsDate ("30 6")
IsDate ("30,6")
IsDate ("1/2")
Αλλά υπάρχει αυτή η ανωμαλία: Οι ακόλουθες εκφράσεις επιστρέφουν True:
IsDate ("5.1.5")
IsDate (“5.1.05”)
Ωστόσο, ρητά, αυτή η έκφραση επιστρέφει False:
IsDate (“5.1.2005”)
Ας υποθέσουμε ότι δημιουργήσατε ένα UserForm με ένα InputBox όπου ο χρήστης εισάγει μια ημερομηνία. Θα πρέπει να είναι σαφές ότι η χρήση IsDate για την επικύρωση της καταχώρησης δεν είναι πολύ αξιόπιστη.
Τα πράγματα γίνονται ακόμη πιο μπερδεμένα όταν συνειδητοποιείτε ότι το IsDate καλύπτει επίσης τιμές χρόνου. (Δεν υπάρχει αντίστοιχη συνάρτηση IsTime.) Έτσι, οι παρακάτω εκφράσεις επιστρέφουν όλες True:
IsDate (“4:45”)
IsDate ("4.45")
IsDate ("4 45")
IsDate ("4/45")
IsDate (“23:59”)
Αυτές οι εκφράσεις επιστρέφουν False:
IsDate (“4:60”)
IsDate ("24.45")
Είναι σημαντικό να επισημάνουμε ότι το IsDate δεν εμφανίζει όλες αυτές τις ιδιορρυθμίες όταν περνάτε ένα όρισμα Range. Για παράδειγμα:
IsDate (Εύρος ("A1"))
Φαίνεται ότι το IsDate είναι απολύτως αξιόπιστο στον εντοπισμό κελιών που περιέχουν μια ημερομηνία ή μια ώρα. Δεν προσδιορίζει, για παράδειγμα, ένα κελί που περιέχει το 5.1 ως ημερομηνία. Εάν ο κώδικάς σας πρέπει να καθορίσει εάν μια συμβολοσειρά μπορεί να ερμηνευτεί ως ημερομηνία, η καλύτερη λύση είναι να τοποθετήσετε αυτήν τη συμβολοσειρά σε ένα κελί και, στη συνέχεια, να γράψετε κώδικα για να ελέγξετε τα περιεχόμενα του κελιού.