我有一个巨大的Excel模板,它存在性能问题。我想优化用于修改单元格的VBA代码,使其更像是“一次全部”的方法。我有几个使用循环修改值的基本功能。这是一个示例:
Dim aCell as Range
For Each aCell In Range("A1:A9999").Cells
'appends prefix to value of each cell
aCell.Value = "CC_" & aCell.Value
Next aCell
虽然可行,但它的缺点是它会导致多次重新计算和更新,从而使模板变慢。我熟悉打开和关闭计算/屏幕更新的功能,但是出于我不愿讨论的原因,这不是一种选择。
下面的代码不能起作用,但这是我正在寻找的方法。有没有办法使用数组或我不认为的其他工具进行此类更改,这将使模板计算更新最小化?
Range("A1:A9999").Value = "CC_" & Range("A1:A9999").Value
谢谢!
答案 0 :(得分:2)
读取/写入工作表需要很多时间。在VBA阵列中进行修改,然后将其写回。
"remote: HTTP Basic: Access denied"
答案 1 :(得分:1)
您可以临时创建一个充满功能的列,然后将这些值粘贴到列A的值上:
Range("XFD1:xfd9999").Formula = "=""CC_""&A1"
Calculate
Range("A1:a9999").Value = Range("XFD1:XFD8").Value
Range("XFD1:XFD9999").ClearContents
我在这里假设您没有将XFD列用于其他任何事情。如果是这样,您可以为此使用其他列。
答案 2 :(得分:1)
FWIW,您可以像这样使用Evaluate
进行无循环操作:
Sub addText()
With Range("A1:A9999")
.Value2 = .Worksheet.Evaluate("INDEX(""CC_""&" & .Address & ",)")
End With
End Sub
答案 3 :(得分:0)
我正在重新研究这个问题(试图使其更快),现在我有了更好的理解,我建议使用下面显示的方法。接受的答案是硬编码为一列的,这是我的示例所要求的,但是下面的方法更加动态。
Sub sampleArraySheetEdit()
Dim aRange As Range: Set aRange = Range("A1:B9999") ' or whatever your range is...
Dim vRng() As Variant: vRng = aRange
Dim r As Long, c As Long
For r = LBound(vRng, 1) To UBound(vRng, 1) 'this ensures all cells always accounted for
For c = LBound(vRng, 2) To UBound(vRng, 2)
'perform you operation here....
vRng(r, c) = "CC_" & vRng(r, c)
Next c
Next r
aRange = vRng
End Sub