我只想确保列中的文本变为大写。
为此,我使用以下代码
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 & ")")