12.26.2016 оны 26-р сарын 12-ны өдөр буюу 2016 оны 26-р сарын XNUMX-ны өдөр (Их Британийн формат) -аар бидэнд ирүүлсэн хүснэгтэнд огноо хэдэн удаа ирдэг вэ, зөвхөн огноо хүчин төгөлдөр бус эсвэл XNUMX-р сар байхгүй гэж хэлдэг вэ? Энэ нийтлэлд TRIM, LEFT, RIGHT, MID функцуудыг ашиглан VBA-тай тохируулах огноог судалж үзсэн болно.
Нийтлэл нь уншигч нь Developer туузыг харуулсан бөгөөд VBA редакторыг сайн мэддэг гэж үзэв. Хэрэв үгүй бол Google-ийн "Excel Developer Tab" эсвэл "Excel Code Window" -г оруулна уу.
Энэ дасгалын xlsm файлыг татаж авах боломжтой энд.
Бидний асуудал биш!
Асуудлыг шийдэх хамгийн тохиромжтой газар бол эх сурвалж юм. Гэсэн хэдий ч энэ тохиолдолд цалингийн хэлтэсийг 12.26.1994 он хүчин төгөлдөр бус өдөр гэдэгт итгэх ямар ч үнэмшил байж чадахгүй (Зүүн Европын зарим орнуудын хувьд компьютерийн Хяналтын самбарт тохируулаагүй бол).
Үнэндээ бид үүнийг машинаар унших боломжгүй гэдгийг баталж чадна. Жишээлбэл, болзоонд 7 хоног нэмэх:
"=01.01.2017 + 7" = #VALUE. "=2017.01.01 + 7" = #VALUE.
харин ...
"=2017-01-01 + 7" = 2017/01/08.
Энэ нь тэдний асуудал биш гэж тэд үзэж байна гэж үзье.
Огнооны формат
Хамгийн түрүүнд он сар өдөр нь АНУ эсвэл Олон улсын форматтай эсэх нь тодорхой болох ёстой.
Бидний жишээ нь АНУ-ын хэрэглээ, өөрөөр хэлбэл олон улсын формат DMY гэхээсээ илүү MDY-г судалж байгааг тодорхой харуулж байна.
Эх сурвалжаа байгуулсны дараа бид өгөгдлийн форматыг өөрчлөх хэрэгтэй бөгөөд ингэснээр 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-д хуваарил.
Caveat
Модульд хэт их нарийн төвөгтэй код нэмэхээс өмнө Excel програмын томоохон хөгжүүлэлтэнд тэр бүр тогтвортой ажилладаггүй бөгөөд эвдэрсэн кодыг өөрөө сэргээх боломжгүй байдаг. Үүний үр дүнд авлига нь "Хадгалах" -д тохиолддог тул таны цорын ганц хуулбарын авлига байж болзошгүй юм.
Нөөцлөлтийг байнга хийж, засах хэрэгслийг ашиглаарай Excel файлын авлига.
Зохиогчийн танилцуулга:
Феликс Хүүкер бол мэдээлэл сэргээх мэргэжилтэн юм DataNumen, Үүнд мэдээлэл сэргээх технологиор дэлхийд тэргүүлэгч, Inc. засвар rar авлигын хэрэг хавсаргах болон sql сэргээх програм хангамжийн бүтээгдэхүүнүүд. Дэлгэрэнгүй мэдээллийг авна уу WWW.datanumen.com
