HOWTO · VBA
VBA 中的求和函数
从 VBA 使用 Excel 的 SUM 工作表函数,对一个或多个区域求和、将结果写入单元格,并对数组或符合条件的值求和。
本页内容
在 VBA 中使用 Excel 的 SUM 函数时,调用 WorksheetFunction.Sum 并传入一个区域或数值。SUM 是 Excel 工作表函数,通过 WorksheetFunction 对象提供给 VBA 使用;它不是独立的 VBA 内置函数。下方完整的 VBA 过程可以复制使用,但由于配置的运行环境不支持 VBA,因此尚未执行。
在 VBA 中使用 Excel 的 SUM 函数
基本写法是 Application.WorksheetFunction.Sum(argument1, argument2, ...)。如果宏运行时当前工作表可能不是目标工作表,请使用完整限定的工作表引用,确保计算读取预期工作表中的数据。以下示例都使用 ThisWorkbook.Worksheets("Sales");因此,工作簿中必须有一个名为 Sales 的工作表。
对一个或多个区域求和
以下过程会在 Sales 工作表中填入示例值、计算总和,并将结果写入 E2。第一个示例对 B2:B4 求和(12 + 8 + 5 = 25)。第二个示例将 B2:B3 和 D2:D3 作为两个独立的区域参数传入(12 + 8 + 5 + 10 = 35),用于对不连续区域求和。
单个区域:
Sub SumOneRange()
Dim ws As Worksheet
Dim total As Double
Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("B2").Value = 12
ws.Range("B3").Value = 8
ws.Range("B4").Value = 5
total = Application.WorksheetFunction.Sum(ws.Range("B2:B4"))
ws.Range("E2").Value = total
End Sub
两个独立区域:
Sub SumTwoRanges()
Dim ws As Worksheet
Dim total As Double
Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("B2").Value = 12
ws.Range("B3").Value = 8
ws.Range("D2").Value = 5
ws.Range("D3").Value = 10
total = Application.WorksheetFunction.Sum( _
ws.Range("B2:B3"), ws.Range("D2:D3"))
ws.Range("E2").Value = total
End Sub
对单个区域求和时,Sum 接收一个 Range 对象;对两个区域求和时,每个 Range 对象都作为独立参数传入,不要把两个地址合并成一个区域字符串。在这两个过程中,将 total 赋给 ws.Range("E2").Value,即可把计算结果存入 E2。
下面的 Python 示例演示如何对 12、8 和 5 进行算术求和;它不会调用 WorksheetFunction.Sum,也不会执行 Excel 或 VBA。
运行此示例:
values = [12, 8, 5]
total = sum(values)
print(total)
25
将总和写入工作表单元格
上面的过程先将结果存入变量,再把它赋给目标单元格的 Value 属性。基本写法是先执行 total = Application.WorksheetFunction.Sum(ws.Range("B2:B10")),再执行 ws.Range("E2").Value = total。在 VBA 中,通过 = 赋值即可将结果写入 Value。为读取区域和目标单元格都指定完整的工作表引用,可以避免依赖当前处于活动状态的工作表。
在 VBA 中对数组求和
如果数值已经存放在 VBA 数组中,可以用循环控制累加过程。Array(...) 会返回 Variant 数组,因此应将 numbers 声明为 Variant;在循环前初始化 total,然后从 LBound(numbers) 遍历到 UBound(numbers),逐项累加。这个完整过程会计算出 15,并在 VBA 的“立即”窗口中显示结果。它在 VBA 中累加数组元素,不会调用 Excel 的 SUM 工作表函数。配置的运行环境无法执行此 VBA 示例。
Sub SumArray()
Dim numbers As Variant
Dim total As Double
Dim i As Long
numbers = Array(1, 2, 3, 4, 5)
total = 0
For i = LBound(numbers) To UBound(numbers)
total = total + numbers(i)
Next i
Debug.Print total
End Sub
对符合条件的数值求和
此过程会在 Sales 工作表的 A2:A6 中写入示例值,只累加大于 5 的数值,并在 VBA 的“立即”窗口中显示总和(22)。If 语句决定哪些数值会计入累计总和。这种做法是在 VBA 中按条件累加。如果要根据工作表数据进行条件求和,Excel 也提供了 SUMIF;在更适合该任务时,可以通过 WorksheetFunction.SumIf 调用它。配置的运行环境无法执行此 VBA 示例。
Sub SumValuesGreaterThanFive()
Dim ws As Worksheet
Dim total As Double
Dim i As Long
Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("A2").Value = 2
ws.Range("A3").Value = 6
ws.Range("A4").Value = 9
ws.Range("A5").Value = 4
ws.Range("A6").Value = 7
total = 0
For i = 2 To 6
If ws.Cells(i, 1).Value > 5 Then
total = total + ws.Cells(i, 1).Value
End If
Next i
Debug.Print total
End Sub
常见问题
WorksheetFunction.Sum 的作用是什么? 它可在 VBA 中调用 Excel 的 SUM 工作表函数,并返回所提供数值或区域的总和。
它能对不连续区域求和吗? 可以。将每个区域分别作为一个参数传入,如上面的示例所示。
如何处理包含非数值的单元格? 对引用区域中的文本和空单元格,Excel SUM 会忽略;直接作为参数传入的值在类型转换方面可能有不同的处理方式。如果结果取决于混合输入的处理方式,请检查输入,并统一使用区域。
区域可以来自不同的工作表吗? 可以。将分别限定工作表的引用(例如 Worksheets("North").Range("B2:B10") 和 Worksheets("South").Range("B2:B10"))作为参数传入同一次 SUM 调用即可。