Hvordan fikse datoer i Excel-regnearket med VBA

Hvor ofte får vi datoer i regneark som leveres til oss som 12.26.2016, eller 26 (britisk format), bare for å bli fortalt at datoen er ugyldig eller at det ikke er noen måned 12? Denne artikkelen utforsker å fikse datoer med VBA, ved å bruke funksjonene TRIM, LEFT, RIGHT og MID.

Artikkelen forutsetter at leseren har utviklerbåndet vist og er kjent med VBA Editor. Hvis ikke, vennligst Google "Excel Developer Tab" eller "Excel Code Window".

xlsm i denne øvelsen kan lastes ned her..

Ikke vårt problem!

Legger til 7 dager til en datoDet beste stedet å løse et problem er ved kilden. Men ingen grad av overtalelse kan overbevise lønnsavdelingen i dette tilfellet om at 12.26.1994 ikke er en gyldig dato (med mindre den er konfigurert i datamaskinens kontrollpanel for noen østeuropeiske land).

Faktisk kan vi bevise at den ikke er maskinlesbar. For eksempel å legge til 7 dager til en dato:

"=01.01.2017 + 7" = #VALUE. 

"=2017.01.01 + 7" = #VALUE.

mens …

"=2017-01-01 + 7" = 2017/01/08.

La oss anta at de antyder at det ikke er deres problem.

Datoformater

Det første vi må finne ut er om datoen er i USA eller internasjonalt format.Dato i USA-format

Vårt eksempel gjør det klart at vi ser på USA-bruk, dvs. MDY i stedet for internasjonalt format DMY.

Når vi har etablert kilden, må vi endre dataformatene slik at Excel kan gi mening om dem, enten det er internasjonalt eller i USA.

Den beste måten å gjøre dette på er å endre datoen til ååååmmdd, et format som ikke trenger noen kvalifisering.

Prosessen

Vi vil bla gjennom hver rad i dokumentet, og kaller en funksjon for å "korrigere" datoen i henhold til kildelandet. Når datoen er korrigert, vil vi beregne den ansattes alder.

Koden

Kopier følgende kode inn i en ny modul:

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

Legg til en knapp i skjemaet, og tilordne den til Sub Main.

Forbeholdet

Før du legger til for mye kompleks kode i modulen din, må du være oppmerksom på at Excel ikke alltid er stabil i større applikasjonsutvikling, og ofte ikke klarer å gjenopprette den skadede koden selv. Resultatet kan være korrupsjon av din eneste kopi siden korrupsjonen skjer i "Lagre".

Sikkerhetskopier ofte og bruk et verktøy for å fikse Excel-filkorrupsjon.

Forfatterintroduksjon:

Felix Hooker er en datagjenopprettingsekspert innen DataNumen, Inc., som er verdensledende innen datagjenopprettingsteknologier, inkludert reparasjon rar filkorrupsjon og sql-programvareprodukter. For mer informasjon besøk www.datanumen. Med

Kommentarer er stengt.