Excel-简单循环的VBA执行速度较慢



我只想确保列中的文本变为大写。

为此,我使用以下代码

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秒。有什么想法吗?

这将把值复制到一个数组中,执行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

单元格之间的迭代需要时间。使用数组并在最后丢弃结果,迭代会更快,每次迭代中的写入会使代码更慢。但Evaluate更紧凑,具有类似的效率:

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

最新更新