スポンサードリンク

ExcelVBA
ExcelVBA

ある文字列の中に指定文字が何文字あるかを調べたいことがありました。

VBAではそのような関数がないので自作するしかありません。

そこで、指定した文字が何文字あるのかを調べられる方法を作ってみました。

方法は3つあります。

スポンサードリンク

文字列の中に指定文字が何文字あるかカウントする方法

  • InStr関数を使って数える
  • Replace関数とLen関数を使って差を出す
  • Split関数で配列にしてUBound関数で数える

上記の3つの方法で文字列内の指定文字を数えることができます。

ひとつひとつ解説していきますね。

InStr関数を使って数える

InStr関数を使って文字を数えるという方法があります。

InStr関数は文字列から指定文字が何文字目にあるのかを教えてくれます。

InStr関数

InStr([開始位置], 文字列, 指定文字, [比較モード])

開始位置(省略可) 何文字目から検索するかを指定します
文字列 文字列を指定します
指定文字 検索する文字を指定します
比較モード(省略可) 大文字と小文字を区別して検索するかを指定します

比較モードは既定(省略の場合)では大文字と小文字を区別する「vbBinaryCompare」が設定されています。

区別しない場合は「vbTextCompare」を指定します。

InStr関数を使って数えてみよう

Sub Sample1()
    Dim Mojiretsu As String '文字列
    Dim Moji As String '指定文字
    Dim n As Long '個数
    Dim cnt As Long '文字カウント数

    Mojiretsu = "AA,BB,CC,DD,EE,FF,GG,HH"
    Moji = ","
    n=0 '個数を0に初期化

    Do
        n = InStr(n + 1, Mojiretsu, Moji)
        If n = 0 Then
            Exit Do
        Else
            cnt = cnt + 1
        End If
    Loop
    MsgBox "【,】は" & cnt & "個あります"
End Sub


文字列【AA,BB,CC,DD,EE,FF,GG,HH】から【,】の文字が何個あるのかを数えてみました。


        n = InStr(n + 1, Mojiretsu, Moji)

最初だと12行目の【InStr(1, “AA,BB,CC,DD,EE,FF,GG,HH”, “,”)】の内容になるため

結果は【3】となります。

        If n = 0 Then
            Exit Do
        Else
            cnt = cnt + 1
        End If

値が【3】なのでIF文により変数[cnt]に1が足されます。

その後、ループで戻り10

        n = InStr(n + 1, Mojiretsu, Moji)

2回目は12行目は【InStr(4, “AA,BB,CC,DD,EE,FF,GG,HH”, “,”)】の内容になるため

結果は4行目から数えて【6】となります。

これを繰り返して指定文字の【,】を数えています。

カウント結果
カウント結果

実行すると、結果は『【,】は7個あります』と表示されます。

スポンサードリンク

Replace関数とLen関数を使って差を出す

Replace関数とLen関数を使って差を出して文字を数えるという方法があります。

Len関数は文字列の数を数える関数で、

Replace関数は検索した文字を入れ替えることができる関数です。

Len関数

Len(文字列)

文字列 文字列を指定します

Replace関数

Replace(文字列, 検索文字, 置換文字, [開始位置], [置換回数], [比較モード])

文字列 文字列を指定します
検索文字 検索する文字を指定します
置換文字 置換する文字を指定します
開始位置(省略可) 何文字目から置換するかを指定します
置換回数(省略可) 検索文字が複数見つかったときに、何個置換するかを指定します
比較モード(省略可) 大文字と小文字を区別して検索するかを指定します

比較モードは既定(省略の場合)では大文字と小文字を区別する「vbBinaryCompare」が設定されています。

区別しない場合は「vbTextCompare」を指定します。

Replace関数とLen関数を使って数えてみよう

Sub Sample2()
    Dim Mojiretsu As String '文字列
    Dim Moji As String '指定文字
    Dim cnt As Long '文字カウント数

    Mojiretsu = "AA,BB,CC,DD,EE,FF,GG,HH"
    Moji = ","
    
    cnt = Len(Mojiretsu) - Len(Replace(Mojiretsu, Moji, ""))
    
    MsgBox "【,】は" & cnt & "個あります"
End Sub
Replace関数を使うと
Replace関数を使うと

Len関数で元々の文字数を数えて、Replace関数で【,】を空白に置き換えた文字列をLen関数で数えた数から引きます。

その差で【,】の個数がわかります。

カウント結果
カウント結果

実行すると、結果は『【,】は7個あります』と表示されます。

Split関数で配列にしてUBound関数で数える

Split関数で文字列を配列に変えて、その配列をUBound関数で数えてカウントします。

Split関数

Split(文字列, [区切り文字], [最大分割数], [比較モード])

文字列 文字列を指定します
区切り文字(省略可) 分割する区切り文字を指定します
最大分割数(省略可) 区切り文字で分割する最大数を指定します
比較モード(省略可) 大文字と小文字を区別して検索するかを指定します

比較モードは既定(省略の場合)では大文字と小文字を区別する「vbBinaryCompare」が設定されています。

区別しない場合は「vbTextCompare」を指定します。

UBound関数

UBound(配列, [次元])

配列 配列を指定します
次元(省略可) 配列の次元を指定します

※次元は配列の箱の順番です。

配列の次元イメージ
配列の次元イメージ

次元はカラーボックスでいうとカラーボックスの数が1次元、

棚段数が2次元のようなイメージです。

3次元になると・・・わかりませんw

Sub Sample3()
    Dim arr(0 To 1, 0 To 2) As Integer
    Dim dimension As Integer

    dimension = UBound(arr, 1) ' 1 次元は 0,1
    MsgBox dimension ' 1 最大インデックスを返す

    dimension = UBound(arr, 2) ' 2 次元は 0,1,2
    MsgBox dimension ' 2 最大インデックスを返す
End Sub

Split関数とUBound関数で数えてみよう

Sub Sample4()
    Dim Mojiretsu As String '文字列
    Dim Moji As String '指定文字
    Dim cnt As Long '文字カウント数

    Mojiretsu = "AA,BB,CC,DD,EE,FF,GG,HH"
    Moji = ","
    
    cnt = UBound(Split(Mojiretsu, Moji))
    
    MsgBox "【,】は" & cnt & "個あります"
End Sub

実行すると、結果は『【,】は7個あります』と表示されます。

Split関数で配列に変更して、配列の個数を数えます。

変更すると、[AA][BB][CC][DD][EE][FF][GG][HH]と配列が7個でします。

UBound関数は配列の最大インデックスを返してくれるため

配列はインデックスが【0】から始まるので、結果は【7】になります。

配列自体は8個ですが、今回は【,】の数を数えたいので

配列の最大インデックスと同じ結果になります。

スポンサードリンク

文字列の中にある指定文字を数える方法について

数え方としては3つ方法を書きましたが、他にも方法があると思います。

僕としては2番目に紹介したReplace関数とLen関数を使うのが簡単かなと思います。

他にも方法を見つけたらここで紹介しますね。

スポンサードリンク