Kuidas VBA-ga Exceli töölehel kuupäevi parandada

Kui sageli kuvatakse meile esitatud arvutustabelites kuupäevad 12.26.2016 või 26 (Ühendkuningriigi vormingus), kuid meile öeldakse, et kuupäev on kehtetu või 12. kuud pole? See artikkel uurib kuupäevade fikseerimist VBA-ga, kasutades funktsioone TRIM, LEFT, RIGHT ja MID.

Artiklis eeldatakse, et lugejal on kuvatud arendaja lint ja ta tunneb VBA redaktorit. Kui ei, siis kasutage Google'i „Exceli arendaja vahekaarti” või „Exceli koodi akent”.

Selle harjutuse xlsm-i saab alla laadida siin.

Pole meie probleem!

Kuupäevani 7 päeva lisamineParim koht probleemi lahendamiseks on selle allikas. Kuid mitte mingisugune veenmine ei suuda sel juhul palgaarvestusosakonda veenda, et 12.26.1994 ei ole kehtiv kuupäev (kui pole mõne Ida-Euroopa riigi jaoks arvuti juhtpaneelil nii seadistatud).

Tegelikult võime tõestada, et see pole masinloetav. Näiteks kuupäevale 7 päeva lisamine:

"=01.01.2017 + 7" = #VALUE. 

"=2017.01.01 + 7" = #VALUE.

kusjuures…

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

Oletame, et nad arvavad, et see pole nende probleem.

Kuupäeva vormingud

Esimese asjana peame kindlaks tegema, kas kuupäev on USA või rahvusvahelises formaadis.Kuupäev USA formaadis

Meie näide teeb selgeks, et vaatleme USA kasutamist, st MDY-d, mitte rahvusvahelist DMY-vormingut.

Kui oleme allika kindlaks teinud, peame muutma andmevorminguid, et Excel saaks neist aru, olgu see siis rahvusvaheliselt või USA-s.

Parim viis selleks on muuta kuupäevaks yyyymmdd, mis ei vaja täpsustamist.

Process

Vaatame dokumendis iga rida läbi, kutsudes välja funktsiooni, mis võimaldab kuupäeva "parandada" vastavalt lähteriigile. Kui kuupäev on parandatud, arvutame välja Töötaja vanuse.

Kood

Kopeerige järgmine kood uude moodulisse:

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

Lisage oma vormile nupp ja määrake see Sub Mainile.

Hoiatus

Enne kui lisate oma moodulile liiga palju keerukat koodi, pidage meeles, et Excel ei ole alati suurte rakenduste arenduses stabiilne ega suuda sageli kahjustatud koodi ise taastada. Tulemuseks võib olla teie ainsa eksemplari riknemine, kuna riknemine toimub menüüs „Salvesta”.

Varundage sageli ja kasutage parandamiseks tööriista Exceli faili rikkumine.

Autori sissejuhatus:

Felix Hooker on andmete taastamise ekspert DataNumen, Inc., mis on maailmas juhtiv andmete taastamise tehnoloogiate, sealhulgas remont rar faili korruptsioon ja SQL-i taastamise tarkvaratooted. Lisateabe saamiseks külastage www.datanumenCom

Kommentaarid on suletud.