HOWTO · VBA
VBA の sum 関数
VBA から Excel の SUM ワークシート関数を使用して、1 つまたは複数の範囲を合計し、結果をセルに書き込み、配列または条件を満たす値を合計します。
このページの内容
Excel の SUM 関数を VBA から使うには、WorksheetFunction.Sum を呼び出し、範囲または値を渡します。SUM は Excel のワークシート関数であり、WorksheetFunction オブジェクトを通じて VBA から利用します。VBA 単独の組み込み関数ではありません。以下の VBA プロシージャはコピーして使えますが、設定されている実行環境が VBA に対応していないため、実行されていません。
VBA から Excel の SUM 関数を使う方法
基本形は Application.WorksheetFunction.Sum(argument1, argument2, ...) です。マクロの実行中に別のシートがアクティブになる可能性がある場合は、対象のワークシートを完全修飾して指定します。そうすれば、意図したシートを常に参照できます。以下の各例では ThisWorkbook.Worksheets("Sales") を使うため、ブック内にその名前のワークシートが必要です。
1 つ以上の範囲を合計する
以下のプロシージャは、Sales シートにサンプル値を入力し、合計を計算して E2 に書き込みます。1 つ目は B2:B4 の値を合計します(12 + 8 + 5 = 25)。2 つ目は B2:B3 と D2:D3 を別々の範囲引数として渡します(12 + 8 + 5 + 10 = 35)。このようにすれば、連続していない範囲も合計できます。
1 つの範囲:
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
2 つの独立した範囲:
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
1 つの範囲を合計する場合、Sum には Range オブジェクトを 1 つ渡します。2 つの範囲なら、それぞれの Range オブジェクトを別々の引数として渡します。範囲のアドレスを 1 つの文字列にまとめないでください。どちらのプロシージャでも、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 As 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 より大きい値だけを加算して、合計(22)を VBA のイミディエイト ウィンドウに表示します。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 呼び出しの引数として渡します。