テキストからある文字列を検索し、それより右側を取得するコードを解説します。
捉え方が違うだけで同じことなので、ある文字列から左側を削除するとも言えますね。
はじめに
今回のコードは文字列操作の基本Mid関数とInstr関数を使って処理をする場合、
' 1文字を探す場合 左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字) + 1) ' 2文字以上の文字列を探す場合 左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列))
と、割とめんどくさいコードになります。
↑の基本の書き方も重要なので覚える必要があると思いますが、
元の文字列にそこまで癖がないときは、↓の技も使えます。
' Split関数を利用した短縮技 左側を削除した文字列 =Split(元の文字列, 検索文字列)(1)
Split関数で文字列を分割する方法だと、かなり短く書くことができます。
※ 文字列が1回しか出てこない場合限定です
まずは文字列操作の基本であるRight/Mid/Instr関数から解説しますが、
そんな複雑な処理はしなそうだから短縮コードだけでいいという方は、
Split関数の解説から読んでいただいても問題ありません。
お好きな順番でお読みください。
探す文字列が1文字の場合
構文
左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字) + 1)
実行サンプル
商品名 = "愛媛産みかん" 検索値 = "産" 種類 = Mid(商品名, InStr(商品名, 検索値) + 1) MsgBox 種類 ' ←「みかん」が表示されます。
解説
まずInstr関数で検索文字列の位置を調べ、次の文字から先をMid関数で取得します。
Mid関数を使うと、「○文字目から△文字」を取ってくることができますが、
この△を省略した場合は、右側全部を取ってきますので、
Mid(元の文字列, 検索値の位置 + 1)で目的の右側が取得できます。
検索文字列がない場合の判定は以下の通り記載します。
If InStr(商品名, 検索値) > 0 Then 種類 = Right(商品名, Len(商品名) - InStr(商品名, 検索値)) Else 種類 = "" End If
この「検索値が見つからなかったとき用のIf文」は必ず用意して下さい。
Left+Instrの場合と違い、RightやMidはInstrの結果が0でもエラーにはなりませんので、ちゃんとIf文を用意しておかないと、不具合が起きたことにすら気づけない危険性があります。
指定文字は削除したくない場合
Mid関数の開始位置の指定を1増やせばよいので、「-1」を消せばOKです。
' 検索文字も削除 左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字) + 1) ' 検索文字は残してそれより左を削除 左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字))
探す文字が2回出てくる場合
探す文字が2個ある場合は、どちらを探すのかによって使う関数が変わります。
- 左から探す場合はInstr関数
- 右から探す場合はInstrRev関数
を使ってください。
' 左から探す 種類 = Mid(商品名, InStr(商品名, 検索値) + 1) ' 右から探す 種類 = Mid(商品名, InStrRev(商品名, 検索値) + 1)
InstrRev関数は「右から探す」関数ですが、結果は「左から何文字目」を返すため、
関数以外は書き換える必要はありません。
探す文字列が2文字以上の場合
構文
左側を削除した文字列 = _ Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列))
実行サンプル
商品名 = "愛媛県産みかん" 検索値 = "県産" 種類 = Mid(商品名, InStr(商品名, 検索文字列) + Len(検索文字列)) MsgBox 種類 '「みかん」が表示されます。
解説
まずは「検索文字列も含めて右側」を取ってきてみましょう。
左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字列))
検索文字を入れるので、ストレートにInstrから先をMidで取ってくればOKです。
あとはここから検索文字列も消せば目的の文字列になります。
Mid関数の開始位置を、検索文字列の文字数分だけ増やせばいいということですね。
左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列))
左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字) + 1)
指定文字列は削除したくない場合
先ほどの解説の途中にもう答えが書いてありますね。
以下の通りコードを使い分けます。
' 検索文字列も削除 左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字列)) ' 検索文字列は残してそれより左を削除 左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列))
探す文字列が2回出てくる場合
1文字の時と同様、関数を書き換えるだけでOKです。
' 左から探す 左側を削除した文字列 _ = Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列)) ' 右から探す 左側を削除した文字列 _ = Mid(元の文字列, InStrRev(元の文字列, 検索文字列) + Len(検索文字列))
さてこれで、指定の文字列より右側を取り出すコードの、
「Mid+Instrを使った基本形」の解説は終了です。
続いて「Split関数の実践技」の解説に入ります。
Split関数を使う
冒頭で紹介した通り、今回のコードは↓の方法でも実装できます。
左側を削除した文字列 = Split(元の文字列, 検索文字列)(1) MsgBox Split("愛媛産みかん","産")(1) ' ← 「みかん」が表示されます。
Split関数で元の文字列を検索値を境に分割し、その最後の要素をとってくることでも、
目的の処理が果たせるということですね。
Split関数は配列を返す関数ですので、丁寧にコードを書いた場合は
商品名 = "愛媛産みかん" Dim 配列 配列 = Split(商品名, "産") ' この時点で「配列」は、0番に「愛媛」、1番に「みかん」が入っている 種類 = 配列(1) ' ←みかんを取ってこれる
こうなるのですが、Splitが返す配列を変数に入れずに直接参照すれば、
種類 = Split(商品名,"産")(1)
と、Split(~~)(1)のように書いてしまえるということです。
Split関数を「カンマとかコロンとかの区切り記号に使うもの」と考えていた人は、
「普通の文字列の検索にも使えるもの」と視野を広げてみましょう。
Split関数は「包丁でぶつ切り」するイメージが強いかもしれませんが、
「刀で真っ二つ」にするのにも非常に便利な関数です。
ただし、区切り文字がなかったときには、
作られる配列の要素が1個のため配列(1)が存在せず、
「インデックスが有効範囲にありません」エラーになってしまいます。
また検索文字列が2個以上あるときは、
Split関数の結果が3つ以上に分かれてしまい上手く動きません。
ということで、この手法はあくまで
「検索文字列が必ず1回のみ登場する場合の短縮記法」です。
基本はMid+Instr関数による取得方法ですので、
どちらも覚えて使い分けるようにしましょう。
おまけ:文字列処理は関数化しておくと便利
今回のコードは特にそうなのですが、
文字列操作は頭が混乱しやすいです。
こういった文字列操作は、汎用関数にしておくと楽になります。
' 使用例(一度関数を作ればあとはこう書くだけでよくなる) MsgBox 左から文字列までを削除("和歌山県産みかん", "県産") ' ←みかんが表示されます。 ' 作る汎用関数 Function 左から文字列までを削除(ByVal 元の文字列 As String, 検索文字列 As String) As String Dim instr位置 As Long instr位置 = InStr(元の文字列, 検索文字列) If instr位置 > 0 Then 左から文字列までを削除 = Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列)) Else 左から文字列までを削除 = 元の文字列 End If End Function
使用例を見ればわかる通り、劇的に書きやすく、そして読みやすくなっていますよね?
一度作ってしまえばあとは使いまわすことができますし、
何なら自分で作らなくても、これをコピペすれば動きます。
私と共同開発したつもりになって、持って帰って使ってみてください。
関数と聞くと難しく感じるかもしれませんが、コードを見ればわかる通り、
中身は上で紹介したコードそのままです。
文字列操作は関数化が楽ちんで、その割に関数化の効果が大きいので、
関数づくりの練習にぴったりだと思います。
Functionプロシージャ勉強してみたいけど難しそうだな~って思っている方は、
ちょうどいいのでこの機会に始めて見るといいかもしれません。
今回の「左から文字列までを削除」や、
他には「文字から文字までを取ってくる(例えばカッコの中身)」など、
私が作成した文字列操作の汎用関数集が下記のページにあります。
関数作成の参考にするなり、中身を見ないでコピーして使うなり、
ご自由にお持ち帰りください。