Excel VBAのRange.Subtotalメソッド
Excel VBAのRangeオブジェクトには、データの集計に役立つ「Subtotal」メソッドがあります。これを使用すると、データセットの指定された列に対して、集計操作(合計、平均、カウントなど)を実行し、結果を出力することができます。
メソッドの構文
RangeObject.Subtotal(GroupBy, Function, TotalList, Replace, PageBreaks, SummaryBelowData)
パラメータ
- GroupBy: サブトータルを計算する列のインデックス
- Function: 使用する関数を示すXlConsolidationFunction定数
- TotalList: 集計を適用する列のインデックスを含む配列
- Replace: 既存のサブトータルを置き換えるかどうかを示すBoolean値(省略可能)
- PageBreaks: 各集計グループの後にページ区切りを挿入するかどうかを示すBoolean値(省略可能)
- SummaryBelowData: サブトータルの行をデータの上または下に配置するかどうかを示すBoolean値(省略可能)
サンプルコード
このデータはExcelシートのA1:C10の範囲に配置します。
A | B | C | |
---|---|---|---|
1 | 商品名 | 数量 | 価格 |
2 | りんご | 5 | 100 |
3 | バナナ | 7 | 200 |
4 | チェリー | 8 | 300 |
5 | りんご | 6 | 150 |
6 | バナナ | 9 | 220 |
7 | チェリー | 10 | 350 |
8 | りんご | 8 | 120 |
9 | バナナ | 11 | 210 |
10 | チェリー | 12 | 360 |
以下に、特定のデータセットに対してSubtotalメソッドを使用した例を示します。
Sub ApplySubtotal() ' 集計対象範囲を変数に格納 Dim rng As Range Set rng = Range("A1:C10") ' 商品名列(列1)でソート rng.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes ' すでにあるサブトータルを削除します rng.RemoveSubtotal ' サブトータルを適用します rng.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(2, 3), Replace:=True, PageBreaks:=False, SummaryBelowData:=True End Sub
このコードは、A1:C10の範囲を選択し、まずグループ化予定の列(A列)をキーにして並べ替えをします。続けて既存のサブトータルを削除します。その後、GroupByパラメータに1を指定して1列目(A列)のユニークな値ごとにグループ化を行います。その後、TotalListパラメータで指定した列(この場合は2列目と3列目)のサブトータルを計算します。この例では、集計関数としてxlSum(合計)を使用しています。