在 VBA 中使用 SUM()

Using SUM() in VBA

如果我想将工作表中的一组单元格相加,我可以使用公式:

=SUM(Sheet1!A1:A10)

要在 sub 中执行此操作,我将使用:

Sub example1()
    Dim r As Range, v As Variant

    Set r = Sheets("Sheet1").Range("A1:A10")
    v = Application.WorksheetFunction.Sum(r)
End Sub

但是,如果我想在多个工作表中添加一个单元格,我使用公式:

=SUM(Sheet1:Sheet38!B2)

在 VBA 中,这一行失败得很惨,如 Specify an Excel range across sheets in VBA 中所述:

Sub dural()
    v = Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")
End Sub

我有两个解决方法。我可以通过编程循环求和:

Sub example2()
    Dim i As Long
    Dim v As Variant

    v = 0
    For i = 1 To 38
        v = v + Sheets(i).Range("B2")
    Next i
End Sub

或使用 Evaluate():

v = Evaluate("Sum(Sheet1:Sheet3!B2)")

是否可以使用 Application.WorksheetFunction.Sum() 进行此计算,还是我应该坚持循环?

我认为 worksheetfunction.sum 的问题在于它需要参数来评估而不是字符串。 WorksheetFunction.Sum("Sheet1!A1:A3") 也失败了。然而,这成功了

Application.WorksheetFunction.Sum(Sheet1.Range("A1"), Sheet2.Range("A1"))

范围可以是任何你喜欢的。

您需要使用循环对所有工作表执行计算,从事物的外观来看,这是最有效的方法。如上所述,您可以分别输入每个范围。

可能值得将您相加的范围转换为双精度(或单精度、整数等),因为有时 VBA 会将数字读取为文本。

v = v + Cdbl(Sheets(i).Range("B2"))

您遇到 Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2") 问题的原因是,如果您将该公式键入 Excel,范围 'Sheet1:Sheet3!B2' 将无法被 [=30= 识别].

要使用 Application.WorksheetFunction,它必须在 VBA 之外的 excel 中工作。

希望对您有所帮助。

 Sub SumWorksheets()
    Dim ws As Worksheet
    Dim v As Variant
    For Each ws In ThisWorkbook.Worksheets
'    If ws.Name <> ThisWorkbook.ActiveSheet.Name Then ' (Sum other sheets only)
    If ws.Name <> "" Then
    Application.DisplayAlerts = False
    v = v + ws.Range("B2")
    Application.DisplayAlerts = True
    End If
    Next ws
    MsgBox v
    End Sub

我能够通过以下行让它工作:

Cells(x,y) = WorksheetFunction.sum(range(a,b:a,d))