請求書や売上一覧表などで、データが入力されている一番下のセルの直後に、列の合計値を自動で入力したい、という場面は非常に多くあります。データの行数は毎回変動するため、マクロで最終行を動的に見つける必要があります。
この記事では、データが入力されている最終セルの下に行を追加し、そこまでの合計値を入力するという一連の処理を、VBAで実現する2つの代表的なアプローチを比較しながら解説します。
頻出テクニック:最終セルを取得する End(xlDown)
今回の両方のアプローチで鍵となるのが、Range("B2").End(xlDown)
というコードです。 これは、**「B2セルを選択して、Ctrl
+ ↓
キーを押す」**のと同じ操作をVBAで行うもので、データが連続して入力されている範囲の一番下のセルを取得するための定番テクニックです。
方法1:ループ処理で1セルずつ足し算する方法
まず、基本となる考え方として、指定範囲のセルを一つずつループで巡回し、その値を足し合わせていく方法です。
コードと解説
Sub SumColumnByLooping()
' 変数を宣言します
Dim targetColumnStart As Range
Dim dataRange As Range
Dim cell As Range
Dim totalValue As Double
' 合計を開始するセルを設定
Set targetColumnStart = ThisWorkbook.Worksheets("Sheet1").Range("C2")
' --- 1. 合計対象の動的範囲を定義 ---
Set dataRange = Range(targetColumnStart, targetColumnStart.End(xlDown))
' --- 2. For Eachループで各セルの値を足し算 ---
totalValue = 0 ' 合計値を初期化
For Each cell In dataRange
' IsNumericでセルの中身が数値の場合のみ加算
If IsNumeric(cell.Value) Then
totalValue = totalValue + cell.Value
End If
Next cell
' --- 3. 最終セルの1つ下に合計値を入力 ---
targetColumnStart.End(xlDown).Offset(1, 0).Value = totalValue
MsgBox "ループ処理で合計値を入力しました。"
End Sub
この方法は、For Eachループの中で何が行われているかが分かりやすく、VBAの基本的な処理の流れを理解するのに適しています。しかし、データが数千、数万行になると、処理に非常に時間がかかるという欠点があります。
方法2:ワークシート関数(Sum)を使う方法(推奨)
次に、VBAの中からExcelのSUM
関数を直接呼び出す、より高速でスマートな方法です。
コードと解説
Sub SumColumnByWorksheetFunction()
' 変数を宣言します
Dim targetColumnStart As Range
Dim dataRange As Range
Dim totalValue As Double
' 合計を開始するセルを設定
Set targetColumnStart = ThisWorkbook.Worksheets("Sheet1").Range("C2")
' --- 1. 合計対象の動的範囲を定義 ---
Set dataRange = Range(targetColumnStart, targetColumnStart.End(xlDown))
' --- 2. WorksheetFunction.Sumで一気に合計値を計算 ---
totalValue = WorksheetFunction.Sum(dataRange)
' --- 3. 最終セルの1つ下に合計値を入力 ---
targetColumnStart.End(xlDown).Offset(1, 0).Value = totalValue
MsgBox "ワークシート関数で合計値を入力しました。"
End Sub
WorksheetFunction.Sum(dataRange)
という一行だけで、ループ処理と同じ結果が得られます。
内部的にはExcelの高度に最適化された計算エンジンが使われるため、データ量にほとんど影響されず、処理は一瞬で完了します。
まとめ
データ列の末尾に合計値を入力する2つの方法を比較しました。
方法 | 長所 | 短所 |
ループ処理 | 処理内容が分かりやすい。 | データ量が多いと非常に遅い。 |
ワークシート関数 | 圧倒的に高速。コードが簡潔。 | 特になし。 |
Google スプレッドシートにエクスポート
結論として、特別な理由がない限り、WorksheetFunction.Sum
を使う方法を強く推奨します。
ループ処理はVBAの基本を学ぶ上で良い練習になりますが、実務でパフォーマンスが求められる場面では、積極的にWorksheetFunction
を活用して、高速で効率的なマクロを作成しましょう。