アンケート結果の集計などで、「”東京”という文字が含まれる回答は何件あるか?」といった、特定の文字列を含む(部分一致)セルの個数を数えたい場面はよくあります。
VBAのFor
ループとLike
演算子を使えばこの処理は実現できますが、データ量が多いと非常に時間がかかってしまいます。
より高速でシンプルな解決策は、VBAからワークシート関数のCOUNTIF
を、ワイルドカード(*
)と組み合わせて利用することです。この記事では、2つの方法を比較し、WorksheetFunction.CountIf
を使った効率的なアプローチを解説します。
方法1:ループ処理で1セルずつ判定する方法(非推奨)
まず、VBAの基本的な命令だけで部分一致するセルを数えるコードです。Like
演算子とワイルドカード*
(アスタリスク)を使います。
Sub CountPartialMatchWithLoop()
Dim searchArea As Range
Dim cell As Range
Dim matchCount As Long
Set searchArea = ThisWorkbook.Worksheets("Data").Range("A1:E5000")
matchCount = 0
' 5000個のセルを1つずつチェック
For Each cell In searchArea
' Like演算子で「東京」という文字を含むか判定
If cell.Value Like "*東京*" Then
matchCount = matchCount + 1
End If
Next cell
ThisWorkbook.Worksheets("Summary").Range("B1").Value = matchCount
MsgBox "ループ処理が完了しました。"
End Sub
このコードはロジックは分かりやすいですが、数千〜数万のセルを一つずつチェックするため、実行に時間がかかるのが大きなデメリットです。
方法2:WorksheetFunction.CountIf を使う方法(強く推奨)
次に、Excelの高速な計算エンジンを利用する、WorksheetFunction.CountIf
を使った方法です。
コードと解説
Sub CountPartialMatchWithCountIf()
' 変数を宣言します
Dim searchArea As Range
Dim searchTerm As String
Dim criteriaString As String
Dim matchCount As Long
'--- 設定 ---
Set searchArea = ThisWorkbook.Worksheets("Data").Range("A1:E5000") ' 検索対象範囲
searchTerm = "東京" ' 検索したい文字列
'--- 設定ここまで ---
' 1. ワイルドカード「*」を付けた検索条件の文字列を作成
criteriaString = "*" & searchTerm & "*"
' 2. WorksheetFunction.CountIf で一括カウント
matchCount = WorksheetFunction.CountIf(searchArea, criteriaString)
' 3. 結果をセルに出力
ThisWorkbook.Worksheets("Summary").Range("B1").Value = matchCount
MsgBox "COUNTIFで「" & searchTerm & "」を含むセルの数を取得しました: " & matchCount & "件"
End Sub
このコードは、データ量がどれだけ多くてもほぼ一瞬で処理が完了します。
コードのポイント解説
ワイルドカードを使った検索条件
criteriaString = "*" & searchTerm & "*"
COUNTIF
で部分一致の検索を行うための鍵が、この一行です。検索したい文字列(searchTerm
)の前後に、ワイルドカードであるアスタリスク(*
)を&
で連結しています。
アスタリスク*
は「任意の0文字以上の文字列」を意味します。そのため、"*東京*"
という検索条件は、「文字列のどこかに”東京”が含まれている」という意味になり、”西東京”、”東京本社”、”東京都”のすべてに一致します。
WorksheetFunction.CountIf
matchCount = WorksheetFunction.CountIf(searchArea, criteriaString)
VBAからCOUNTIF
関数を呼び出します。
- 第1引数
searchArea
: 検索対象のセル範囲 - 第2引数
criteriaString
: ワイルドカードを含んだ検索条件の文字列
まとめ
方法 | 長所 | 短所 |
ループ処理 | ロジックが直感的。 | データ量が多いと非常に遅い。 |
ワークシート関数 | 圧倒的に高速。コードが簡潔。 | 特になし。 |
Google スプレッドシートにエクスポート
SUMIF
のケースと同様に、条件に一致するセルの個数を数える場合は、迷わずWorksheetFunction.CountIf
を使いましょう。
Excelが元々持っている強力な関数をVBAから利用することは、処理速度とコードの簡潔さを両立させるための基本であり、VBAプログラミングにおける非常に重要なスキルです。