Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA中跨全等范围添加单元格值的最有效方法?_Vba_Excel - Fatal编程技术网

在VBA中跨全等范围添加单元格值的最有效方法?

在VBA中跨全等范围添加单元格值的最有效方法?,vba,excel,Vba,Excel,我需要对任意(但相同)大小的两个范围的值求和。input1中的A1与input2中的A1求和,然后输出到输出单元格中的A1,等等。我需要的是结束值,而不是公式或链接 使用循环这比预期的要慢得多(目前为15分钟以上)。手动操作不需要那么长时间。也许我可以预先制作一些隐藏的工作表,填充一个加法公式,然后在VBA中基本上模仿人类手动操作的方式,但感觉很落后。跨多个工作表进行复制粘贴应该不会更有效率。同上链接摆弄。也许把它们读入数组?但输出需要是常规工作表单元格,而不是数组 pnuts的方法当然是最好的

我需要对任意(但相同)大小的两个范围的值求和。input1中的A1与input2中的A1求和,然后输出到输出单元格中的A1,等等。我需要的是结束值,而不是公式或链接


使用循环这比预期的要慢得多(目前为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:我不确定我是否同意这里的说法-要求是将它放在另一张(输出)表中-所以我想你需要两次特殊操作。虽然第一个不需要添加(我只是更新了代码)