【マクロVBA】対象の文字が何個・何文字あるかInStr関数で求める!変数・セルに対応

検索・置換

今回は対象の文字が何文字含まれているか確認する方法について紹介したいと思います。
使用する関数はInStr関数となります。

ただし、今回は応用編なので、基礎編については下記の記事をご覧ください。

【マクロVBA】対象のセル・変数に指定した文字・数値が含まれているかInStrで確認する ► 独学エクセル塾 (dokugakuexcel.com)

対象の文字が何文字目に含まれているか確認できる
InStr関数ですが、応用することで何個・何文字含まれているか
求めることができます。

是非参考にしてみてください。
それでは見ていきましょう。




⬛︎こんなことができるようになる!

対象の文字が何文字あるか個数を確認することができる。

⬛︎忙しい人向けのコピペ用ソースコード

Sub 対象の文字が何個含まれているか調査()
Dim Counter, N
 Counter = 0
 N = 1
Do
 N = InStr(N + Counter, 検索したいセル・変数, "確認したい文字")
  If N = 0 Then
   Exit Do
  Else
   Counter = Counter + 1
  End If
Loop

MsgBox "対象の文字は" & Counter & "個あります。"
End Sub

■構文の説明

まず、使用する関数についてですが「InStr関数」になります。
関数仕様としては下記の通りです。

InStr([検索開始位置],検索対象,検索文字・数値,[検索の種類])

[ ]」は省略可能となっています。

[検索の種類]ではバイナリモードかテキストモードを
選択することができます。

バイナリモードの場合はvbBinaryCompare
テキストモードの場合はvbTextCompareを入力します。

ただし、省略した場合はバイナリモードになるので
バイナリモードの場合は未入力でかまいません。

各モードの検索方法は下記の通りです。

モード 入力文字 機能
バイナリ vbBinaryCompare 全角・半角の区別、大文字・小文字の区別をする
テキスト vbTextCompare 全角・半角の区別、大文字・小文字の区別をしない

⬛︎対象の文字の数を求める

・例①

では、実際にInStr関数を使用して対象の文字の個数を求めたいと思います。
下記の見本をご覧ください。

今回はセル番地「B3」の文字列に「A」が何個含まれているか求めたいと思います。
では見本のソースコードをご覧ください。

Sub 対象の文字が何個含まれているか調査()
 Dim Counter, N
 Counter = 0
 N = 1
Do
 N = InStr(N + Counter, Range("B3"), "A")
  If N = 0 Then
   Exit Do
  Else
   Counter = Counter + 1
  End If
Loop

MsgBox "対象の文字は" & Counter & "個あります。"
End Sub

では、仕組みを紹介したいと思います。

まず、対象をセル番地B3にしています。
そこから今回は「A」が何文字含まれているか確認したいと思います。

検索の開始位置を変数「N」としており
初めは1文字目から検索を行います。

 

1週目の結果として「A」は1文字目にあるので
変数「N」に「1」が格納されます。

そして、文字のカウントの変数「Counter」を+1します。

そして、この処理をループ処理することにより
文字を繰り返し検索するメカニズムになっています。

続いて2週目では、
開始位置を「N+Counter」していることにより、先程の検索に引っかかった「1文字目のA」は除外するようになります。

その後は検索に文字が引っかかるたびに「Counter」を+1することで

対象の文字が何文字あるかカウントします。

 

そして、検索に引っかからなくなった場合,
InStr関数の結果は「0」
になるわけですから、「If N = 0 Then Exit Do」でループを抜け出します。

以上が説明になります。

では、実際に走らせてみたいと思います。

実行した結果はこちらです。

「ABCADEAF」には「A」が3文字含まれているので
「対象の文字は3個あります」というメッセージボックスが結果として表示されました。

・例②

さらにB3を「BCDEFCD」にして「CD」を検索しましょう。

Sub 対象の文字が何個含まれているか調査()
 Dim Counter, N
 Counter = 0
 N = 1
Do
 N = InStr(N + Counter, Range("B3"), "CD")
  If N = 0 Then
   Exit Do
  Else
   Counter = Counter + 1
  End If
Loop

MsgBox "対象の文字は" & Counter & "個あります。"
End Sub

結果はこのようになりました。

「BCDEFCD」には「CD」という文字が2つあるので

「2」を出力しています。

文字数が増えてもうまく機能していますね。

⬛︎よくあるエラーと対処法

・文字が大文字・小文字で異なる

検索の対象または対象となる文字が
大文字と小文字で異なる場合はうまく検索できません

先ほどの見本で小文字の「」を検索してみましょう。

Sub 対象の文字が何個含まれているか調査()
 Dim Counter, N
 Counter = 0
 N = 1
Do
 N = InStr(N + Counter, Range("B3"), "d")
  If N = 0 Then
   Exit Do
  Else
   Counter = Counter + 1
  End If
Loop

MsgBox "対象の文字は" & Counter & "個あります。"
End Sub

結果はこのようになります。

検索文字が小文字のために「D」を検出できていません

では、再度構文を見てみましょう。
InStr([検索開始位置],検索対象,検索文字・数値,[検索の種類])

冒頭で検索の種類は「バイナリモード」と「テキストモード」があると説明しました。

モード 入力文字 機能
バイナリ vbBinaryCompare 全角・半角の区別、大文字・小文字の区別をする
テキスト vbTextCompare 全角・半角の区別、大文字・小文字の区別をしない


省略していた場合は「バイナリモード」となり、大文字・小文字を区別します。

つまり、大文字と小文字を区別しないテキストモードに変更すればいいのです。

なので検索の方法に「vbTextCompare」を追加すれば大文字と小文字を区別しなくなります。

N = InStr(N + Counter, Range("B3"), "d", vbTextCompare)

実行した結果はこちらです。

小文字の「d」で検索したにもかかわらず大文字の「D」をカウントしてくれました。

 

・文字が全角・半角で異なる

こちらも先程のエラーと同様です。
検索方法をテキストモードに変えることにより、全角半角
どちらでも検索できるようになります。

■練習問題

練習問題も別の記事でまとめているので是非参考にしてみてください!

 

⬛︎公式の説明

わかりやすいように説明したため公式と使用する語句が異なりますが
マイクロソフト公式の説明については下記のリンクを参照してください☟

InStr関数(Visual Basic for Applications) | Microsoft Learn

⬛︎まとめ

いかがだったでしょうか。
InStr関数を応用することで対象の文字が何文字あるか検出することができます。

是非参考にしてみてください。

それでは次回の記事でお会いしましょう。

コメント