Bizə 12.26.2016 və ya 26/12/2016 (Böyük Britaniya formatı) kimi təqdim olunan cədvəllərdə tarixləri nə qədər tez-tez əldə edirik, yalnız tarixin etibarsız olduğunu və ya 26-cı ayın olmadığını bildirmək üçün? Bu məqalə TRIM, LEFT, RIGHT və MID funksiyalarından istifadə edərək VBA ilə tarixlərin təyin edilməsini araşdırır.
Məqalə oxucunun Tərtibatçı lentinin göstərildiyini və VBA Redaktoru ilə tanış olduğunu güman edir. Əgər belə deyilsə, lütfən Google “Excel Developer Tab” və ya “Excel Code Window”.
Bu məşqdəki xlsm endirilə bilər burada.
Problemimiz Deyil!

Əslində bunun maşınla oxuna bilmədiyini sübut edə bilərik. Məsələn, tarixə 7 gün əlavə etməklə:
"=01.01.2017 + 7" = #VALUE. "=2017.01.01 + 7" = #VALUE.
Halbuki…
"=2017-01-01 + 7" = 2017/01/08.
Fərz edək ki, onlar bu onların problemi olmadığını deyirlər.
Tarix Formatları
Təsdiq etməli olduğumuz ilk şey, tarixin ABŞ və ya Beynəlxalq formatda olmasıdır.
Nümunəmiz aydın olur ki, biz ABŞ-dan istifadəyə, yəni beynəlxalq DMY formatına deyil, MDY-yə baxırıq.
Mənbəni təyin etdikdən sonra, Excel-in beynəlxalq və ya ABŞ-da onlara məna verə bilməsi üçün məlumat formatlarını dəyişdirməliyik.
Bunun ən yaxşı yolu tarixi yyyymmdd formatına dəyişdirməkdir, bu format heç bir ixtisas tələb etmir.
Proses
Mənbə ölkəsinə görə tarixi “düzəltmək” funksiyasını çağıraraq, sənəddəki hər bir sətirdən keçəcəyik. Tarix düzəldildikdən sonra biz İşçinin yaşını hesablayacağıq.
Kod
Aşağıdakı kodu yeni modula kopyalayın:
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
Formunuza düymə əlavə edin və onu Alt Əsasa təyin edin.
Caveat
Modulunuza həddən artıq mürəkkəb kod əlavə etməzdən əvvəl nəzərə alın ki, Excel əsas proqram inkişafında həmişə sabit deyil və çox vaxt zədələnmiş kodu özü bərpa edə bilmir. Nəticə sizin yeganə nüsxənizin pozulması ola bilər, çünki korrupsiya “Saxla”da baş verir.
Tez-tez ehtiyat nüsxəsini çıxarın və düzəltmək üçün alətdən istifadə edin Excel faylının pozulması.
Müəllif Giriş:
Feliks Hooker məlumatların bərpası üzrə mütəxəssisdir DataNumendaxil olmaqla məlumatların bərpası texnologiyaları üzrə dünya lideri olan , Inc təmir rar fayl pozulması və sql bərpa proqram məhsulları. Ətraflı məlumat üçün ziyarət edin www.datanumen.com
