和風スパゲティのレシピ

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

Mid関数を位置で指定できるようにカスタマイズ

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」で選択肢から入力しましょう。

Midの選択肢

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()

が誕生するかもしれませんが、その時我々人類はもうコードを書いていないと思います。


こんな感じで、汎用関数はどんどんカスタマイズしていくと、
メインコードがものすごく短くなって、早く正確に書けるようになります。

やってると楽しくなってくると思いますので、是非遊んでみてください。


私が文字列操作で遊んだきたものたちを↓に置いておきますので、
参考にするなり、中身を見ずにコピペして使うなりご自由にどうぞ(´∀`)

www.limecode.jp