データをカウントする


検索の次はカウントをマスターしましょう。

[商品コード] フィールドの中に「A001」がいくつあるかカウントしてみます。いろんな方法が考えられますね。

1セルずつ順に見ていく

いわゆる力技です。A 列を上から順に見ていって、そのセルが「A001」かどうかを数えます。

Sub Sample02()
    Dim i As Long, cnt As Long
    For i = 1 To 11
        If Cells(i, 1) = "A001" Then cnt = cnt + 1
    Next i
    MsgBox "A001は、" & cnt & "件です。", vbInformation
End Sub

これは、まあ、解説するまでもありませんね。もしデータが入力されているセル範囲が不明の場合は、次のように Do Loop でループする手もあります。

Sub Sample02_2()
    Dim i As Long, cnt As Long
    i = 1
    Do While Cells(i, 1) <> ""
        If Cells(i, 1) = "A001" Then cnt = cnt + 1
        i = i + 1
    Loop
    MsgBox "A001は、" & cnt & "件です。", vbInformation
End Sub

ワークシート関数を使う

実は、任意のセル範囲内で特定のデータをカウントするとき、便利なワークシート関数があります。COUNTIF 関数です。VBA からこの COUNTIF 関数を使うと、簡単にデータの数をカウントできます。

Sub Sample02_3()
    Dim cnt As Long
    cnt = WorksheetFunction.CountIf(Range("A1:A11"), "A001")
    MsgBox "A001は、" & cnt & "件です。", vbInformation
End Sub

COUNTIF 関数をワークシート上で使う場合は、COUNTIF("A1:A11", "A001") のように第 1 引数にはセルのアドレスを指定します。しかし、VBA の中でワークシート関数を使うときは、セルのアドレスではなく Range オブジェクトを指定する点に留意してください。

オートフィルタ機能を使う

オートフィルタはリストを簡単に絞り込む機能です。便利なので使った方も多いでしょう。これを VBA から操作します。なお、オートフィルタの詳しい使い方は「オートフィルタで抽出する」で解説します。ここでは、リストを「商品コード=A001」で絞り込んだ結果をテンポラリシートに抽出して、その結果の行数をカウントします。

Sub Sample02_4()
    Dim cnt As Long, tmpSheet As Worksheet, dataSheet As Worksheet
    Application.ScreenUpdating = False
    Set dataSheet = ActiveSheet
    Set tmpSheet = Worksheets.Add
    dataSheet.Activate
    Range("A1").Select
    With Selection
        .AutoFilter Field:=1, Criteria1:="A001"
        .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy tmpSheet.Range("A1")
        cnt = tmpSheet.UsedRange.Rows.Count
        .AutoFilter
        Application.DisplayAlerts = False
        tmpSheet.Delete
        Application.DisplayAlerts = True
    End With
    Application.ScreenUpdating = True
    MsgBox "A001は、" & cnt - 1 & "件です。", vbInformation
End Sub

MsgBox 関数で件数を表示するとき「-1」しているのは、タイトル行もカウントしているからです。

【追記(2018年12月)】

ただ過去コンテンツ保管庫に移動するだけのつもりでしたが、内容を読んだらちょっと恥ずかしかったので(笑)、少しだけ追記します。オートフィルタで絞り込んだ結果をカウントするのなら、何も別シートにコピーしなくても、SUBTOTAL関数で一発です。Selectも不要ですね。こんなコンテンツを書いていたなんて、あ~恥ずかしい…

Sub Sample02_4()
    Dim cnt As Long
    With Range("A1")
        .AutoFilter 1, "A001"
        cnt = WorksheetFunction.Subtotal(3, Range("A:A"))
        .AutoFilter
    End With
    MsgBox "A001は、" & cnt - 1 & "件です。", vbInformation
End Sub