Developer

【ExcelVBA】VBAの関数 文字列操作①
2022.08.31
Lv1

【ExcelVBA】VBAの関数 文字列操作①

VBA関数

VBAを利用することでエクセルのデータを整形したり、複数のシートのデータをまとめて帳票したりといったことができるようになります。
こうした業務効率化のツールなどを作成する際に、すべての処理を自身でコーディングすると開発時間がかかってしまいます。
そこで開発の際によく利用される機能がVBA関数として用意されています。
これらの関数を使用することで、自身で同様の処理を記述するよりも効率よくアプリケーションの開発ができるようになります。
ここからはそうしたVBA関数をいくつか見ていきましょう。

InStr関数

文字列の操作はセルのデータの整形をする際などに必要となります。
文字列の操作関数をいくつか紹介します。
InStr関数は文字列の中から指定した文字列が最初に含まれる場所を返す関数です。
エクセルの各行に記載されている文字列からある単語が含まれている行だけを抽出するといった処理を行いたい際にInStr関数を使用するで実現できます。
InStr関数は以下の構文となっています。

InStr([開始位置], 検索対象文字列, 検索文字列, [比較の種類])

・開始位置
開始位置は省略可能な引数です。文字列の検索開始位置を指定します。
省略可能といいましたが、比較の種類を指定する場合は指定しなければなりません。

・検索対象文字列
検索文字列を探す元となる文字列を指定します。

・検索文字列
検索対象文字列の中から探したい文字列を指定します。

・比較の種類
比較の方法を指定します。
vbBinaryCompareを指定した場合はバイナリ比較を実行します。「大文字と小文字」「カタカナとひらがな」が区別されることになります。
vbTextCompareをテキスト比較を実行します。「大文字と小文字」「カタカナとひらがな」が区別されません。

InStr関数を実行した時の戻り値は以下のようになります。

検索対象文字列が0文字 0
検索対象文字列がnull null
検索文字列が0文字 startで指定した値
検索文字列がnull null
文字列が見つかった 見つかった位置
文字列が見つからない 0

InStrの使い方

ではサンプルコードで使い方を見ていきましょう。
エクセルの各行に以下のような文字列が入力されています。

この中から東京が含まれている行が何行あるのかを探す処理のサンプルです。

Sub VBA基礎第38回_1()
    Dim cnt As Integer
    Dim str As Variant
    sum = 0
   
    '範囲内のデータを読み込んでいく
    For Each str In Range("A1:A8")
        result = InStr(str, "東京")        '東京都が含まれるかを探す
        If result > 0 Then
            cnt = cnt + 1                                        '含まれていたらカウントする
        End If
        
    Next
    
    MsgBox cnt & "行該当します"
       
End Sub

前回説明したFor Each~Nextを使用してA1からA8までの文字列を順番に読み込んでいます。
InStrで読み込んだ文字列が格納されている変数strから東京を検索し、その結果の戻り値を変数resultに代入しています。
検索文字列が含まれていた場合その位置がresultは0より大きな値となり、なかった場合は0となるため、Ifステートメントで0より大きい場合にカウントを1増やすようにしています。
実行結果は以下のようになります。

東京で検索しているため2行が該当します。
東京の代わりにサイタマで検索するとどうなるのか試してみましょう。
コードを以下のように変えます。

Sub VBA基礎第38回_2()
    Dim cnt As Integer
    Dim str As Variant
    sum = 0
   
    '範囲内のデータを読み込んでいく
    For Each str In Range("A1:A8")
        result = InStr(1, str, "サイタマ", vbTextCompare)        '東京都が含まれるかを探す
        If result > 0 Then
            cnt = cnt + 1                                        '含まれていたらカウントする
        End If
        
    Next
    
    MsgBox cnt & "行該当します"
       
End Sub

実行結果は以下のようになります。

今回はvbTextCompareを指定し、比較の際に「大文字と小文字」「カタカナとひらがな」を区別しないようにしています。
そのため実際の文字列はひらがなで「さいたま」となっていますがカタカナで検索しても該当していると判定されます。
vbBinaryCompareを指定すると該当しなくなります。
また上記のコードでサイタマを「tokyo」に変更すると1行該当します。大文字と小文字が区別されないためです。
これもvbBinaryCompareを指定すると該当しなくなります。

まとめ

VBA関数を使用することで、自身で同様の処理を記述するよりも効率よくアプリケーションの開発ができるようになります。
文字列からある文字列を検索することができるVBA関数がInStrです。

確認問題

以下のコードの○○〇にコードを入れて、変数strの内容がxlsmファイル(拡張子.xlsm)かどうか判定する処理を完成させてください。
大文字小文字の区別はしないこととします。

Sub VBA基礎第38回_2()
    Dim str As String
    Dim result As Integer
   
    str = "VBA.xlsm"
    result = 〇〇〇
    If result > 0 Then
        MsgBox "xlsmファイルです"
    Else
        MsgBox "xlsmファイルではありません"
    End If
       
End Sub
答え


.xlsmが含まれているか確認すればよいので文字列に.xlsmが含まれるかを確認します。
解答例
[vb] Sub VBA基礎第38回_2()
Dim str As String
Dim result As Integer

str = "E:\Users\user01\Desktop\VBA.xlsm"
result = InStr(1, str, ".xlsm", vbTextCompare)
If result > 0 Then
MsgBox "xlsmファイルです"
Else
MsgBox "xlsmファイルではありません"
End If

End Sub
[/vb]

次回は、「【ExcelVBA】VBAの関数 文字列操作②」です。

 

連載目次リンク

ExcelVBA 入門 連載目次