在VBA中使用SUM()函数

13
如果我想对工作表中的一组单元格求和,可以使用以下公式:
=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()吗?还是应该坚持使用循环?


我已经很久没有做这个了,所以在你尝试之前我不会将其添加为答案,但是难道你不需要使用:Set r = Sheets("Sheet1").Range("Sheet1:Sheet3!B2") 然后对 r 进行 Sum 吗?或者类似的操作...无论你需要做什么来从工作表中创建一个范围。不过,你可能最好使用其他方法之一。 - gmiley
1
@findwindow 我确实使用了Evaluate(),而且它运行得很好……但是如果我必须基于动态范围(在所有工作表上相同)进行计算,则需要额外的步骤来生成我必须提供给Evaluate()的字符串。 - Gary's Student
2
你也可以创建两个隐藏的空白表格 "START" 和 "FINISH" 并将你想要的表格夹在它们之间。然后 v = Evaluate("Sum(START:FINISH!B2)") - Scott Craner
@ScottCraner 谢谢你的建议.................这个方法很好,因为工作簿中的所有数据表都是分组在一起的。 - Gary's Student
3
如你所知,但为了日后的观众我在这里说明一下,你可以用动态范围引用替换B2部分。例如,假设你已将要设置的范围作为变量rng,那么代码将是 v = Evaluate("Sum(START:FINISH!" & rng.Address(1,1) & ")")。请注意,我的翻译尽力使句子通俗易懂,但并未改变原意。 - Scott Craner
显示剩余5条评论
5个回答

7

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

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

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


这个可以工作,但只适用于在两个单元格中添加值,但为了使函数在一系列单元格中起作用,我使用了这个解决方法 `string rng = "D2:D" + totalRows+1;//使用Excel Worksheetfunction计算并返回平均/均值作为浮点数 return (float)app.WorksheetFunction.Average(propertySheet.Range[rng]);` - Abayomi Apetu

1
 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

请在您的代码中包含一些解释。 - L. F.

1
你需要使用循环在所有工作表中执行计算,这是最有效的方法。如上所述,你可以分别键入每个范围。
可能值得将要添加的范围转换为double(或single、integer等),因为有时VBA会将数字读取为文本。
原因是你在使用Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")时出现问题,因为如果你将该公式键入Excel中,则范围“Sheet1:Sheet3!B2”将无法被Excel识别。

enter image description here

要使用Application.WorksheetFunction,它必须在VBA之外的Excel中工作。
希望这有所帮助。

1
公平地说,屏幕截图中的范围有一个打字错误。冒号前多了一个 ! - airstrike

1
我只需要这一行代码就让它工作了:


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

0
我使用了一个非常简单的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)
对我来说完美无缺。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接