如果我想在工作表中添加一组单元格,我可以使用以下公式:
=SUM(Sheet1!A1:A10)
要在子程序中执行此操作,我将使用:
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 中,此行严重失败,如 在 VBA 中指定跨工作表的 Excel 范围中所述:
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,Excel 将无法识别范围“Sheet1:Sheet3!B2”。
要使用
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))
我使用了一个非常简单的VBA语句:
MSC = Range("MyScores")
MyTotal = WorksheetFunction.Sum(Range(MSC))
上面的 MyScores 是名为“MyScores”的单元格中的地址范围,这是正常的 Excel 地址公式“Address....”;我的公式如下,但可以更改为所需的任何内容 I4 保存指定的行。
=ADDRESS(I4,CELL("Col",R9),1)&":"&ADDRESS(J4,CELL("Col",R9),1)) 非常适合我。