0

我正在使用以下 vba 代码将文本字符串日期更改为 excel 中的实际日期,以便我可以将其用于逻辑比较等。

问题是我需要它来处理大约 4000 行并每周更新它,而且这段代码非常慢。

Sub Datechange()

Dim c As Range
    For Each c In Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)
        c.Value = CDate(c.Value)
    Next c

End Sub

有没有其他方法可以让我更快地做同样的事情?我假设它如此缓慢的部分原因是因为选择单个单元格和一遍又一遍地处理代码会产生开销,但我不知道如何以其他方式做到这一点?

底部的一些行也包含“未指定”字样,当代码到达这些单元格时,它会中断

运行时错误“13”:类型不匹配

有没有办法阻止这种情况的发生,以便以下代码可以完成?

4

2 回答 2

6

第一步是:

  • 关闭屏幕更新
  • 关闭计算
  • 一次读取和写入范围

它可能看起来像下面的代码 - 最好包含一个错误处理程序,以避免在关闭屏幕更新或更改计算模式的情况下离开电子表格:

Sub Datechange()

    On Error GoTo error_handler

    Dim initialMode As Long

    initialMode = Application.Calculation 'save calculation mode
    Application.Calculation = xlCalculationManual 'turn calculation to manual
    Application.ScreenUpdating = False 'turn off screen updating

    Dim data As Variant
    Dim i As Long

    'copy range to an array
    data = Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)

    For i = LBound(data, 1) To UBound(data, 1)
        'modify the array if the value looks like a date, else skip it
        If IsDate(data(i, 1)) Then data(i, 1) = CDate(data(i, 1))
    Next i

    'copy array back to range
    Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row) = data

exit_door:
    Application.ScreenUpdating = True 'turn screen updating on
    Application.Calculation = initialMode 'restore original calculation mode

    Exit Sub

error_handler:
    'if there is an error, let the user know
    MsgBox "Error encountered on line " & i + 1 & ": " & Err.Description
    Resume exit_door 'don't forget the exit door to restore the calculation mode
End Sub
于 2013-01-15T10:50:14.393 回答
0

最好在一次“拉”中将值放入数组中,对数组进行操作并将其写回。这将规避昂贵的范围操作。

dim c as range
set c = Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row)

dim ArrValue() as Variant

set ArrValue = c.value

下一步:遍历该数组,然后写回:

c.value = Arrvalue

我没有时间测试代码,所以请自己更正,对不起。

于 2013-01-15T10:41:39.647 回答