Excel-ийн ажлын хуудсан дахь огноог VBA ашиглан хэрхэн засах вэ?

Одоо хуваалцах:

12.26.2016 оны 26-р сарын 12-ны өдөр буюу 2016 оны 26-р сарын XNUMX-ны өдөр (Их Британийн формат) -аар бидэнд ирүүлсэн хүснэгтэнд огноо хэдэн удаа ирдэг вэ, зөвхөн огноо хүчин төгөлдөр бус эсвэл XNUMX-р сар байхгүй гэж хэлдэг вэ? Энэ нийтлэлд TRIM, LEFT, RIGHT, MID функцуудыг ашиглан VBA-тай тохируулах огноог судалж үзсэн болно.

Нийтлэл нь уншигч нь Developer туузыг харуулсан бөгөөд VBA редакторыг сайн мэддэг гэж үзэв. Хэрэв үгүй ​​бол Google-ийн "Excel Developer Tab" эсвэл "Excel Code Window" -г оруулна уу.

Энэ дасгалын xlsm файлыг татаж авах боломжтой энд.

Бидний асуудал биш!

Болзоонд 7 хоног нэмж байнаАсуудлыг шийдэх хамгийн тохиромжтой газар бол эх сурвалж юм. Гэсэн хэдий ч энэ тохиолдолд цалингийн хэлтэсийг 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

Одоо хуваалцах:

Тайлбарууд нь хаалттай байна.