和風スパゲティのレシピ

日本語でコーディングするExcelVBA

指定の文字列より左側(前方)を削除する

テキストからある文字列を検索し、それより右側を取得するコードを解説します。

捉え方が違うだけで同じことなので、ある文字列から左側を削除するとも言えますね。

はじめに

今回のコードは文字列操作の基本Mid関数とInstr関数を使って処理をする場合、

' 1文字を探す場合
左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字) + 1)
' 2文字以上の文字列を探す場合
左側を削除した文字列 = Mid(元の文字列, InStr(元の文字列, 検索文字列) + Len(検索文字列))

と、割とめんどくさいコードになります。


↑の基本の書き方も重要なので覚える必要があると思いますが、
元の文字列にそこまで癖がないときは、↓の技も使えます。

' Split関数を利用した短縮技
左側を削除した文字列 =Split(元の文字列, 検索文字列)(1)

Split関数で文字列を分割する方法だと、かなり短く書くことができます。
※ 文字列が1回しか出てこない場合限定です


まずは文字列操作の基本であるRight/Mid/Instr関数から解説しますが、
そんな複雑な処理はしなそうだから短縮コードだけでいいという方は、
Split関数の解説から読んでいただいても問題ありません。

本ページ下部の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プロシージャ勉強してみたいけど難しそうだな~って思っている方は、
ちょうどいいのでこの機会に始めて見るといいかもしれません。



今回の「左から文字列までを削除」や、
他には「文字から文字までを取ってくる(例えばカッコの中身)」など、
私が作成した文字列操作の汎用関数集が下記のページにあります。

関数作成の参考にするなり、中身を見ないでコピーして使うなり、
ご自由にお持ち帰りください。

www.limecode.jp