【VBA】Msgboxの返り値を変数なしで処理する2つの方法

Msgboxは処理分岐をさせるのにとても便利な関数です。
引数にvbYesNoCancelなどを付けると、選択に応じてvbYes, vbNo, vbCancelといった返り値を得ることができます。

ところでこの返り値、変数で受け取っていますか?

例えば、マクロを途中終了するか確認するような処理であれば、こんな書き方をするかもしれません。

    Dim tmp As Integer
    tmp = MsgBox("マクロを途中終了しますか?", vbYesNo)
    If tmp = vbYes Then Exit Sub

vbYes, vbNoをtmpという変数で受け取り、その中身に応じてif文で処理しています。

しかし、この方法だとtmpという変数を使う必要があります。
後述しますが、プログラムにおいては基本的に変数はなるべく使わないのが理想的です。

そこで、変数を使わずともMsgboxの返り値を処理できる方法を2つ紹介したいと思います。

変数なしで処理する2つの方法

①1行で処理してしまう

If MsgBox("マクロを途中終了しますか?", vbYesNo)=vbYes Then Exit Sub

If文1行で処理してしまえば、変数がなくても判定をする事ができます。
多少横に長くなりますが、この方法なら変数を使わずともシンプルに分岐処理をする事ができます。

あまりに長すぎて可読性が悪くなりそうならば、アンダーバーを使用して途中で改行するという手もあります。
※個人的には変数を使うより改行の方が好ましいです。

②SelectCaseで分岐処理する

    Select Case MsgBox("マクロを途中終了しますか?", vbYesNoCancel)
        Case vbYes
            処理
        Case vbNo
            処理        
        Case vbCancel
            処理
    End Select

もう1つのやり方はSelectCaseを使用する方法です。

特にMsgboxの引数をvbYesNoCancelにすると、返り値が3種類(vbYes, vbNo, vbCancel)となります。
これらそれぞれに対して別動作をさせたい場合にとても便利です。

Select Caseの分岐を判別する値のところへMsgboxを書くことで、変数を使わずとも分岐処理をさせることができます。

最後に:「変数なし」のが良い理由

次のようなデメリットがあるため、変数はなるべく使わないのが理想的です。

  1. 変数名を考える必要がある
  2. 同じ名前の変数を使えなくなる(正確には使えるが再利用するとバグの元)

同じ名前の変数を使えなくなるのは、結構痛手になるケースがあります。

tmpは短いスコープで使うにはとても便利な変数名ですが、一度使ってしまうと使えなくなります。
こうした便利な変数名を温存するために、変数使用を避けることは重要です。

他の「VBA」の記事はこちらからどうぞ