VBA 使用 DateSerial 在范围内的空白单元格处停止

VBA using DateSerial stops at blank cell in range

我有一些 vba 代码可以计算 6 列并将日期格式化为从 yyyymmdd 到 mm/dd/yyyy。该代码工作正常,直到它在该范围内找到一个空白单元格,然后我得到一个类型 13 运行 时间错误。调试器突出显示 DateSerial 行,所以我认为这就是我的问题所在。

有什么想法吗?

Sub Convert_Date()
    Dim c As Range
    Application.ScreenUpdating = False
    For Each c In Range("AC2:AC" & Cells(Rows.Count, "AC").End(xlUp).Row)
        c.Value = DateSerial(Left(c.Value, 4), Mid(c.Value, 5, 2), Right(c.Value, 2))
        c.NumberFormat = "mm/dd/yyyy"
    Next
    Application.ScreenUpdating = False

     Dim b As Range
    Application.ScreenUpdating = False
    For Each b In Range("AL2:AL" & Cells(Rows.Count, "AL").End(xlUp).Row)
        b.Value = DateSerial(Left(b.Value, 4), Mid(b.Value, 5, 2), Right(b.Value, 2))
        b.NumberFormat = "mm/dd/yyyy"
    Next
    Application.ScreenUpdating = False

      Dim a As Range
    Application.ScreenUpdating = False
    For Each a In Range("AQ2:AQ" & Cells(Rows.Count, "A").End(xlUp).Row)
        a.Value = DateSerial(Left(a.Value, 4), Mid(a.Value, 5, 2), Right(a.Value, 2))
        a.NumberFormat = "mm/yyyy"
    Next
    Application.ScreenUpdating = False

    Dim d As Range
    Application.ScreenUpdating = False
    For Each d In Range("AR2:AR" & Cells(Rows.Count, "A").End(xlUp).Row)
        d.Value = DateSerial(Left(d.Value, 4), Mid(d.Value, 5, 2), Right(d.Value, 2))
        d.NumberFormat = "mm/yyyy"
    Next
    Application.ScreenUpdating = False

    Dim e As Range
    Application.ScreenUpdating = False
    For Each e In Range("AT2:AT" & Cells(Rows.Count, "A").End(xlUp).Row)
        e.Value = DateSerial(Left(e.Value, 4), Mid(e.Value, 5, 2), Right(e.Value, 2))
        e.NumberFormat = "mm/yyyy"
    Next
    Application.ScreenUpdating = False

     Dim f As Range
    Application.ScreenUpdating = False
    For Each f In Range("AU2:AU" & Cells(Rows.Count, "A").End(xlUp).Row)
        f.Value = DateSerial(Left(f.Value, 4), Mid(f.Value, 5, 2), Right(f.Value, 2))
        f.NumberFormat = "mm/yyyy"
    Next
    Application.ScreenUpdating = False


End Sub

尝试检查每个条件,值是否不为空。像这样:

If Not IsEmpty(c) then
    c.Value = DateSerial(Left(c.Value, 4), Mid(c.Value, 5, 2), Right(c.Value, 2))
    c.NumberFormat = "mm/dd/yyyy"
End If

一旦深入 VBA,您就可以开始使用这样的函数:

Sub Convert_Date()

    Application.ScreenUpdating = False

    RockAndRoll "AC2:AC", "AC"
    Call RockAndRoll ("AR2:AR", "A")
    RockAndRoll "AL2:AL", "AC"
    'RockAndRoll etc...
    Application.ScreenUpdating = True

End Sub

Public Sub RockAndRoll(myLeft As String, myRight As String)

    Dim a As Range

    With ActiveSheet
        For Each a In .Range(myLeft & .Cells(.Rows.Count, myRight).End(xlUp).Row)
            If Not IsEmpty(a) Then
                a.value = DateSerial(Left(a.value, 4), Mid(a.value, 5, 2), Right(a.value, 2))
                a.NumberFormat = "mm/yyyy"
            End If
        Next
    End With

End Sub

所以你不应该一遍又一遍地重复代码。