このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

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

2024年7月19日

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つ紹介したいと思います。

VBAが難しいと感じたら
ココナラにてVBAの作成依頼を受け付けています。
ご依頼・ご相談はこちらから

変数なしで処理する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上級者になりたい人へ》
VBA上級者を目指したい人にはパーフェクトExcel VBA一択です。
この本を読み切れば間違いなくVBA上級者になれます。

created by Rinker
技術評論社
¥3,608 (2024/11/21 14:41:17時点 Amazon調べ-詳細)
VBAが難しいと感じたら
ココナラにてVBAの作成依頼を受け付けています。
ご依頼・ご相談はこちらから