VBA 文字列を検索する

はじめに

Excel VBA マクロの文字列 (String) を検索する方法を紹介します。

InStr 関数」から、文字列を検索できます。

見つかった位置を取得できます。見つからないときは 0 になります。

大文字と小文字、半角と全角、ひらがなとカタカナを区別するかしないかを選択できます。

Unicode 文字を扱うには「文字コードを変換や判定する」をご覧ください。
  • 目次
    • 文字列を検索する
    • 後ろから文字列を検索する
    • セルの値を検索する

文字列を検索する

InStr 関数」を使用して、文字列を検索できます。最初に見つかった位置を取得できます。見つからないときは 0 を返します。

引数には (検索元, 検索ワード) を指定します。

Dim l As Long
l = InStr("ABCDEF", "C")  ' C を検索する
Debug.Print(l) ' 3

l = InStr("ABCDEF", "あ") ' あ を検索する
Debug.Print(l) ' 0

すべて検索

キーワードが複数見つかるときは、最初に見つかった位置を取得します。2 番目以降に見つかった位置を取得したいときは、第 1 引数に検索の開始位置を指定できます。1 が最初の文字です。

このときの引数には (開始位置, 検索元, 検索ワード) を指定します。「InStr 関数」は最初の引数を省略できる変わった関数です。

Dim l As Long ' 開始位置
l = 0

Do
    l = InStr(i + 1, "ABCABCABC", "A") ' A をすべて検索する
    Debug.Print(l) ' 1 4 7 0  
Loop Until i = 0

0 が返ってきたら、すべて検索したことになります。

大文字と小文字

第 4 引数で「大文字と小文字」、「半角と全角」、「ひらがなとカタカナ」を区別できます。この引数を指定するときは、必ず第 1 引数の開始位置も指定する必要があります。

  • vbBinaryCompare (既定):区別する
  • vbTextCompare:区別しない
Dim l As Long

l = InStr(1, "abcABC", "A", vbBinaryCompare) ' 区別する
Debug.Print(l) ' 4

l = InStr(1, "abcABC", "A", vbTextCompare)   ' 区別しない
Debug.Print(l) ' 1

l = InStr(1, "アイウアイウ", "ア", vbBinaryCompare) ' 区別する
Debug.Print(l) ' 4

l = InStr(1, "アイウアイウ", "ア", vbTextCompare)   ' 区別しない
Debug.Print(l) ' 1

l = InStr(1, "あいうアイウ", "ア", vbBinaryCompare) ' 区別する
Debug.Print(l) ' 4

l = InStr(1, "あいうアイウ", "ア", vbTextCompare)   ' 区別しない
Debug.Print(l) ' 1

後ろから文字列を検索する

InStrRev 関数」を使用して、文字列を後ろから検索できます。最初に見つかった左からの位置を取得できます。見つからないときは 0 を返します。

引数には (検索元, 検索ワード) を指定します。

Dim l As Long
l = InStrRev("ABCABC", "A")  ' A を後ろから検索する
Debug.Print(l) ' 4

l = InStrRev("ABCABC", "あ") ' あ を後ろから検索する
Debug.Print(l) ' 0

開始位置を指定したり、大文字と小文字を区別するか選択もできます。

セルの値を検索する

Range.Find メソッドから、セルの値を検索できます。

セルの範囲「A1」~「B2」の 検索 を検索するには Range("A1:B2").Find("検索") を入力します。

Dim c As Range
Set c = Range("A1:B2").Find("検索", SearchOrder:=xlByRows)    ' 行方向に検索
Set c = Range("A1:B2").Find("検索", , xlFormulas, xlPart, xlByRows, xlNext, False, False, False)
Debug.Print(c.Address) ' $B$1

Set c = Range("A1:B2").Find("検索", SearchOrder:=xlByColumns) ' 列方向に検索
Set c = Range("A1:B2").Find("検索", , xlFormulas, xlPart, xlByColumns, xlNext, False, False, False)
Debug.Print(c.Address) ' $A$2
詳しくは「セルを検索する」をご覧ください。