【用語集に記載の内容について】

用語集に記載されているメソッドや関数の引数は、VBAエキスパート試験の試験範囲に基づいており、すべての引数を網羅しておりません。 また、書式は公式テキストの記載に準じています。
試験範囲外の引数や詳細については、ヘルプ機能やオブジェクトブラウザーをご参照ください。

【コードをコピーして実行する場合の注意】

文字コードの関係上、半角の「¥」は「/」で表示されるため、当サイトでは全角の「¥」で記載しています。当サイトのコードをコピーして実行する場合は、全角の「¥」を半角の「¥」に変換してください。

SUBTOTAL関数(ワークシート関数)

名称SUBTOTAL関数(ワークシート関数)
説明
合計や平均など、指定した集計方法で集計を行うワークシート関数です。

集計の際、オートフィルターで非表示になっている行は、集計対象から除外されます。
書式
WorksheetFunction.Subtotal(集計方法, セル範囲)

集計方法:集計方法を数値で指定

<指定可能な集計方法(一部)>
1:AVERAGE関数
2:COUNT関数
3:COUNTA関数
9:SUM関数
コード例①
【オートフィルターで絞り込んだ結果を合計する】
Sub Macro1()
    Dim total As Long
        
    'オートフィルターを設定し、1列目を絞り込み
    Range("A1").AutoFilter 1, "りんご"
    '絞り込んだ結果をSUM関数で合計
    total = WorksheetFunction.Subtotal(9, Range("B:B"))
    
    MsgBox "りんごの入荷数は" & total & "個です"
End Sub

AutoFilterメソッドで、アクティブシートのセルA1を含む表(セル範囲A1:B5)にオートフィルターを設定し、表の1列目を「りんご」で絞り込みます。

SUBTOTAL関数で、B列を集計方法9(SUM関数)で集計します。集計の際、オートフィルターで非表示になっている行は集計対象にはならないので、A列で表示されている行のB列の値が合計され、メッセージボックスに表示されます。

マクロを実行すると、「りんごの入荷数は40個です」のメッセージボックスが表示されます。

<マクロ実行前>
A B
1 品名 入荷数
2 りんご 10
3 バナナ 20
4 スイカ 50
5 りんご 10
6 りんご 20
7 バナナ 30

<マクロ実行後>
A B
1 品名 ▼ 入荷数
2 りんご 10
5 りんご 10
6 りんご 20
コード例②
【オートフィルターで絞り込んだ結果の件数を数える】
Sub Macro2()
    Dim cnt As Long
    
    'オートフィルターを設定し、1列目を絞り込み
    Range("A1").AutoFilter 1, "バナナ"
    '絞り込んだ結果をCOUNTA関数でカウント
    cnt = WorksheetFunction.Subtotal(3, Range("A:A"))
    
    If cnt = 0 Then
        MsgBox "バナナは存在しません"
    Else
        MsgBox "バナナは" & cnt - 1 & "件です"
    End If
End Sub

AutoFilterメソッドで、アクティブシートのセルA1を含む表(セル範囲A1:B5)にオートフィルターを設定し、表の1列目を「バナナ」で絞り込みます。

SUBTOTAL関数で、B列を集計方法3(COUNTA関数)で集計します。集計の際、オートフィルターで非表示になっている行は集計対象にはならないので、A列で表示されている、空白ではないセルの数をカウントし、変数cntに格納します。

Ifステートメントで、変数cntの値を判定し、メッセージボックスを表示します。

<変数cntの値が0の場合>
「バナナは存在しません」のメッセージボックスが表示されます。

<変数cntの値が0ではない場合>
変数cntの値には、項目名も含まれているため、その件数を差し引いた、「バナナは 変数cnt-1件です」のメッセージボックスが表示されます。

マクロを実行すると、「バナナは2件です」のメッセージボックスが表示されます。

<マクロ実行前>
A B
1 品名 入荷数
2 りんご 10
3 バナナ 20
4 スイカ 50
5 りんご 10
6 りんご 20
7 バナナ 30

<マクロ実行後>
A ▼ B
1 品名 入荷数
3 バナナ 20
7 バナナ 30
カテゴリスタンダード