Excel VBA MsgBoxについて(2)選択肢があるタイプのMsgBox

Microsoft Excel

スポンサーリンク

はじめに

前回の記事では、Excel VBAでメッセージボックス(以下、MsgBox)について、「OK」ボタンを1つ持っているだけのものを扱った。
以下ではこのタイプの、OKボタンのみのMsgBoxを、「単なるMsgBox」とかいう風に書いていく。

今回は、この単なるMsgBoxと違い、「OK」ボタン以外にもボタンを持った、選択肢があるタイプのMsgBoxを扱う。

Excel VBAの入り口 MsgBoxについて(1)OKボタンしか無い単なるメッセージボックス

では、ExcelでAlt+F11で開いたVBEの画面で「挿入」→「標準モジュール」として、次のソースコードを貼り付けてみよう。

そして、F5キーを押してマクロを実行し、メッセージボックスに対し「OK」ボタンを押したとき・「キャンセル」ボタンを押したときの反応をそれぞれ確認しよう。

今回のソースコードは、ちょっと面倒になった。
初めての人は、この辺でマクロが嫌になるかもしれない。

MsbBoxのボタンと選択肢

ソースコードを再掲。

今回のMsgBoxではvbOKCancelというやつを指定しているけど、これが、「OKボタンとキャンセルボタンの2つを搭載したメッセージボックス」を指定しているということだ。

それはいいとして、まずいきなりIf文から始まっている。
Excelの通常の関数にもIF関数があり、それすら馴染めないという(それじゃいかんが)人なんかは食わず嫌いを起こすかも知れない。

でもまあ、Excelの通常関数のIF関数は、括弧()が色々と見にくいとかのデメリットがあるけど、こっち(VBA)のIfは、Thenとか改行とかあってむしろ見やすいと思えるようになってほしい。

まずIfvbOK Thenで、「結果がvbOKだったら」条件を示している。

vbOKっていうのが、何となく分かる通り、「OKボタンが押された場合」ということだ。

そしてElseというのが、英語で「さもなくば」くらいの意味なので、「結果がvbOKじゃなかったら」条件つまりキャンセルボタンを推された場合ということだ。

だから今回のやつは、OKボタンが押された場合とキャンセルボタンが押された場合で、対応したMsgBoxを出すということだ。

MsgBoxのボタンの類型

さて今回は、vbOKCancelで「OKボタンとキャンセルボタンの2つを搭載したMsgBox」を扱ったわけだけど、このボタンについては他にも幾つかのパターンがあるにはある。

下表のような感じだ。

ボタン説明
vbOKOnly[OK]ボタンのみ。
「単なるMsgBox」と当記事で呼んでいるもの。
何も書かなければこれになるので、書かずにいこう
vbOKCancel[OK][キャンセル]
vbYesNo[はい][いいえ]
vbYesNoCancel[はい][いいえ][キャンセル]の3つ
vbAbortRetryIgnore[中止][再試行][無視]
vbRetryCancel[再試行][キャンセル]

しかし色々書いたが私自身、「単なるMsgBox(OKボタンのみ)」「vbOKCancel」の2パターン以外は使ってない。

vbOKCancelに一番近いと思えるのがvbYesNoだけど、メッセージボックスに対しEscキーを押した場合の反応が違う。

  • vbOKCancel→Escキーを押すことで「キャンセル」ボタンを押したのと同じくキャンセルができる。
  • vbYesNo→Escキーを押しても何も起きない。

だから私は、お手軽にEscキーを押してキャンセルできるvbOKCancelの方だけを使っている。

後は強いて言うなら、3つの選択肢を持たせたいときは、vbYesNoCancelが結構使えるだろう。
私はそんな場面をあまり経験していないが。

vbYesNoCancelを使ったMsgBoxのソースコードのサンプルは、次のような感じ。

まあ実際には、こんなElseIfとか書いたりresultを何度も登場させたりせず、Select Caseってやつを使って、↓のように書いたりするけどね。

MsgBoxの括弧()

MsgBoxにおいて必ず初学者を苦しませるのが、MsgBoxの後に括弧()を入れるのか入れないのかということだ。
ソースコードを再掲。

ソースコードのコメントにも書いてはおいたが、

MsgBoxの括弧()
  • 単なる一方通行で、選択肢も何もない(OKボタンのみの)MsgBoxなら、括弧は付けない。
  • vbOKCancelほか、選択肢があってその結果を受け取るMsgBoxなら、括弧を付ける。

ということだ。

私も慣れないうちはかなり苦戦したが、MsgBoxはマクロをやってたら嫌でも何度も使うものなので、慣れていこう。

MsgBox 結果の受け取り

さて、今回扱ったMsgBoxでは、OKならvbOK、キャンセルならvbCancelという結果を受け取る。
これらは、英語の文字で書かれてはいるが、実は実態としては、これらは数字だ。

というのはvbOK=1、vbCancel=2というように、それぞれに数字が割り当てられている。
選択肢がvbYesNoのMsgBoxなんかでは、結果がYes(vbYes)なら6、No(vbNo)なら7と、一つ一つ対応する数字がある。

どれがどの数字なんて、私もいちいち覚えてないけどね。

で、それが何かと言うと、実態が数字だから次のような感じで、結果を数字の変数に代入するやり方をする人もいる。

resultというのが、Long型つまり数字タイプの変数というやつなんだけど、MsgBoxで返される結果は実態として数字だから、いったんそれをresultに代入しておくことができるというわけだ。

ただ私としては、このやり方はほぼ使わない。
私が専ら使用するvbOKCancelは結果が「OKかそうでないか」のみで単純なので、今回のサンプルのように、resultみたいな変数にいちいち代入しなくても問題なくいくケースばかりだからだ。

選択肢が3つあるvbYesNoCancelのタイプのMsgBoxだったら、私もresultみたいな変数に代入するけどね。

もう少し改良したい

さて、Excel VBAで扱うMsgBoxは、今回扱った内容までで、動かすだけならそう問題はないところまで来られたはずだ。
しかし今回のやつで出したMsgBoxは、なんか味気ない。

味気ないメッセージボックス

上には「Microsoft Excel」とか書いてあるし、デザインも文字のメッセージが書かれただけであっさりしすぎているというか。

動かすだけならこれでも良いし、たまにこのままの感じで出されるメッセージボックスをExcel以外でも目にする機会があるんだけど、そういうときは「あと一歩、手を加えてほしいな」と残念に思う。

次回はその、あと少しMsgBoxのデザイン面に手を加える方法を扱う。

スポンサーリンク