【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を書くことで、変数を使わずとも分岐処理をさせることができます。
最後に:「変数なし」のが良い理由
次のようなデメリットがあるため、変数はなるべく使わないのが理想的です。
- 変数名を考える必要がある
- 同じ名前の変数を使えなくなる(正確には使えるが再利用するとバグの元)
同じ名前の変数を使えなくなるのは、結構痛手になるケースがあります。
tmpは短いスコープで使うにはとても便利な変数名ですが、一度使ってしまうと使えなくなります。
こうした便利な変数名を温存するために、変数使用を避けることは重要です。