【问题标题】:Using SUM() in VBA在 VBA 中使用 SUM()
【发布时间】:2016-05-27 20:17:49
【问题描述】:

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

=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() 进行此计算,还是我应该坚持循环?

【问题讨论】:

  • 为什么不evaluate?
  • 我已经很久没有这样做了,所以在你可以尝试之前我不会添加这个作为答案,但你不应该也使用:Set r = Sheets("Sheet1").Range("Sheet1:Sheet3!B2")然后在r 上做Sum?或类似的......无论你需要做什么来从工作表中创建一个范围。不过,您最好使用其他方法之一。
  • @findwindow 我确实使用Evaluate(),它工作正常....但是如果我必须根据动态范围计算(所有工作表上相同),那里是制作我必须提供给Evaluate() 的字符串的额外步骤
  • 您还可以创建两个隐藏的空白工作表“开始”和“完成”,然后将所需的工作表放入书页。然后v = Evaluate("Sum(START:FINISH!B2)")
  • 如您所知,但我会放在这里以供将来的观众使用,您可以将 B2 部分替换为动态范围参考。例如,假设您将要设置为变量的范围 rng 它将是 v = Evaluate("Sum(START:FINISH!" & rng.Address(1,1) & ")")

标签: excel worksheet-function vba


【解决方案1】:

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

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

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

【讨论】:

  • 这行得通,但这仅对在两个单元格中添加值有效,但为了使函数覆盖一系列单元格,我在string rng = "D2:D" + totalRows+1; //calculate and return the average/mean as a float with Excel Worksheetfunction return (float)app.WorksheetFunction.Average(propertySheet.Range[rng]); 周围使用了这项工作
【解决方案2】:

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

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

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

Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2") 出现问题的原因是,如果您将该公式输入 Excel,Excel 将无法识别范围“Sheet1:Sheet3!B2”。

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

希望对您有所帮助。

【讨论】:

  • 公平地说,截图中的范围有错别字。冒号前多了一个!。
【解决方案3】:
 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

【讨论】:

  • 请在代码中附上一些解释。
【解决方案4】:

我能够通过这条线让它工作:

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

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 2019-01-02
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多