検索の次はカウントをマスターしましょう。
[商品コード] フィールドの中に「A001」がいくつあるかカウントしてみます。いろんな方法が考えられますね。
いわゆる力技です。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