Որքա՞ն հաճախ ենք մեզ տրամադրում աղյուսակներում ամսաթվերը 12.26.2016 թ., Կամ 26/12/2016 թ. (Մեծ Բրիտանիայի ձևաչափ), որպեսզի միայն տեղեկացնեն, որ ամսաթիվն անվավեր է կամ 26 ամիս չկա: Այս հոդվածը ուսումնասիրում է VBA- ի հետ ամսաթվերը ֆիքսելը, օգտագործելով TRIM, LEFT, RIGHT և MID գործառույթները:
Հոդվածը ենթադրում է, որ ընթերցողը ցուցադրում է erրագրավորողի ժապավենը և ծանոթ է VBA խմբագրին: Եթե ոչ, խնդրում ենք Google- ի «Excel Developer Tab» կամ «Excel Code Window»:
Այս վարժության xlsm- ը կարելի է ներբեռնել այստեղ.
Մեր խնդիրը չէ:
Խնդիրը լուծելու լավագույն տեղը աղբյուրն է: Այնուամենայնիվ, ոչ մի համոզում չի կարող այս դեպքում աշխատավարձերի բաժին համոզել, որ 12.26.1994 թ. XNUMX թվականը վավեր ամսաթիվ չէ (եթե դա արևելաեվրոպական որոշ երկրների համար համակարգչի կառավարման վահանակում չի կազմված):
Իրականում մենք կարող ենք ապացուցել, որ դա մեքենայական ընթերցանություն չունի: Օրինակ ՝ ամսաթվին 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 ֆայլի կոռուպցիա.
Հեղինակի ներածություն.
Ֆելիքս Հուքերը տվյալների վերականգման փորձագետ է DataNumen, Inc., որը տվյալների վերականգման տեխնոլոգիաների համաշխարհային առաջատարն է, այդ թվում նորոգում rar ներկայացնել կոռուպցիա և sql վերականգնման ծրագրային արտադրանքները: Լրացուցիչ տեղեկությունների համար այցելեք www.datanumen.com
