Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力

vbainsteeyecatch

文字列操作関数の中でもInStr関数・InStrRev関数は、最重要です。
この関数により、指定の文字が文字列のどの位置にあるかが取得できます。

こんにちは、じゅんぱ店長(@junpa33)です。

今回のテーマは、「InStr関数」「InStrRev関数」についてです。

「InStr関数」「InStrRev関数」は、指定の文字列の中に特定の文字(列)が含まれているかどうか検索します。

InStr関数・InStrRev関数とは

vbainstrp007
  • 「InStr関数」は、検索対象の文字列の中に、指定した特定の文字(列)が含まれているかを検索します。
    もしその文字が、検索対象の文字列の中に含まれているなら、
    最初に見つかった文字位置(左から何番目)を返します。
    もしその文字が、検索対象の文字列の中に含まれていないなら、
    値で0を返します。
  • 「InStrRev関数」は、検索を検索対象の文字列の右側から始めます。
    最初に見つかった文字位置(左から何番目)を返します。
    もしその文字が、検索対象の文字列の中に含まれていないなら、
    値で0を返します。

InStr関数の構文

構文

InStr ( [ 開始位置 , ] 文字列 , 検索する文字(列)  [ , 比較のモード] )

[ ]内は省略可能

開始位置 省略可 検索の開始位置を指定
省略の時は先頭から検索
Null 値の場合はエラーが発生する
文字列検索する指定の文字が含まれる検索元の文字列
検索する文字列検索したい文字(列)
比較のモード 省略可 [ 開始位置 ]と同時指定必須バイナリモードで比較。大小文字区別 値「0」
テキストモードで比較。大小文字区別しない 値「1」

InStrRev関数の構文

InStr関数との構文の違いに注意が必要です。

構文

InStrRev ( 文字列 , 検索する文字(列) , [ 開始位置 [ , 比較のモード] ] )

[ ]内は省略可能

文字列検索する指定の文字が含まれる検索元の文字列
検索する文字列検索したい文字(列)
開始位置 省略可 検索の開始位置を指定
省略の時は先頭から検索
Null 値の場合はエラーが発生する
比較のモード 省略可 [ 開始位置 ]と同時指定必須バイナリモードで比較。大小文字区別 値「0」
テキストモードで比較。大小文字区別しない 値「1」

InStr関数・InStrRev関数の使用例

vbainstrpp008

文字が存在するかどうかを調べる

InStr関数は、検索したい文字が検索元の文字列に存在すれば、

その文字位置を数値で返します。

つまり、存在が確認できれば、数値「0」以外を返すということです。

これを判断基準にします。

Instr関数サンプル1
VBA
Option Explicit

Sub Instr関数サンプル1()
    Dim TestSent As String
    Dim SeaWord As String
    Dim CoNo As Long
        TestSent = Range("C2")
        SeaWord = Range("C3")
'Instr関数で存在を検索する
        CoNo = InStr(TestSent, SeaWord)
        If CoNo <> 0 Then
            MsgBox True & " 検索ワード " & SeaWord & _
                      " は文章内にあります。"
        Else
            MsgBox False & " 検索ワード " & SeaWord & _
                      " は文章内にありません。"
        End If
End Sub

結果、検索したいものが「文字」であっても「文字列」であっても正しく検索することが出来ています。

検索条件入力1

vbainstr001a

結果表示1

vbainstr001_1

検索条件入力2

vbainstr002a

結果表示2

vbainstr002_1

検索条件入力3

vbainstr003a

結果表示3

vbainstr003_1

「絶対パス+ファイル名」から「ファイル名」だけを取り出す

” ファイル名を取り出す ” お仕事は「InStrRev関数」の得意技でもあります。

このケースでは、InStrRev関数を使った方が簡単にコードを作ることが出来ます。

inStrRev関数サンプル2
VBA
Sub InstrRev関数サンプル2()
    Dim MyPass, Fname As String
    Dim n As Long
        MyPass = "C:\Users\owner\Documents\sample.xlsx"
'文字列の右から数えて最初の「\」の位置を調べる
        n = InStrRev(MyPass, "\")
'Len関数で文字列の全体の文字数を数えている
'Right関数で文字列の右から必要数の文字を切り取る
        Fname = Right(MyPass, Len(MyPass) - n)
        MsgBox "ファイル名は " & Fname
End Sub

結果表示

vbainstr004

参考記事

  • Right関数の使い方について詳しくはこちらです。
vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出す
  • Len関数の使い方について詳しくはこちらです。
vbaleneyecatch Len関数・LenB関数で文字列の文字数を調べる
  • MsgBoxの使い方について詳しくはこちらです。
vbamsgboxeyecatch メッセージボックス MsgBox実際の使い方を最速に理解

InStrRev関数を使わないで、InStr関数で同じ内容をコード化します。

Instr関数サンプル2
VBA
Sub Instr関数サンプル2()
    Dim MyPass, Fname As String
    Dim n As Long
        MyPass = "C:\Users\owner\Documents\sample.xlsx"
'MyPassの中に「\」記号が無くなるまでループします
        Do Until InStr(MyPass, "\") = 0
            n = InStr(MyPass, "\")
            MyPass = Mid(MyPass, n + 1)
        Loop
        MsgBox "ファイル名は " & MyPass
End Sub

結果表示

vbainstr005

参考記事

  • Do Until ・・・Loop の使い方について詳しくはこちらです。
vbadoloopeyecatch VBA 回数不定のループ処理はDo LoopとFor Each

「絶対パス+ファイル名」から「フォルダ名」と「ファイル名」を取り出す

絶対パスの「¥」記号は、一つの長い文字列の中で何回も出現します。

それぞれの「¥」を、文字何個目に出現するかを変数に代入して記録しておけば、

ただ出現数を数えるだけでなく、他にもいろんな使い道を考えることが出来ます。

InStr関数サンプル3
設定する変数

今回使用する変数です。

  • MyPassD ・・・・ 絶対パスの初期状態
  • MyPass・・・・ 絶対パスを変数として代入する
  • No() ・・・・ 「¥」記号の存在する文字位置を配列の要素として格納
  • n ・・・・ ループカウント変数
  • p ・・・・ 「¥」記号の数を変数に代入する
  • r ・・・・ 「¥」記号の存在位置(何個目)
  • kazu ・・・・ 実行結果表示のための文字列型変数(文字列積算表示)
チェックポイント

変数の設定で、どうしてMyPassDとMyPassを作っているのか?
MyPass は、変数としてその都度代入される値が変化します。
VBAコードの終了時には、MyPassDとは全く違うものになっています

VBA
Sub Instr関数サンプル3()
    Dim MyPassD, MyPass As String
    Dim No() As Long
    Dim n, p, r As Long
    Dim kazu As String
        MyPassD = "C:\Users\owner\Documents\sample.xlsx"
        MyPass = "C:\Users\owner\Documents\sample.xlsx"
'「\」記号が全部でいくつあるかを計算します
        p = Len(MyPass) - Len(Replace(MyPass, "\", ""))
'配列変数を再定義します
        ReDim No(p)
        r = 0
        For n = 1 To p
'「\」記号がいくつ目にあるかを調べます
            r = InStr(MyPass, "\")
            If r = 0 Then
                Exit For
            Else
'「\」が見つかった位置の文字数を配列の要素として代入します
                No(n) = r
'次の「\」を見つけるために文字列を修正します。
                MyPass = Mid(MyPass, r + 1)
                kazu = kazu & No(n) & ","
            End If
        Next n
        MsgBox "この絶対パスは、" & vbCrLf & _
                    "¥記号は " & kazu & "番目にあります" & vbCrLf & _
                Left(MyPassD, No(1) - 2) & vbCrLf & _
                Mid(MyPassD, No(1) + 1, No(2) - 1) & vbCrLf & _
                Mid(MyPassD, No(1) + No(2) + 1, No(3) - 1) & vbCrLf & _
                Mid(MyPassD, No(1) + No(2) + No(3) + 1, _
                                           No(4) - 1) & vbCrLf & _
                Right(MyPassD, Len(MyPassD) - No(1) - No(2) _
                                     - No(3) - No(4)) & vbCrLf & _
                    "のフォルダ・ファイル構成になっています。"
End Sub

結果表示

vbainstr006

参考記事

  • 一次元配列変数(動的配列)の使い方について詳しくはこちらです。
vbahairetueyecatch 1次元配列とは。静的配列と動的配列 エクセルVBA

InStr関数・InStrRev関数で文字列を検索のまとめ

vbainstrpp009

InStr関数・InStrRev関数での文字列の検索方法について説明しました。

InStr関数・InStrRev関数を使うと指定した文字(列)の位置を取得することができます。

その位置を使えば分割位置など目盛基準として、文字列操作をすることもできます。

InStr関数・InStrRev関数は、文字列操作系の関数の中でも最重要のものになっています。

このような基礎ベースの重要関数は、学習ツールを使ってきっちりと習得できるようにしておきましょう。

是非覚えておきたい関数だと思います。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。