【Excel VBA】COUNTIF関数とワイルドカードで部分一致するセルを高速カウントする方法

アンケート結果の集計などで、「”東京”という文字が含まれる回答は何件あるか?」といった、特定の文字列を含む(部分一致)セルの個数を数えたい場面はよくあります。

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プログラミングにおける非常に重要なスキルです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次