【问题标题】:Excel - slow VBA execution of simple loopExcel - 简单循环的慢速 VBA 执行
【发布时间】:2022-02-21 04:30:59
【问题描述】:

我只是想确保将列内的文本更改为大写。

为此,我使用以下代码

Private Sub Worksheet_Activate()

Dim cell As Range

For Each cell In Range("$G$6:$G$200")
    cell.Value = UCase(cell.Value)
Next cell

End Sub

在这种情况下,循环运行了大约 200 个单元,但它已经需要大约 15 秒才能执行。有什么想法吗?

【问题讨论】:

标签: excel vba performance


【解决方案1】:

这会将值复制到一个数组中,执行 ucase 并将其写回。通过这种方式,您可以减少对工作表的读写访问次数,这通常会减慢代码速度,因为每次写入访问都可能触发事件、重新计算或导致屏幕更新。

Private Sub Worksheet_Activate()

    On Error GoTo EH
    Application.EnableEvents = False
    
    Dim rg As Range
    Set rg = Range("$G$6:$G$200")
    
    Dim vdat As Variant
    vdat = rg.Value
    
    Dim i As Long, j As Long
    For i = LBound(vdat, 1) To UBound(vdat, 1)
        For j = LBound(vdat, 2) To UBound(vdat, 2)
            vdat(i, j) = UCase(vdat(i, j))
        Next
    Next
    
    rg.Value = vdat

EH:
    Application.EnableEvents = True
    
End Sub

【讨论】:

  • 谢谢。使用数组进行操作解决了这个问题。只是禁用屏幕更新或事件并没有太大帮助。
【解决方案2】:

在单元格之间迭代需要一些时间。使用数组并在最后删除结果,迭代会快得多,并且在每次迭代中写入会使代码变慢。但是Evaluate 更紧凑,效率也差不多:

  Dim rng As Range: Set rng = Range("$G$6:$G$200")
  rng.value = Evaluate("Upper(" & rng.Address & ")")

【讨论】:

  • Evaluate 有一些怪癖。在此示例中,如果打开 RC 表示法,它将失败
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2017-04-01
  • 2021-08-19
  • 2018-08-02
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多