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!
Parim 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.
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
