Mid関数で「みかん(和歌山産)」から「和歌山産」を取り出すとしましょう。
Instr関数などで、"("が4文字目、")"が9文字目と分かったとします。
ってことは、5文字目から8文字目までを取ってくればいいですね!
産地 = Mid("みかん(和歌山産)", 5, 8-5+1)
↑そうこれですこれ。
この「終了位置 - 開始位置 + 1」という計算です。
実際のコードでは8とか5じゃなくて、Instr(~~)だったり、Cells(~~)だったり、位置を求める式が入っていることが多いので、
この「終了位置 - 開始位置 + 1」が面倒だし、ミスの元なんですよね。
終了位置にはInstr-1、開始位置にはInstr+1が入ることが多いので、
でてくる3つの「1」が合体してどうなるかを頭で考えると煙が出ます。
Mid関数は「Mid(元の文字列, 開始位置, 取ってくる文字数)」で作られており、
これはこれでもちろん便利なんですが、
せっかくなので、「Mid(元の文字列, 開始位置, 終了位置)」で指定できるMid関数を作ってしまいましょう!
その関数がこちらです。
Function Mid位置指定版(ByVal 元テキスト As String _ , ByVal 開始位置 As Long, ByVal 終了位置 As Long) As String Mid位置指定版 = Mid(元テキスト, 開始位置, 終了位置 - 開始位置 + 1) End Function ' 使用例 MsgBox Mid位置指定版("みかん(和歌山産)", 5, 8) ' ← 「和歌山産」が表示されます。
冒頭のコードがとても読みやすくなりましたね!
このように、ちょっとした計算を面倒と思ったら、
その計算だけをしてくれる汎用関数を作ると便利です。
自作の関数と聞くと難しく感じるかもしれませんが、コードを見ればわかる通り、
中身は目的の計算をしたコードそのままですので、
気が向いたら関数づくりにもトライしてみてください。
なお、この関数を使う度に「位置指定版」という日本語を打つのは面倒ですので、
Midまで打ったら「Ctrl+Space」で選択肢から入力しましょう。
VBAにおいて最も重要なショートカットキーですので、
使っていなかった方はこの機会に覚えてしまってください。
もっと便利に
さて今回のコードがあれば、
産地 = Mid(商品名, Instr(商品名, "(") + 1, Instr(商品名, ")") - 1 - (Instr(商品名, "(") + 1) + 1)
というコードを
産地 = Mid位置指定版(商品名, Instr(商品名, "(") + 1, Instr(商品名, ")") - 1)
こう書くことができるようになりました。
これでサクサク文字列を加工していけますね!
しかし、この関数を使っていると、ある時ふと思うのです。
「あれ、この関数いつもInstrを渡してるな…」と。
ということで、もうこのInstr2つを入れた関数も作ってしまいましょう。
それがこれ↓
Function Mid文字指定版(ByVal 元テキスト As String, ByVal 開始文字 As String, ByVal 終了文字 As String) As String Mid文字指定版 = Mid位置指定版(元テキスト _ , Instr(元テキスト, 開始文字) + 1, Instr(元テキスト, 終了文字) - 1) End Function
位置指定版を内部で呼び出す新たなMid「文字指定版」が誕生しました。
これで産地を抜き出すコードは、
産地 = Mid文字指定版(商品名,"(", ")")
ここまで短縮できます。素晴らしい!
これでサクサク文字列を加工していけますね!
しかし、この関数を使っていると、ある時ふと思うのです。
「あれ、この関数いつも"("と")"を渡してるな…」と。
ということで、もうこのカッコ2つを入れた関数も作ってしまいましょう。
それがこれ↓
Function Midカッコ内(ByVal 元テキスト As String) As String Midカッコ内 = Mid文字指定版(元テキスト, "(", ")") End Function
文字指定版を内部で呼び出す新たなMid「カッコ内」が誕生しました。
これで産地を抜き出すコードは、
産地 = Midカッコ内(商品名)
ここまで短縮できます。素晴らしい!
ついに引数が1つになりました。
現代の科学力ではこれが限界でしょう。
もう少し科学が進歩すると、引数をひとつも必要としない、
産地 = AIが前後のコードから適切な引数を考えてくれるMid()
が誕生するかもしれませんが、その時我々人類はもうコードを書いていないと思います。
こんな感じで、汎用関数はどんどんカスタマイズしていくと、
メインコードがものすごく短くなって、早く正確に書けるようになります。
やってると楽しくなってくると思いますので、是非遊んでみてください。
私が文字列操作で遊んだきたものたちを↓に置いておきますので、
参考にするなり、中身を見ずにコピペして使うなりご自由にどうぞ(´∀`)