如何使用 VBA 修復 Excel 工作表中的日期

立即分享:

我們多久會在提供給我們的電子表格中獲取日期為 12.26.2016 或 26/12/2016(英國格式),卻被告知日期無效或沒有第 26 個月? 本文探討了使用 VBA 修復日期,使用 TRIM、LEFT、RIGHT 和 MID 函數。

本文假定讀者已顯示“開發人員”功能區,並且熟悉VBA編輯器。 如果沒有,請使用Google“ Excel開發人員標籤”或“ Excel代碼窗口”。

可以下載本練習中的xlsm 此處.

不是我們的問題!

將 7 天添加到日期解決問題的最佳地點是源頭。 然而,在這種情況下,再多的說服也無法說服工資部門 12.26.1994 不是一個有效日期(除非在某些東歐國家的計算機控制面板中如此配置)。

事實上,我們可以證明它不是機器可讀的。 例如,給一個日期加上 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文件損壞.

作者簡介:

Felix Hooker是的數據恢復專家 DataNumen,Inc.是數據恢復技術的全球領導者,包括 修復 rar 文件損壞 和sql恢復軟件產品。 欲了解更多信息,請訪問 萬維網。datanumen.COM

立即分享:

評論被關閉。