在VBA中跨全等范围添加单元格值的最有效方法?
我需要对任意(但相同)大小的两个范围的值求和。input1中的A1与input2中的A1求和,然后输出到输出单元格中的A1,等等。我需要的是结束值,而不是公式或链接在VBA中跨全等范围添加单元格值的最有效方法?,vba,excel,Vba,Excel,我需要对任意(但相同)大小的两个范围的值求和。input1中的A1与input2中的A1求和,然后输出到输出单元格中的A1,等等。我需要的是结束值,而不是公式或链接 使用循环这比预期的要慢得多(目前为15分钟以上)。手动操作不需要那么长时间。也许我可以预先制作一些隐藏的工作表,填充一个加法公式,然后在VBA中基本上模仿人类手动操作的方式,但感觉很落后。跨多个工作表进行复制粘贴应该不会更有效率。同上链接摆弄。也许把它们读入数组?但输出需要是常规工作表单元格,而不是数组 pnuts的方法当然是最好的
使用循环这比预期的要慢得多(目前为15分钟以上)。手动操作不需要那么长时间。也许我可以预先制作一些隐藏的工作表,填充一个加法公式,然后在VBA中基本上模仿人类手动操作的方式,但感觉很落后。跨多个工作表进行复制粘贴应该不会更有效率。同上链接摆弄。也许把它们读入数组?但输出需要是常规工作表单元格,而不是数组 pnuts的方法当然是最好的 通常,在单元上循环通常是性能方面最差的选择。它用120万个电池测试了几种方法,结果如下:
Looping each cell: 145,04s
Formula and store value: 6,89s
Formula and PasteSpecial Values: 3,44s
2x PasteSpecial Values&Add (pnuts approach): 0,72s
以下是我在任务中使用的代码-使用方法M3:
Option Explicit
Private Sub TimeMethods()
Dim strAddress As String
Dim dblStart As Double
Application.Calculation = xlCalculationManual
strAddress = "A1:X50000"
ClearRange strAddress, Sheet3
dblStart = Timer
M0 strAddress, Sheet1, Sheet2, Sheet3
Debug.Print "Looping each cell: " & Timer - dblStart
ClearRange strAddress, Sheet3
dblStart = Timer
M1 strAddress, Sheet1, Sheet2, Sheet3
Debug.Print "Formula and store value: " & Timer - dblStart
ClearRange strAddress, Sheet3
dblStart = Timer
M2 strAddress, Sheet1, Sheet2, Sheet3
Debug.Print "Formula and PasteSpecial Values: " & Timer - dblStart
ClearRange strAddress, Sheet3
dblStart = Timer
M3 strAddress, Sheet1, Sheet2, Sheet3
Debug.Print "2x PasteSpecial Values&Add: " & Timer - dblStart
Application.Calculation = xlCalculationAutomatic
End Sub
Sub M0(strAddress As String, wsInput1 As Worksheet, wsInput2 As Worksheet, wsOutput As Worksheet)
Dim rngTemp As Range
Dim intCol As Integer, lngRow As Long
Set rngTemp = wsInput1.Range(strAddress)
For lngRow = rngTemp.Row To rngTemp.Row + rngTemp.Rows.Count
For intCol = rngTemp.Column To rngTemp.Column + rngTemp.Columns.Count
wsOutput.Cells(lngRow, intCol) = _
wsInput1.Cells(lngRow, intCol) + _
wsInput2.Cells(lngRow, intCol)
Next intCol
Next lngRow
End Sub
Sub M1(strAddress As String, wsInput1 As Worksheet, wsInput2 As Worksheet, wsOutput As Worksheet)
With wsOutput.Range(strAddress)
.FormulaR1C1 = "='" & wsInput1.Name & "'!RC+'" & wsInput2.Name & "'!RC"
.Value = .Value
End With
End Sub
Sub M2(strAddress As String, wsInput1 As Worksheet, wsInput2 As Worksheet, wsOutput As Worksheet)
With wsOutput.Range(strAddress)
.FormulaR1C1 = "='" & wsInput1.Name & "'!RC+'" & wsInput2.Name & "'!RC"
.Copy
.PasteSpecial xlPasteValues
End With
End Sub
Sub M3(strAddress As String, wsInput1 As Worksheet, wsInput2 As Worksheet, wsOutput As Worksheet)
Dim rngOutput As Range, rngInput As Range
Set rngOutput = wsOutput.Range(strAddress)
wsInput1.Range(strAddress).Copy
rngOutput.PasteSpecial xlPasteValues
wsInput2.Range(strAddress).Copy
rngOutput.PasteSpecial xlPasteValues, xlPasteSpecialOperationAdd
End Sub
Sub ClearRange(strAddress As String, wsOutput As Worksheet)
wsOutput.Range(strAddress).Clear
End Sub
有很多技术可以帮助你,你能发布你当前使用的代码吗?目前我正在单个单元格上循环,因为算术运算似乎不适用于多单元格范围。或者可能有一种我不知道的方法?添加一个你想要的加法的r1c1参考公式,并将其应用于整个范围,然后将范围的值设置为范围的值。我会按照@pnuts的建议。想不出比这更快的方法了…@pnuts:我不确定我是否同意这里的说法-要求是将它放在另一张(输出)表中-所以我想你需要两次特殊操作。虽然第一个不需要添加(我只是更新了代码)