Jak naprawić daty w arkuszu programu Excel za pomocą VBA

Podziel się teraz:

Jak często otrzymujemy daty w arkuszach kalkulacyjnych dostarczonych nam 12.26.2016 lub 26 (format brytyjski), tylko po to, aby dowiedzieć się, że data jest nieprawidłowa lub nie ma 12 miesiąca? W tym artykule omówiono ustalanie dat w VBA przy użyciu funkcji TRIM, LEFT, RIGHT i MID.

W artykule założono, że czytelnik ma wyświetloną wstążkę programisty i zna edytor VBA. Jeśli nie, skorzystaj z Google „Excel Developer Tab” lub „Excel Code Window”.

Plik XLSM w tym ćwiczeniu można pobrać w tym miejscu.

To nie nasz problem!

Dodawanie 7 dni do datyNajlepszym miejscem do rozwiązania problemu jest jego źródło. Jednak żadna ilość perswazji nie może przekonać działu płac w tym przypadku, że 12.26.1994 nie jest poprawną datą (chyba że tak skonfigurowano w Panelu sterowania komputera dla niektórych krajów Europy Wschodniej).

W rzeczywistości możemy udowodnić, że nie nadaje się do odczytu maszynowego. Na przykład dodanie 7 dni do daty:

"=01.01.2017 + 7" = #VALUE. 

"=2017.01.01 + 7" = #VALUE.

natomiast…

"=2017-01-01 + 7" = 2017/01/08.

Załóżmy, że sugerują, że to nie ich problem.

Formaty dat

Pierwszą rzeczą, którą musimy ustalić, jest to, czy data jest w formacie amerykańskim, czy międzynarodowym.Data w formacie amerykańskim

Nasz przykład jasno pokazuje, że patrzymy na użycie w USA, tj. MDY zamiast międzynarodowego formatu DMY.

Po ustaleniu źródła musimy zmienić formaty danych, aby Excel mógł je zrozumieć, czy to na arenie międzynarodowej, czy w USA.

Najlepszym sposobem na to jest zmiana daty na format rrrrmmdd, który nie wymaga żadnych kwalifikacji.

Proces

Przejdziemy przez każdy wiersz dokumentu, wywołując funkcję „poprawiającą” datę według kraju źródłowego. Po poprawieniu daty obliczymy wiek Pracownika.

Kod

Skopiuj następujący kod do nowego modułu:

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

Dodaj przycisk do formularza i przypisz go do Sub Main.

Zastrzeżenie

Przed dodaniem zbyt złożonego kodu do modułu należy pamiętać, że program Excel nie zawsze jest stabilny przy tworzeniu dużych aplikacji i często nie jest w stanie samodzielnie odzyskać uszkodzonego kodu. Rezultatem może być uszkodzenie Twojej jedynej kopii, ponieważ uszkodzenie ma miejsce w „Zapisz”.

Często twórz kopie zapasowe i korzystaj z narzędzi do naprawy Uszkodzenie pliku Excel.

Wprowadzenie autora:

Felix Hooker jest ekspertem w dziedzinie odzyskiwania danych w DataNumen, Inc., która jest światowym liderem w technologiach odzyskiwania danych, w tym naprawa rar uszkodzenie pliku i oprogramowanie do odzyskiwania sql. po więcej informacji odwiedź www.datanumen.com

Podziel się teraz:

Możliwość dodawania komentarzy nie jest dostępna.