スポンサーリンク
はじめに
前回の記事では、Excel VBAでメッセージボックス(以下、MsgBox)について、「OK」ボタンを1つ持っているだけのものを扱った。
以下ではこのタイプの、OKボタンのみのMsgBoxを、「単なるMsgBox」とかいう風に書いていく。
今回は、この単なるMsgBoxと違い、「OK」ボタン以外にもボタンを持った、選択肢があるタイプのMsgBoxを扱う。
では、ExcelでAlt+F11で開いたVBEの画面で「挿入」→「標準モジュール」として、次のソースコードを貼り付けてみよう。
1 2 3 4 5 6 7 8 9 10 11 |
Sub msgTest() 'OKかキャンセルかなど、選択肢が複数ある中からどれか答え・結果を受け取りたい場合は 'MsgBoxの後に括弧()を入れる。 If MsgBox("OKかキャンセルを選んで下さい。", vbOKCancel) = vbOK Then 'メッセージボックスに対し、OKボタンを押す一択しかない場合は、 'MsgBoxの後に括弧()を入れない。 MsgBox "OKですね。" Else 'vbOKではなかった場合=vbCancelでキャンセルされた場合の処理 MsgBox "キャンセルされました。" End If End Sub |
そして、F5キーを押してマクロを実行し、メッセージボックスに対し「OK」ボタンを押したとき・「キャンセル」ボタンを押したときの反応をそれぞれ確認しよう。
今回のソースコードは、ちょっと面倒になった。
初めての人は、この辺でマクロが嫌になるかもしれない。
MsbBoxのボタンと選択肢
ソースコードを再掲。
1 2 3 4 5 6 7 8 9 10 11 |
Sub msgTest() 'OKかキャンセルかなど、選択肢が複数ある中からどれか答え・結果を受け取りたい場合は 'MsgBoxの後に括弧()を入れる。 If MsgBox("OKかキャンセルを選んで下さい。", vbOKCancel) = vbOK Then 'メッセージボックスに対し、OKボタンを押す一択しかない場合は、 'MsgBoxの後に括弧()を入れない。 MsgBox "OKですね。" Else 'vbOKではなかった場合=vbCancelでキャンセルされた場合の処理 MsgBox "キャンセルされました。" End If End Sub |
今回のMsgBoxではvbOKCancelというやつを指定しているけど、これが、「OKボタンとキャンセルボタンの2つを搭載したメッセージボックス」を指定しているということだ。
それはいいとして、まずいきなりIf文から始まっている。
Excelの通常の関数にもIF関数があり、それすら馴染めないという(それじゃいかんが)人なんかは食わず嫌いを起こすかも知れない。
でもまあ、Excelの通常関数のIF関数は、括弧()が色々と見にくいとかのデメリットがあるけど、こっち(VBA)のIfは、Thenとか改行とかあってむしろ見やすいと思えるようになってほしい。
まずIf~vbOK 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のソースコードのサンプルは、次のような感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub msgTest() Dim result As Long 'MsgBoxの結果を最初で変数に代入する result = MsgBox("どれか選んで下さい。", vbYesNoCancel) If result = vbOK Then 'OKボタンが押されたとき MsgBox "OKですね。" ElseIf result = vbNo Then 'Noボタンが押されたとき MsgBox "Noですね。" Else 'キャンセルボタンが押されたとき MsgBox "キャンセルされました。" End If End Sub |
まあ実際には、こんなElseIfとか書いたりresultを何度も登場させたりせず、Select Caseってやつを使って、↓のように書いたりするけどね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub msgTest() Dim result As Long 'MsgBoxの結果を最初で変数に代入する result = MsgBox("どれか選んで下さい。", vbYesNoCancel) Select Case result Case vbOK 'OKボタンが押されたとき MsgBox "OKですね。" Case vbNo 'Noボタンが押されたとき MsgBox "Noですね。" Case Else 'キャンセルボタンが押されたとき MsgBox "キャンセルされました。" End Select End Sub |
MsgBoxの括弧()
MsgBoxにおいて必ず初学者を苦しませるのが、MsgBoxの後に括弧()を入れるのか入れないのかということだ。
ソースコードを再掲。
1 2 3 4 5 6 7 8 9 10 11 |
Sub msgTest() 'OKかキャンセルかなど、選択肢が複数ある中からどれか答え・結果を受け取りたい場合は 'MsgBoxの後に括弧()を入れる。 If MsgBox("OKかキャンセルを選んで下さい。", vbOKCancel) = vbOK Then 'メッセージボックスに対し、OKボタンを押す一択しかない場合は、 'MsgBoxの後に括弧()を入れない。 MsgBox "OKですね。" Else 'vbOKではなかった場合=vbCancelでキャンセルされた場合の処理 MsgBox "キャンセルされました。" End If End Sub |
ソースコードのコメントにも書いてはおいたが、
- 単なる一方通行で、選択肢も何もない(OKボタンのみの)MsgBoxなら、括弧は付けない。
- vbOKCancelほか、選択肢があってその結果を受け取るMsgBoxなら、括弧を付ける。
ということだ。
私も慣れないうちはかなり苦戦したが、MsgBoxはマクロをやってたら嫌でも何度も使うものなので、慣れていこう。
MsgBox 結果の受け取り
さて、今回扱ったMsgBoxでは、OKならvbOK、キャンセルならvbCancelという結果を受け取る。
これらは、英語の文字で書かれてはいるが、実は実態としては、これらは数字だ。
というのはvbOK=1、vbCancel=2というように、それぞれに数字が割り当てられている。
選択肢がvbYesNoのMsgBoxなんかでは、結果がYes(vbYes)なら6、No(vbNo)なら7と、一つ一つ対応する数字がある。
どれがどの数字なんて、私もいちいち覚えてないけどね。
で、それが何かと言うと、実態が数字だから次のような感じで、結果を数字の変数に代入するやり方をする人もいる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub msgTest() Dim result As Long 'MsgBoxの結果を最初で変数に代入する result = MsgBox("OKかキャンセルを選んで下さい。", vbOKCancel) If result = vbOK Then MsgBox "OKですね。" 'vbOKではなかった場合=vbCancelでキャンセルされた場合の処理 'ElseIf result = vbNo Then という書き方もあるにはある Else MsgBox "キャンセルされました。" End If End Sub |
resultというのが、Long型つまり数字タイプの変数というやつなんだけど、MsgBoxで返される結果は実態として数字だから、いったんそれをresultに代入しておくことができるというわけだ。
ただ私としては、このやり方はほぼ使わない。
私が専ら使用するvbOKCancelは結果が「OKかそうでないか」のみで単純なので、今回のサンプルのように、resultみたいな変数にいちいち代入しなくても問題なくいくケースばかりだからだ。
選択肢が3つあるvbYesNoCancelのタイプのMsgBoxだったら、私もresultみたいな変数に代入するけどね。
もう少し改良したい
さて、Excel VBAで扱うMsgBoxは、今回扱った内容までで、動かすだけならそう問題はないところまで来られたはずだ。
しかし今回のやつで出したMsgBoxは、なんか味気ない。
上には「Microsoft Excel」とか書いてあるし、デザインも文字のメッセージが書かれただけであっさりしすぎているというか。
動かすだけならこれでも良いし、たまにこのままの感じで出されるメッセージボックスをExcel以外でも目にする機会があるんだけど、そういうときは「あと一歩、手を加えてほしいな」と残念に思う。
次回はその、あと少しMsgBoxのデザイン面に手を加える方法を扱う。
スポンサーリンク