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

vbainsteeyecatch

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

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

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

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

「関数リファレンス」を調べる

InStr関数・InStrRev関数とは

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

InStr関数の構文

必要なもの

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

[ ]内は省略可能

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

InStrRev関数の構文

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

必要なもの

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

[ ]内は省略可能

文字列 検索する指定の文字が含まれる検索元の文字列
検索する文字列 検索したい文字(列)
開始位置 省略可 
検索の開始位置を指定
省略の時は先頭から検索
Null 値の場合はエラーが発生する

比較のモード 省略可 [ 開始位置 ]と同時指定必須 バイナリモードで比較。大小文字区別 値「0」
テキストモードで比較。大小文字区別しない 値「1」

InStr関数・InStrRev関数の使用例
ファイルパス取得に威力

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

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

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

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

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

Instr関数サンプル1

コード

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

コード

Sub InstrRev関数サンプル2()

    Dim MyPass As String, 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

MEMO

Right関数の使い方について詳しくはこちらです。

vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出します

Len関数の使い方について詳しくはこちらです。

vbaleneyecatch Len関数・LenB関数で文字列の文字数を知る方法。使用例で解説します

MsgBoxの使い方について詳しくはこちらです。

vbamsgboxeyecatch メッセージボックス MsgBox実際の使い方を最速に理解

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

Instr関数サンプル2

コード

Sub InStr関数サンプル2()

    Dim MyPass As String, Fname As String
    Dim n As Long
    
        MyPass = "C:\Users\owner\Documents\sample.xlsx"
        'MyPassの中に「\」記号が無くなるまでループします
        Do Until InStr(MyPass, "\") = 0
            n = InStr(MyPass, "\")
     'Mid関数で文字列の左からn+1の位置から末まで切り取る
            MyPass = Mid(MyPass, n + 1)
        Loop

    MsgBox "ファイル名は " & MyPass
End Sub

結果表示

vbainstr005

MEMO

Do Until ・・・Loop の使い方について詳しくはこちらです。

vbadoloopeyecatch VBA 回数不定のループ処理はDo LoopとFor Each

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

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

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

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

InStr関数サンプル3

設定する変数
今回使用する変数です。

  • MyPassD ・・・・ 絶対パスの初期状態
  • MyPass・・・・ 絶対パスを変数として代入する
  • No() ・・・・ 「¥」記号の存在する文字位置を配列の要素として格納
  • n ・・・・ ループカウント変数
  • p ・・・・ 「¥」記号の数を変数に代入する
  • r ・・・・ 「¥」記号の存在位置(何個目)
  • kazu ・・・・ 実行結果表示のための文字列型変数(文字列積算表示)
チェックポイント
変数の設定で、どうしてMyPassDとMyPassを作っているのか?
MyPass は、変数としてその都度代入される値が変化します。
VBAコードの終了時には、MyPassDとは全く違うものになっています。

コード

Sub InStr関数サンプル3()

    Dim MyPassD As String, MyPass As String
    Dim No() As Long
    Dim n As Long, p As Long, 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関数で文字列を検索のまとめ

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

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

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

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

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

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

短期間でエクセルVBAの独学習得を目指したいなら

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

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

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

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