「vba mid関数 右から」
「excel vba mid 後ろから」
「マクロ mid 後ろから」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスがあります。
これらの検索キーワードをそのまま読んで回答すると、
「右・後ろから指定した文字列を取得するときはMid関数ではなくRight関数を使えばOKです」
となります。
ですが、
「vba mid関数 右から」
「excel vba mid 後ろから」
「マクロ mid 後ろから」
といった検索をしたみなさんが求めていたものは、おそらくRight関数ではないだろうと、私は思います。
「ある文字列の中から、指定した文字を後ろ・右から探して、何文字目にあるのかを調べるにはどうしたらいいのか?」
が本来の疑問ではないかと、私は思うのです。
具体例でお話ししましょう。
住所データを分割するときに、こういった要望が出てきます。
たとえば、
四日市市○○町1-1
という住所データがあったときに、
四日市市
という市の名前の部分と
○○町1-1
という町名以下に分割したいという要望が、実務の中でよく出てきます。
このときに「市」という文字列を探す必要がありますが、前から探すと
「よっかいちし」の「いち」に該当する前側の「市」がみつかってしまいます。
これでは正しく住所分割ができなくなってしまいます。
「よっかいちし」の「し」に該当する後ろ側の「市」が何文字目なのかを調べる必要があります。
その方法を探していたのが、
「vba mid関数 右から」
「excel vba mid 後ろから」
「マクロ mid 後ろから」
という検索キーワードの本来のニーズだろうと私は推測しています。
いくつかの考え方をご紹介しておきましょう。
StrReverse関数・InStr関数
一つ目は、元の文字列を、ひっくり返して、InStr関数で文字列を探すという方法です。
Const addr = "四日市市○○町1-1"
MsgBox StrReverse(addr)
MsgBox InStr(StrReverse(addr), "市")
MsgBox Right(addr, InStr(StrReverse(addr), "市") - 1)
上記のマクロを実行すると
「1-1町○○市市日四」
「7」
「○○町1-1」
という文字列が、順番にメッセージボックスに表示されます。
StrReverse関数は、引数に指定された文字列の前後をひっくり返った文字列を返します。
MsgBox StrReverse(addr)
という式で、
「四日市市○○町1-1」がひっくり返された
「1-1町○○市市日四」
が表示されます。
InStr関数は、ある文字列の中から、指定された文字を探し、はじめに見つかった位置を返します。
MsgBox InStr(StrReverse(addr), "市")
という式は、
「1-1町○○市市日四」
の中から「市」という文字を探して
「7」
を返してきます。
この「7」は、元々の文字列
「四日市市○○町1-1」
の後ろ・右から「市」を探したのと同じことです。
この考え方と、ある文字列から指定した文字数分の文字列を返すRight関数を使って、町名以下を取得するのが
MsgBox Right(addr, InStr(StrReverse(addr), "市") - 1)
です。
InStrRev関数
二つ目は、InStrRev関数を使って、右・後ろから文字を探すという方法です。
Const addr = "四日市市○○町1-1"
MsgBox InStrRev(addr, "市")
MsgBox Mid(addr, InStrRev(addr, "市") + 1)
上記のマクロを実行すると
「7」
「○○町1-1」
という文字列が、順番にメッセージボックスに表示されます。
InStrRev関数は、何らかの文字列から、指定さいた文字を、右・後ろから探して、その文字が、左・前から何文字目にあるかを返します。
ですから、
MsgBox InStrRev(addr, "市")
という数式では
「四日市市○○町1-1」
の右・後ろから「よっかいちし」の「し」に該当する「市」を探して、その「市」が、左・前から何文字目にあるかという「4」が返されます。
この考え方を使って、ある文字列から指定した文字位置以降の文字列を返すMid関数を使って町名以下を取得しているのが
MsgBox Mid(addr, InStrRev(addr, "市") + 1)
です。
Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » VBAで右から・後ろから文字位置を取得する-InStrRev関数・StrReverse関数