在 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))
如果我想将工作表中的一组单元格相加,我可以使用公式:
=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))