如何修改没有循环的单元格范围

时间:2019-05-15 17:03:06

标签: arrays excel vba loops

我有一个巨大的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

谢谢!

4 个答案:

答案 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