文字列操作関数の中でも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」以外を返すということです。
これを判断基準にします。
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
結果表示2
結果表示3
「絶対パス+ファイル名」から「ファイル名」だけを取り出す
” ファイル名を取り出す ” お仕事は「InStrRev関数」の得意技でもあります。
このケースでは、InStrRev関数を使った方が簡単にコードを作ることが出来ます。
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
- Right関数の使い方について詳しくはこちらです。
- Len関数の使い方について詳しくはこちらです。
- MsgBoxの使い方について詳しくはこちらです。
InStrRev関数を使わないで、InStr関数で同じ内容をコード化します。
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
- Do Until ・・・Loop の使い方について詳しくはこちらです。
「絶対パス+ファイル名」から「フォルダ名」と「ファイル名」を取り出す
絶対パスの「¥」記号は、一つの長い文字列の中で何回も出現します。
それぞれの「¥」を、文字何個目に出現するかを変数に代入して記録しておけば、
ただ出現数を数えるだけでなく、他にもいろんな使い道を考えることが出来ます。
今回使用する変数です。
- MyPassD ・・・・ 絶対パスの初期状態
- MyPass・・・・ 絶対パスを変数として代入する
- No() ・・・・ 「¥」記号の存在する文字位置を配列の要素として格納
- n ・・・・ ループカウント変数
- p ・・・・ 「¥」記号の数を変数に代入する
- r ・・・・ 「¥」記号の存在位置(何個目)
- kazu ・・・・ 実行結果表示のための文字列型変数(文字列積算表示)
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
- 一次元配列変数(動的配列)の使い方について詳しくはこちらです。
InStr関数・InStrRev関数で文字列を検索のまとめ
InStr関数・InStrRev関数での文字列の検索方法について説明しました。
InStr関数・InStrRev関数を使うと指定した文字(列)の位置を取得することができます。
その位置を使えば分割位置など目盛基準として、文字列操作をすることもできます。
InStr関数・InStrRev関数は、文字列操作系の関数の中でも最重要のものになっています。
このような基礎ベースの重要関数は、学習ツールを使ってきっちりと習得できるようにしておきましょう。
是非覚えておきたい関数だと思います。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。