【VBAリファレンス】【第1回】Excel VBAでSUM関数を極める!「集計の自動化」から始まる業務効率化の第一歩

スポンサーリンク

はじめに:なぜ今、あえて「SUM」なのか?

皆さん、こんにちは。Excel VBA講師の佐藤です。
これまで数多くの現場でVBAの指導を行ってきましたが、初心者が最初に躓くポイントであり、かつ中級者以上が「実はもっと効率的に書けた」と後悔するのが「集計処理」です。

「SUM関数」といえば、誰でも知っているExcelの基本中の基本ですよね。しかし、VBAの世界において、このSUMをどう扱うかで、コードの可読性と実行速度が劇的に変わります。今回は全4回の連載の第1回として、最も基礎的でありながら、意外と奥が深い「SUMを使った集計の自動化」について深掘りしていきます。

VBAでSUMを扱うための「2つのアプローチ」

VBAで合計を求める際、皆さんはどのような手法をとっていますか?大きく分けて以下の2つのアプローチがあります。

1. **ワークシート関数を呼び出す(Application.WorksheetFunction.Sum)**
2. **ループ処理で加算する(For Each ~ Nextなど)**

結論から申し上げますと、実務において推奨されるのは圧倒的に「1. ワークシート関数の呼び出し」です。なぜなら、Excelの計算エンジンはマイクロソフトが最適化した「計算のプロ」であり、自作のループ処理よりも遥かに高速だからです。

まずは、最も基本的な書き方を確認しましょう。

Sub BasicSumExample()
Dim total As Double
‘ A1からA10までの合計を求める
total = Application.WorksheetFunction.Sum(Range(“A1:A10”))
MsgBox “合計は ” & total & ” です。”
End Sub

このコードは非常にシンプルですが、実務では「データの範囲が日々変わる」という課題に直面します。ここからがプロの腕の見せ所です。

動的な範囲指定:CurrentRegionとResizeの活用

実務のデータは、行数が増減するのが当たり前です。そんなとき、`Range(“A1:A10”)`のように固定の範囲指定をしていては、VBAツールとしての価値が半減してしまいます。

そこで活用したいのが`CurrentRegion`プロパティです。これは「選択したセルに隣接するデータの塊」を一瞬で取得する非常に強力なツールです。

Sub DynamicSumExample()
Dim ws As Worksheet
Dim targetRange As Range
Dim total As Double

Set ws = ThisWorkbook.Sheets(“売上データ”)
‘ A1セルを含むデータの塊を取得
Set targetRange = ws.Range(“A1”).CurrentRegion

‘ 合計を計算(ヘッダーを除外する工夫など)
total = Application.WorksheetFunction.Sum(targetRange.Columns(2))

Debug.Print “B列の合計値: ” & total
End Sub

この手法を使えば、たとえデータが100行あろうが1万行あろうが、コードを書き換える必要はありません。これが「メンテナンス性の高いコード」の第一歩です。

「意外に便利」なSUMの活用テクニック:条件付き集計

単なる合計だけでなく、「特定の条件に合致するものだけを合計したい」というケースも多いはずです。ここで登場するのが`SumIf`や`SumIfs`です。これもVBAから呼び出すことで、複雑なフィルター操作を省くことができます。

例えば、「営業部」の売上だけを抽出して合計したい場合、以下のように記述します。

Sub SumIfExample()
Dim ws As Worksheet
Dim criteriaRange As Range
Dim sumRange As Range
Dim result As Double

Set ws = ThisWorkbook.Sheets(“売上リスト”)
Set criteriaRange = ws.Range(“A2:A100”) ‘ 部署名が入っている列
Set sumRange = ws.Range(“B2:B100”) ‘ 金額が入っている列

result = Application.WorksheetFunction.SumIf(criteriaRange, “営業部”, sumRange)

MsgBox “営業部の合計売上: ” & Format(result, “#,##0”)
End Sub

このように、VBAから関数を呼び出すことで、「オートフィルターをかけて、集計して、フィルターを解除して…」という冗長な操作をたった数行に集約できます。これがVBAによる業務自動化の醍醐味です。

なぜ「ループ処理」を使ってはいけないのか?

初心者の方は、「Forループを使って、セルを一つずつ足していけばいいのでは?」と考えがちです。

‘ 非推奨の書き方
For i = 1 To 10000
total = total + Cells(i, 1).Value
Next i

この書き方は、データ量が数千件を超えた瞬間に目に見えて遅くなります。Excelは「セルへのアクセス」という処理が非常に重いため、ループの中で何度もセルを読み書きするのは、プロの設計ではありません。`Application.WorksheetFunction.Sum`を使えば、内部メモリ上で一括計算されるため、数万件のデータであっても一瞬で終わります。

まとめ:第1回の振り返りと次回への期待

今回の記事では、SUM関数をVBAで扱うための「基本と動的範囲の取得」「条件付き集計」について解説しました。

1. **ワークシート関数を活用し、計算エンジンに任せること**
2. **CurrentRegionを使って、可変データに対応できるようにすること**
3. **ループ処理を避け、一括処理を心がけること**

これらを守るだけで、あなたの書くVBAコードの品質は劇的に向上します。VBAは単なる「自動操作」の道具ではありません。Excelの持つ強力な計算能力を引き出すための「インターフェース」なのです。

さて、次回(第2回)は、「SUM関数を応用した、さらに高度なデータ集計テクニック:配列を用いた高速処理」について解説します。今回学んだSUMをベースに、より大規模なデータセットを扱うための「配列」という概念を導入していきます。

「VBAが少し難しくなってきたかな?」と感じるかもしれませんが、ここを乗り越えれば、あなたはもうExcel業務の達人です。ぜひ次回の記事も楽しみにしていてください。

それでは、また次回の講義でお会いしましょう!

タイトルとURLをコピーしました