【问题标题】:How To Modify A Range of Cells Without a Loop如何在没有循环的情况下修改一系列单元格
【发布时间】:2019-10-02 21:27:49
【问题描述】:

我有一个存在性能问题的大型 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

谢谢!

【问题讨论】:

    标签: arrays excel vba loops


    【解决方案1】:

    我正在重新审视这个(试图让它更快),现在我有了更好的理解,我会推荐一种如下所示的方法。接受的答案是针对一列进行硬编码的,这是我提出的示例,但以下方法更具动态性。

    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
    

    【讨论】:

      【解决方案2】:

      从工作表读取/写入/写入需要花费大量时间。在 VBA 数组中进行修改,然后将其写回。

      Dim myRange As Range, myArr As Variant
      Set myRange = Range("A1:A9999")
      
      myArr = myRange
      
      For i = 1 To UBound(myArr, 1)
          myArr(i, 1) = "CC_" & myArr(i, 1)
      Next i
      
      myRange = myArr
      

      【讨论】:

      • 另一个可能加快速度的修改是动态设置myRange 以仅包含要处理的范围。
      • 是的,A1:A9999 的范围只是一个例子。感谢您的帮助。
      【解决方案3】:

      FWIW,您可以使用 Evaluate 像这样在没有循环的情况下执行此操作:

      Sub addText()
           With Range("A1:A9999")
              .Value2 = .Worksheet.Evaluate("INDEX(""CC_""&" & .Address & ",)")
          End With
      End Sub
      

      【讨论】:

      • 仅供参考 Evaluate("""C_"" & " & .Address) 没有 INDEX() 也可以正常工作
      • @TimWilliams 谢谢。 INDEX 是习惯的力量,因为许多函数需要一点强制才能返回值数组。
      【解决方案4】:

      您可以临时创建一个包含函数的列,然后将这些值粘贴到列 A 值上:

      Range("XFD1:xfd9999").Formula = "=""CC_""&A1"
      Calculate
      Range("A1:a9999").Value = Range("XFD1:XFD8").Value
      Range("XFD1:XFD9999").ClearContents
      

      我在这里假设您没有将 XFD 列用于其他任何事情。如果是,您可以为此目的使用不同的列。

      【讨论】:

      • 谢谢。我会给你打勾,但我应该指定“不使用辅助列”。
      • 谢谢。帮助列在之后消失了。没有人需要知道。
      • 我不同意人们不知道。滚动条可能会在 usedRange 扩展到最后一列的假设下起作用。人们肯定会注意到这样的事情。
      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2017-10-25
      • 2017-05-12
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多