指定範囲から集計した値を出す
今回は指定範囲のセルからキーワードになる文字列が
いくつあるかを集計することができるCOUNTIFの関数を紹介します。
見本として〇×判定した回答結果に見立てたデータを用意しました。
Excel関数
関数で集計する場合の書き方
=COUNTIF(範囲,対象キーワード)
入力例
=COUNTIF(B:B,"〇")
B列全体からセルの中身が"〇"であるセルを集計してくれます。
同じように今度は×を集計したい場合は、
"検索キーワード"を"×"にすれば
回答結果の集計がすぐに終わります。
では次のような果物の一覧から
"リンゴ"がいくつあるかを集計してみましょう。
ただしリストには"青リンゴ"と"赤リンゴ"も同じく集計対象とします。
この場合、上記で紹介した関数をそのまま使用しても
"青リンゴ"と"赤リンゴ"は集計対象に含まれません。
解決策としては"検索キーワード"にワイルドカードを使います。
今回はリンゴの前にどのような文字があっても"リンゴ"が含まれれば良いのですが、
見本なので、前後にワイルドカードを付けて、"リンゴ"が含まれていれば
集計対象とする。という形で紹介します。
入力例
=COUNTIF(B:B,"*" & "リンゴ" & "*")
このようにワイルドカードを前後に付けたりする事で、
単純なキーワードのみではなく、幅広く集計する事が可能です。
COUNTIF関数は色々なところで使えて便利ですが、
関数を入れたままフィルターをかけなおしたりすると
関数計算を再度実行されます。
意外に処理が重い事が多いので、
数値化して問題なければ、値貼り付けして
普通の数字にしてしまう事をオススメします。
ExcelVBA
VBAで抽出する場合の書き方
結果 = WorksheetFunction.CountIf(範囲,対象キーワード)
書き方としては"WorksheetFunction"を含めれば
同じ使い方が可能です。
"WorksheetFunction"はとっても便利ですw
では実際のコード例ですが、今回は指定の範囲を2行目から最終行までとし、
最終行の値もマクロ内で取得して変数に入れるようにします。
Sub 集計()
'セルのB列全部の"〇"を集計して、E2に出力する
Cells(2, 5) = WorksheetFunction.CountIf(Range("B:B"), "〇")
'確認用のメッセージボックス
MsgBox Cells(2, 5)
End Sub
新しく出てきた"Range"ですが、
エクセルの関数で使ったりするココからココまでだよって意味です。
今回は例としてB列全体を指定しましたが、
変数の値を使って入れたい場合の入力例も後述で紹介します。
実行結果
最終行をプログラムを使って取得して変数として入力し、
"範囲"に反映させるやり方を一例として紹介します。
Sub 集計()
'変数名"x"をVariant方式で指定します
Dim x As Variant
'変数"x"にB列の最終行を調べる、B列なので2です
x = Cells(Rows.Count, 2).End(xlUp).Row
'セルのB2からB列の最終行までの"〇"を集計して、E2に出力する
Cells(2, 5) = WorksheetFunction.CountIf(Range(Cells(2, 2), Cells(x, 2)), "〇")
'確認用のメッセージボックス
MsgBox "B列の最終行は" & x & "行目"
End Sub
変数"x"にB列の最終行が何行目か確認して、
"範囲"にあたるRangeのココまでだよの所に変数"x"を指定します。
参考画像では最終的に"x"の変数は21になっています。
メッセージボックスの内容を最終行を求めた結果を出力するように修正して実行させました。
前述した通り、変数"x"は21になっている事がわかります。
最終行を取得する動きですが、
詳しい説明は次回説明します。(これだけで長くなります)