データの抽出と集計(Excel VBAやさしく解説)
音声
目次
条件に合うデータの抽出方法
今回できるようになることは、指定した条件で表を絞り込み、必要な行だけを扱えるようになることです。
Excelでは「AutoFilter(オートフィルター)」やVisible(表示)セルの扱いを中心に考えるとわかりやすいです。
まずは最小限で動くマクロを用意して、どこに貼るか・どう実行するかを確認します。最小マクロ:
Sub MinimalFilter()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' ヘッダー付きの表(A1から現在の領域)を列2で絞り込み
ws.AutoFilterMode = False
ws.Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:="Tokyo"
MsgBox "列2=Tokyo の絞り込みを実行しました。", vbInformation
End Sub
貼り付け場所は標準モジュール(VBEで挿入→モジュール)です。
ファイルはマクロ有効形式(.xlsm)で保存してください。
実行方法は、VBEでF5実行、あるいはフォームボタンに割り当てて使えます。
確認方法は、シート上で行が絞られていることを目視で確認するか、MsgBoxの表示で実行確認ができます。
保存形式とマクロ有効化は先に行っておくと混乱が少なくなります。
AutoFilterメソッドの使い方
AutoFilterはRange.AutoFilterで動かし、Field(列番号)とCriteria1/Criteria2で条件を指定します。
文字列、数値、日付、ワイルドカード("*"や"?")などを使えますし、Operator引数で複数条件をつなげられます。
フィルター適用後はSpecialCells(xlCellTypeVisible)で見えているセルだけを扱えます。
AutoFilter適用時には既存のAutoFilterModeを解除しておくと予期せぬ振る舞いを避けやすいです。
フィルター後に行単位で処理する場合は、Visibleセルをループで回すか、WorksheetFunction.Subtotalで集計するのが実務的です。
Sortメソッドでデータを並べ替える
Range.Sortを使うと、指定列で昇順や降順に並べ替えられます。
ヘッダーを保持したい場合はHeader:=xlYesを指定し、キーにはセル参照(例:Key1:=ws.Range("B2"))を渡す点を覚えてください。
複数キーでのソートも可能です。また、並べ替えの後にフィルターをかける場合と、フィルター後に可視セルだけを別シートにコピーする場合で、処理順を決めておく必要があります。
RangeとCellsの使い分けは、見た目の分かりやすさで選ぶと整理しやすいです。Range("A1:B10")は固定範囲に向き、Cells(row, col)はループや動的範囲の指定に向きます。
ValueとValue2は大差ありませんが、日付の細かい扱いではValue2の方が高速で互換性が高い場合があります。
RemoveDuplicatesで重複データを削除する
Range.RemoveDuplicatesは、指定列の組み合わせで重複行をまとめて削除できます。
Columns引数に配列を渡し、Header:=xlYesまたはxlNoでヘッダーの有無を指定します。
RemoveDuplicatesは元データを上書きするため、元に戻す必要がある場面では事前にコピーを取るか、Undoが効かないことを理解しておくと安全です。
重複判定後に集計(件数や合計)を出す場合は、RemoveDuplicates前と後で差分を取るか、コピー先で集計する構成にすると実務では扱いやすいです。
よくあるミスとして、Field(列番号)をヘッダー行基準で間違えることが多く、原因は見た目の列位置とField番号のズレです。
直し方は、CurrentRegionや範囲をDebug.Printで確認し、Field番号をヘッダー行から数え直すことです。
実務での集計処理パターン
実務では「フィルター→並べ替え→重複削除→集計」の流れがよく出ます。以下はその流れをVBAで一気に行い、合計を出すサンプルです。
フィルターは日付やカテゴリ、並べ替えは担当者や金額順、重複はキー列の組み合わせで行うのが典型です。出力は別シートやシグナル列、集計セルに書き出すと運用が楽になります。
Sub FilterSortRemoveDupAggregate()
Dim ws As Worksheet, rng As Range
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set rng = ws.Range("A1").CurrentRegion
' 例: 列3が日付で2023年以降を抽出
rng.AutoFilter Field:=3, Criteria1:=">=2023/01/01", Operator:=xlAnd
' 列2(B列)で昇順ソート(ヘッダーあり)
rng.Sort Key1:=ws.Range("B2"), Order1:=xlAscending, Header:=xlYes
' 列1と列2の組で重複削除(ヘッダーあり)
rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
' 見えているD列の合計をSUBTOTALで取得(9はSUM)
Dim last As Long, sumVal As Double
last = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
sumVal = Application.WorksheetFunction.Subtotal(9, ws.Range("D2:D" & last))
ws.Range("F1").Value = "合計"
ws.Range("F2").Value = sumVal
' フィルター解除(必要なら)
ws.AutoFilterMode = False
MsgBox "処理が完了しました。合計: " & sumVal, vbInformation
End Sub
注意(ここだけ)
- 最小マクロ:マクロを実行する前に、ファイルをマクロ有効形式(.xlsm)で保存してから動かすことがポイントです。
要約
AutoFilterで条件抽出すると、VisibleセルやSubtotalで絞り込んだ集計ができるようになります。
Range.SortはHeader指定とキーの指定を要チェックして使うと安定します。
RemoveDuplicatesは元データを上書きするため、必要ならコピーを残してから実行します。
実務では「絞り込み→並べ替え→重複削除→集計」の順がよく使われますので、コードで一括処理が可能です。
小さなミス(列番号やシート名)で動かなくなるため、Debug.PrintやMsgBoxで中間確認を入れると運用が楽になります。