【Excel VBA】データ最終行の下に合計値(SUM)を入力する2つの方法

請求書や売上一覧表などで、データが入力されている一番下のセルの直後に、列の合計値を自動で入力したい、という場面は非常に多くあります。データの行数は毎回変動するため、マクロで最終行を動的に見つける必要があります。

この記事では、データが入力されている最終セルの下に行を追加し、そこまでの合計値を入力するという一連の処理を、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を活用して、高速で効率的なマクロを作成しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次