4/23/2018

Excel。事務職のExcel VBA その26。特定の文字が含まれているかチェックする方法【Special character】

Excel。事務職のExcel VBA その26。特定の文字が含まれているかチェックする方法

<Excel VBA>

一般事務職の方でも、少し知っているだけでも、
効率的に作業効率をあげることができるようになる、Excel VBAを使って、
今回は、セル内に該当の文字が含まれているかどうか
判定する方法をご紹介していきましょう。

次の表があります。

B列の市区町村にあるデータの中から、
「横浜市西区」のデータがあるのかないのかをチェックして、
C列に該当データがある場合には、”○”を表示することをしたいのですが、
通常のExcelだと、

=IF(COUNTIF(B4,"横浜市西区"&"*"),"○","")

という、IF+COUNTIF関数のネスト技を使う必要があります。

この数式の作り方を知っていればいいのですが、
データをインポートするたびに、この数式を作るというのは、
なかなか面倒ですし、
実際、このIF+COUNTIF関数のネスト技を覚えている・
気づく人は少ないかと思われます。

では、Excel VBAで、
「横浜市西区」という文字の有無がわかるExcel VBAの構文を
確認してみましょう。

Sub 文字を含む()
    Dim i As Long
    Dim r As Long
    r = Cells(Rows.Count, "a").End(xlUp).Row
    For i = 1 To r
        If InStr(Cells(i, 2), "横浜市西区") <> 0 Then
            Cells(i, 3) = "○"
        End If
    Next
End Sub

今回のケースは、セルのデータと等しいということではなくて、
その一部の有無なので、=(イコール)で判定する方法は使えません。

また、Excel VBAには、
含まれているかどうか】を判断できる記号(演算子)は
残念ながらありません。

そこで、InStr関数を使ってみると、対応できます。

InStr(インストリング)関数は、文字列の中から指定した文字列を検索し、
最初に見つかった文字の位置を算出する関数です。

まずは、実行してみましょう。

「横浜市西区」という文字があることを判断することが出来ましたね。
では、構文を確認してみましょう。

Dim i As Long
Dim r As Long
お馴染みの変数の宣言文ですね。

r = Cells(Rows.Count, "a").End(xlUp).Row
これもお馴染みのデータの最終行番号を算出する方法ですね。

For i = 1 To r
    If InStr(Cells(i, 2), "横浜市西区") <> 0 Then
        Cells(i, 3) = "○"
    End If
Next

For文で1~最終行まで繰り返し実行させます。
If InStr(Cells(i, 2), "横浜市西区") <> 0 Then
ここが、今回の心臓部ですね。

cells(i,2)は、B1のセルを指します。B1は見出しかもしれませんが、
今回の文字とは合致することはないので、1行目から実行させました。

そのB1に、”横浜市西区”という文字が、InStr。

つまりその文字があれば、その開始位置の数値を算出しますし、
なければ、0(ゼロ)を算出します。

最終的に、この一文は、
InStrを使って算出した結果が「<>0」。ゼロでなかったら
ということですね。

もしも、ゼロでなければ、
Cells(i, 3) = "○"
C列に○を表示してください。
という処理をしているわけですね。

これで、結果を求めることが出来ましたね。

InStr関数って便利だなぁ~と思っても、
通常のExcel関数にはありませんのでご注意ください。