Excel VBAでSUBTOTAL関数を使って集計する

2023年6月25日

SUBTOTAL関数は集計方法の条件を指定することでさまざまな集計を求めることができます。
例えば集計方法を指定することにより、合計値はもちろんのこと、その他に平均値や最大値、最小値標準偏差などを求めることができます。
また、集計の際に非表示セルを含めたり含めなかったりできるので柔軟な対応が可能となります。

SUBTOTAL関数の説明

SortFields コレクションのメソッド
 WorksheetFunction.Subtotal( 集計方法, 集計範囲1[, 集計範囲2,・・・] )
Subtotal 関数には11種類の集計方法があり、引数で集計方法を決めることができます。
集計方法は下記表の1列目又は2列目にある番号で指定します。

非表示セル
を含める
非表示セル
を含めない
集計方法対応する関数
1101平均値AVERAGE
2102数値のあるセル個数COUNT
3103空白を除くセル個数COUNTA
4104最大値MAX
5105最小値MIN
6106PRODUCT
7107標本の標準偏差STDEV
8108母集団全体の標準偏差STDEVP
9109合計SUM
10110標本による分散の予測値VAR
11111母集団全体の分散VARP

SUBTOTAL関数を使ったサンプルアプリの説明

「東京都に勤務している人数」ボタンをクリックすると、オートフィルタで勤務地が東京の社員を抽出して、ダイアログで人数を表示してくれます。

「東京都に勤務している人の平均の通勤手当」ボタンをクリックすると、オートフィルタで勤務地が東京の社員を抽出して、抽出された社員の平均通勤手当をダイアログで表示してくれます。

サンプルアプリのソースコード   コードの作成手順はこちら

「東京都に勤務している人数」ボタンのソースコード

Sub ボタン1_Click()

   'ワークシートを指定する
    Dim Sh1 As Worksheet
    Set Sh1 = ThisWorkbook.Worksheets("Sheet1")
    
   '変数を定義する
    Dim workEndR1, Ninzu As Long
    
   'データの最終行を取得する
    workEndR1 = Sh1.Cells(Rows.Count, 2).End(xlUp).Row
    
   'オートフィルタの対象となるデータ範囲を指定する
    Dim Rng1 As Range
    Set Rng1 = Range(Sh1.Cells(5, 2), Sh1.Cells(workEndR1, 7))
    
   'オートフィルタで勤務地が東京都の社員を抽出する。
    Rng1.AutoFilter Field:=5, Criteria1:="東京都"
    
   '集計対象となるデータ範囲を指定する
    Dim Rng2 As Range
    Set Rng2 = Range(Sh1.Cells(6, 6), Sh1.Cells(workEndR1, 6))
   
   '集計方法として「3」(件数の集計)を指定して該当人数を集計する。
    Ninzu = WorksheetFunction.Subtotal(3, Rng2)
    
   'ダイアログを表示して人数を表示
    MsgBox "東京都に勤務している社員の人数:" & Ninzu & "人"

   'フィルター状態によって処理分岐
    If ActiveSheet.AutoFilterMode = True Then
        'オートフィルタ解除
        Rng1.AutoFilter

    ElseIf ActiveSheet.AutoFilterMode = False Then
        'オートフィルタが解除されていたら何もしない
  
    End If

End Sub

「東京都に勤務している人の平均の通勤手当」ボタンのソースコード

Sub ボタン2_Click()

   'ワークシートを指定する
    Dim Sh1 As Worksheet
    Set Sh1 = ThisWorkbook.Worksheets("Sheet1")
    
   '変数を定義する
    Dim workEndR1, Heikin As Long
    
   'データの最終行を取得する
    workEndR1 = Sh1.Cells(Rows.Count, 2).End(xlUp).Row
    
   'オートフィルタの対象となるデータ範囲を指定する
    Dim Rng1 As Range
    Set Rng1 = Range(Sh1.Cells(5, 2), Sh1.Cells(workEndR1, 7))
    
   'オートフィルタで勤務地が東京都の社員を抽出する。
    Rng1.AutoFilter Field:=5, Criteria1:="東京都"
    
   '集計対象となるデータ範囲を指定する
    Dim Rng2 As Range
    Set Rng2 = Range(Sh1.Cells(6, 7), Sh1.Cells(workEndR1, 7))

   '集計方法として「1」(平均値の集計)を指定して該当者の平均通勤手当を集計する。
    Heikin = WorksheetFunction.Subtotal(1, Rng2)
    
   'ダイアログを表示して平均額を表示
    MsgBox "東京都に勤務している社員の平均通勤手当:" & Format(Heikin, "#,###") & "円"
       
   'フィルター状態によって処理分岐
    If ActiveSheet.AutoFilterMode = True Then
        'オートフィルタ解除
        Rng1.AutoFilter
        
    ElseIf ActiveSheet.AutoFilterMode = False Then
        'オートフィルタが解除されていたら何もしない
        
    End If

End Sub