エクセルVBAで数値の合計を出すのに、ワークシート関数のSUMを使うことが出来ます。
もちろん使わない方法もありますが・・・。
また、その表の見せ方として合計範囲を明示的に示せるようにすることも大切です。
エクセルVBAで、羅列された数値の集計作業をパパッと熟していきたいときがありますよね。
それを簡単に行える方法としてSUM関数があります。今回はこのSUM関数の使い方についてです。
こんにちは、じゅんぱ店長(@junpa33)です。
コンテンツ
SUM関数で合計計算!実務で使えるコード作成

皆さんお馴染みのSUM関数です。
恐らく、Excelを触り始めて一番最初に使えるようになる関数ではないでしょうか。
説明するまでもなく、セル範囲を指定してその範囲内での数値を合計表示するというものです。
VBAでも同じ理屈で動きます。
エクセルVBAで、「あるセル範囲内での合計計算表示」をするためには、
の3つがあります。
説明の進め方はこのようにしていきたいと思います。
- 今回の例題の設定
- SUM関数を使わない方法
- SUM関数を使うには使うが、計算はワークシートで行ってもらう方法
- SUM関数をVBAコードに埋め込んで計算する方法
- やっぱりデータ一覧表の整理整頓を行いたい
今回の例題の設定
今回はこのような一覧表を設定します。
雑誌の本体価格合計と税込価格合計を計算します。
表の特徴として、
- 上部に何行かの空白行がある。
- 行間に空白行がある。
- 空白行を含めてデータNOが通番になっている。
- 個別データは固有コードで管理できている。

SUM関数を使わない方法
最初は、エクセルVBAの力わざの発揮です。
SUM関数を利用せずに合計を出していきます。
値を一つづつ合計していきます。
Option Explicit
Sub 合計計算法1()
Dim i As Long
Dim ArowD As Long, ArowU As Long
Dim Va As Long, aVa As Long, Vb As Long, aVb As Long
'A列で上から数えてデータの始まり行を調べる
ArowD = Cells(1, 1).End(xlDown).Row
'A列で下から数えてデータの終わりの行を調べる
ArowU = Cells(Rows.Count, 1).End(xlUp).Row
'積算合計の変数を初期化する
aVa = 0
aVb = 0
For i = ArowD To ArowU
Va = Cells(i, 10)
Vb = Cells(i, 11)
aVa = aVa + Va
aVb = aVb + Vb
Next i
'積算合計を表の最終行の下に表示する
Cells(ArowU + 1, 10) = aVa
Cells(ArowU + 1, 11) = aVb
End Sub
赤丸囲みの部分に合計が表示されました。

- 入力セルの最終行を取得するにはこの記事が参考になります。

SUM関数を使うが、計算はワークシートで行う方法
SUM関数を使いますが、言うなら球種としてはチェンジアップです。
ワークシートで作成するSUM関数の関数式を、文字列として合計金額表示セルに挿入します。
Sub 合計計算法2()
Dim ArowD As Long, ArowU As Long
'A列で上から数えてデータの始まり行を調べる
ArowD = Cells(1, 1).End(xlDown).Row
'A列で下から数えてデータの終わりの行を調べる
ArowU = Cells(Rows.Count, 1).End(xlUp).Row
'積算合計の関数式を表の最終行の下に挿入する
Cells(ArowU + 1, 10) = "=SUM(J" & ArowD & ": J" & ArowU & ")"
Cells(ArowU + 1, 11) = "=SUM(K" & ArowD & ": K" & ArowU & ")"
End Sub
合計金額欄にSUM関数式が挿入され、計算結果が表示されました。

SUM関数をVBAコードに埋め込んで計算する方法
エクセルVBAで使うSUM関数の本筋です。
SUM関数の構文はVBAでも変わりません。
ただし「WorksheetFunction.」を付けて関数を使うことを表示しないといけません。
Sub 合計計算法3()
Dim ArowD As Long, ArowU As Long
'A列で上から数えてデータの始まり行を調べる
ArowD = Cells(1, 1).End(xlDown).Row
'A列で下から数えてデータの終わりの行を調べる
ArowU = Cells(Rows.Count, 1).End(xlUp).Row
'積算合計の表示セルに計算結果を表示する
Cells(ArowU + 1, 10) = WorksheetFunction. _
Sum(Range(Cells(ArowD, 10), Cells(ArowU, 10)))
Cells(ArowU + 1, 11) = WorksheetFunction. _
Sum(Range(Cells(ArowD, 11), Cells(ArowU, 11)))
End Sub
正常に合計金額が表示されました。

やっぱりデータ一覧表の整理整頓を行いたい
お気づきだと思いますが、
エクセルVBAでSUM関数を使った場合、合計計算範囲が「どこからどこまでか」が解らない、という事態が起こります。
ワークシートでSUM関数式を使うと、合計範囲を表示してくれますが、エクセルVBAではそれが無いのです。
この例で言っても、どこまでの合計なのかイマイチ分からないと思います。
ということで、
合計範囲をより「明示的」に示せるように空白行を出来るなら削除しておいた方が良いと思います。
行の削除ということで、最終行のカウントは、その都度変化していきます。
For~Next文で、最後の回数を初期値の「ArowU」としています。
本来的には、行削除の度にループ回数を減少させるべきですが、コード組み立てが難しくなります。
(別に初期値のままでも、削除処理完了後はカラでループが回るだけですが・・・)
ですので、削除の度に新しい行数をチェックして、「上からと下から」が数的に合致したときにループを抜け出すようにしています。
Sub 合計計算法4()
Dim i As Long
Dim ArowD As Long, ArowU As Long
Dim ArowDa As Long, ArowUa As Long
'A列で上から数えてデータの始まり行を調べる(初期値)
ArowD = Cells(1, 1).End(xlDown).Row
'A列で下から数えてデータの終わりの行を調べる(初期値)
ArowU = Cells(Rows.Count, 1).End(xlUp).Row
'J列で連続してデータ入力されている行数を調べる(初期値)
ArowDa = Cells(ArowD, 10).End(xlDown).Row
'初期値の代入
ArowUa = ArowU
For i = ArowD To ArowU
If ArowDa <> ArowUa Then
Rows(ArowDa + 1).Delete
'空白行の削除が終われば「上から」と「下から」が同数になる
ElseIf ArowDa = ArowUa Then
'この条件を満たす時 For Nextを抜ける
Exit For
End If
'行の削除後に行数が変化。行数を再度調べる
ArowDa = Cells(ArowD, 10).End(xlDown).Row
'行の削除後に行数が変化。行数を再度調べる
ArowUa = Cells(Rows.Count, 1).End(xlUp).Row
Next i
'積算合計の表示セルに計算結果を表示する
Cells(ArowUa + 1, 10) = WorksheetFunction. _
Sum(Range(Cells(ArowD, 10), _
Cells(ArowUa, 10)))
Cells(ArowUa + 1, 11) = WorksheetFunction. _
Sum(Range(Cells(ArowD, 11), _
Cells(ArowUa, 11)))
End Sub
この様に整理されました。

SUM関数で合計計算!実務で使えるコード作成 まとめ

エクセルVBAで数値の合計を計算したいときは、SUM関数を使うことがテッパンです。
ここでは3つの合計算出法を紹介しましたが、やはり「WorksheetFunction.」の方法が良いと思います。
そして他にも、表の見え方として
合計した範囲を分かりやすく表示できるように工夫していきましょう。
この部分は、それぞれいろんなパターンがありますので、工夫のしどころではないかと思います。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。