Πόσο συχνά λαμβάνουμε ημερομηνίες σε υπολογιστικά φύλλα που μας παρέχονται ως 12.26.2016 ή 26/12/2016 (μορφή ΗΒ), μόνο για να ενημερωθούμε ότι η ημερομηνία είναι άκυρη ή δεν υπάρχει μήνας 26; Αυτό το άρθρο εξετάζει τον καθορισμό ημερομηνιών με το VBA, χρησιμοποιώντας συναρτήσεις TRIM, LEFT, RIGHT και MID.
Το άρθρο προϋποθέτει ότι ο αναγνώστης έχει εμφανιστεί την κορδέλα προγραμματιστή και είναι εξοικειωμένος με τον επεξεργαστή VBA. Εάν όχι, παρακαλώ "Google Tab Developer Excel" ή "Excel Code Window".
Μπορείτε να κατεβάσετε το xlsm σε αυτήν την άσκηση εδώ.
Όχι το πρόβλημά μας!
Το καλύτερο μέρος για την επίλυση ενός προβλήματος είναι στην πηγή. Ωστόσο, κανένα ποσό πειθούς δεν μπορεί να πείσει το τμήμα μισθοδοσίας σε αυτήν την περίπτωση ότι η 12.26.1994 δεν είναι έγκυρη ημερομηνία (εκτός εάν έχει ρυθμιστεί έτσι στον Πίνακα Ελέγχου του υπολογιστή για ορισμένες χώρες της Ανατολικής Ευρώπης).
Στην πραγματικότητα μπορούμε να αποδείξουμε ότι δεν είναι αναγνώσιμο από μηχανή. Για παράδειγμα, προσθέτοντας 7 ημέρες σε μια ημερομηνία:
"=01.01.2017 + 7" = #VALUE. "=2017.01.01 + 7" = #VALUE.
ενώ…
"=2017-01-01 + 7" = 2017/01/08.
Ας υποθέσουμε ότι προτείνουν ότι δεν είναι δικό τους πρόβλημα.
Μορφές ημερομηνίας
Το πρώτο πράγμα που πρέπει να εξακριβώσουμε είναι αν η ημερομηνία είναι σε μορφή ΗΠΑ ή Διεθνής.
Το παράδειγμά μας καθιστά σαφές ότι εξετάζουμε τη χρήση των ΗΠΑ, δηλαδή το MDY και όχι τη διεθνή μορφή DMY.
Μόλις δημιουργήσουμε την πηγή, πρέπει να αλλάξουμε τις μορφές δεδομένων έτσι ώστε το Excel να τα κατανοήσει, είτε διεθνώς είτε στις ΗΠΑ.
Ο καλύτερος τρόπος για να γίνει αυτό είναι να αλλάξετε την ημερομηνία σε yyyymmdd, μια μορφή που δεν χρειάζεται προσόντα.
Η διαδικασία
Θα περιηγηθούμε σε κάθε σειρά στο έγγραφο, καλώντας μια συνάρτηση να «διορθώσει» την ημερομηνία σύμφωνα με τη χώρα προέλευσης. Μόλις διορθωθεί η ημερομηνία, θα υπολογίσουμε την ηλικία του υπαλλήλου.
Ο Κώδικας
Αντιγράψτε τον ακόλουθο κώδικα σε μια νέα ενότητα:
Option Explicit
Sub Main()
Dim strNewFormat As String
Dim strDate As String
Sheets("Main").Range("B4").Select
'Cycle through the sheet rows, using IDNumber as an anchor
'to prevent a premature halt caused by a blank date of birth
Do While ActiveCell > ""
If ActiveCell.Offset(0, 2) > "" Then
strDate = ActiveCell.Offset(0, 2)
'Remove leading or trailing spaces
strDate = Trim(strDate)
'Call the function
strNewFormat = ReformatDate(strDate, "USA")
'Write the result from the function ReformatDate to a new column
ActiveCell.Offset(0, 3) = strNewFormat
'Determine age by subtracting the previous column from today's date
ActiveCell.Offset(0, 4) = "=(NOW()-RC[-1])/365.25"
'Convert to intger, thus lopping off decimal places
ActiveCell.Offset(0, 4) = Int(ActiveCell.Offset(0, 4))
End If
Range("B" & ActiveCell.Row + 1).Select
Loop
End Sub
Function ReformatDate(sDate As String, sSource As String)
Dim yyyy, mm, dd As String
yyyy = Right(sDate, 4)
If sSource = "USA" Then
mm = Left(sDate, 2)
dd = Mid(sDate, 4, 2)
Else
mm = Mid(sDate, 4, 2)
dd = Left(sDate, 2)
End If
ReformatDate = yyyy & "-" & mm & "-" & dd
End Function
Προσθέστε ένα κουμπί στη φόρμα σας και εκχωρήστε το στο Sub Main.
Ανακοπή
Πριν προσθέσετε πάρα πολύ περίπλοκο κώδικα στη λειτουργική σας μονάδα, λάβετε υπόψη ότι το Excel δεν είναι πάντα σταθερό στην ανάπτυξη σημαντικών εφαρμογών και συχνά δεν είναι σε θέση να ανακτήσει τον ίδιο τον κατεστραμμένο κώδικα. Το αποτέλεσμα θα μπορούσε να είναι η καταστροφή του μοναδικού αντιγράφου σας, καθώς η διαφθορά συμβαίνει στο "Αποθήκευση".
Δημιουργήστε αντίγραφα ασφαλείας συχνά και χρησιμοποιήστε ένα εργαλείο για να το διορθώσετε Διαφθορά αρχείου Excel.
Εισαγωγή συγγραφέα:
Ο Felix Hooker είναι ειδικός στην ανάκτηση δεδομένων DataNumen, Inc., η οποία είναι ο παγκόσμιος ηγέτης στις τεχνολογίες ανάκτησης δεδομένων, συμπεριλαμβανομένων επισκευή rar καταστροφή αρχείων και sql προϊόντα λογισμικού ανάκτησης. Για περισσότερες πληροφορίες επισκεφθείτε www.datanumen.com
