タケモ塾

必修 | VBAのMsgBoxは意思を問うため

Excel開発15年、セルネッツの竹本です。
今回はメッセージボックスの活用方法について紹介をします。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

まずMsgBoxですが、今見ている資料のように引数という意味ではこれらの種類があります。

今からデモでご紹介しますが、ここの数字です。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

「MsgBox実行しますか?」改行コードが入って「4」となった場合は「vbYesNo」。「はい」ボタンと「いいえ」ボタンが表示されるようになります。

実際にやっていきたいと思います。

MsgBoxですね、この左側の「MsgBox1」のボタンを押すと「実行しますか?」「はい」「いいえ」が表示されました。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

プログラムソースを見ていきます。

まずは最終行を求めます。次の行でメッセージボックスについて引数に「4」という番号を指定したので「vbYesNo」、「はい」ボタンと「いいえ」ボタンが表示されました。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

よく使うのはこの「vbYesNo」、これに尽きると思います。参考までに上から順番に0、1、2、3を紹介します。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

引数の指定は、ここを変えるだけなんです。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

「0」番(vbOkOnly)でやってみます。
「実行しますか?」「OK」しか出てこないですよね。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

続いて「1」番(vbOkCancel)、「実行しますか?」「OK」「キャンセル」ですね。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

そして「2」番(vbAbortRetrylgnore)、「中止」「再試行」「無視」と出てきました。無視を押します。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

そして「3」番(vbYesNoCancel)、「実行しますか?」「はい」「いいえ」「キャンセル」と出てきました。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

このように値で指定するか定数で指定するか、今回は数字で指定をしていますが、「vbYesNo」というこの表記で書いたほうがわかりやすいので「4」という数字ではないほうが良いと思います。

このMsgBoxは先ほどの「どういう選択肢が押されたのか」ということを知るために戻り値があるので、引数と戻り値は一対のものと考えてください。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

「なにを押したのか」が戻ってくるので、戻り値は赤枠で囲った「はい」という実行意思を取得された場合、普通はそのまま処理をする流れになります。

上のほうに「OK」もありますが、意味合いは同じです。肯定文になるので、どういう問い方、聞き方をするかだけです。

「実行しますか?」で「はい」を押した場合は実行する意思を持っているという判断になります。

このあたりはシンプルでわかりやすいメッセージになれば良いと思います。

「MsgBox2」についても紹介します。「MsgBox1」は非常にシンプルなメッセージでした。

たとえば「51男性」シート、「52女性」シートに、「11顧客」シートのデータを元にしてデータを振り分けていく処理があったとします。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

セルネッツ流の作り方を紹介します。

「MsgBox2」を実行します。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

まずどういう処理を行うボタンなのかということ、なにが入力でなにが出力なのか。


今回は入力がひとつ、「11顧客」シートが入力であるということです。このシートは3万1行目までデータがありました。

出力は、2シートあるので、「51男性」シートと「52女性」シートに出力をしていくことがわかるようにしています。

処理内容は、Step1、2、3と3行表示しています。

「11顧客」シートを読んで男女を判定し、「51男性」「52女性」の2シートに振り分けますがよろしいですか?という一連の表記がセルネッツ流です。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

このボタンを実行したとき、なにが入力で、なにが出力で、どんな処理が行われるのか?ざっくり備忘録という意味でも、ボタンを押したらなにが行われるのかを、ここを見ればパッとわかるような作り方を心がけています。

今回は「はい」と押したときにメッセージを3回続けて出します。メッセージ1が出て、2が出て、3が出ます。そして完了メッセージです。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

処理が終わったときに「51男性」シートに何件のデータが書かれたのか、「52女性」シートに何件書かれたのか、内訳と処理時間がパッと見てわかるように心がけて設計しています。

処理時間を書いたほうが良い理由ですが、感覚的なものなので、「だいぶ遅くなってしまった」というお客様からの問い合わせがあった場合、どの程度遅いのか、これがないとわからないんです。

担当者が組織変更で変わったりした場合、秒数が早いのか遅いのかが主観であったり、実際に何秒かかったのかはパソコンによって処理速度が変わってくることが多いので、秒数は数値でわかるようにしてください。

これもプログラムソースを確認します。「MsgBox2」を見ていただくとこんな感じで書いています。メッセージボックスの書き方はこれです。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

MsgBoxのカッコ()の中、この「vbCrLf」は改行コードです。改行してその表記が来て、アンパサンド「&」で最終行を囲って、矢印「↓」で改行コード、こんな書き方です。

ごちゃごちゃしてるように見えるかもしれませんが、こういうものだと思っていただければ良いと思います。

結果が、イコール「=」の左辺の「P_戻り値」に入ります。「P」は「パブリック変数」として使っていますが、この戻り値に入ってくるので、それが「6(vbYes)」だった場合は実行するが、「6(vbYes)」でなければ「Exit Sub」、つまりこれで終わってしまうという作り方にしています。

そしてタイマーです。

タイマーを「はい」と押された直後から計測し始めて、今回は転記処理を行っていませんが、メッセージ1、2、3というメッセージだけを出させて、最終的に同じような構造で結果を出したというイメージです。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

件数は固定で書いているので、今回はプログラム処理はしていませんが、こんな感じで先ほどの実行直後に「OK」を押した直後にタイマー、時間をいったんここの変数に入れておいて、終わったときから開始した時刻を引き、時刻表示に直し、秒の表示に直し、何秒かかったのかという表示をしています。こちらもセットでパターンとして覚えていただけると良いと思います。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

もう一度簡単におさらいをすると、
引数は「4(vbYesNo)」が定番で使っているものになります。
戻り値は「6(vbYes)」でなければなにもしないという覚え方をしていただければと思います。

まとめ

まとめです。

セルネッツ:必修 | VBAのMsgBoxは意思を問うため

1.メッセージBOXで意図を問う

MsgBoxで意思を問うていますが、「クリックしたボタンを押したものの、今は処理に時間がかかるのでやめようかな」というときもあると思います。

なのでやめる選択肢を残しておくこと、または押し間違いもあるので、押したらすぐに走ることのないよう、MsgBoxで意思を問うています。

2.概要を把握

2番目に、先ほどメッセージが出てきましたが、入力はなにで、出力はなにで、そしてどんなステップを踏んでなにができるのか、ぐらいはざっくりわかったほうが良いです。

備忘録という意味でも、概要を把握することで第三者がボタンを押したときに行われる処理の全体が見えてくるので表記をするようにしています。

3.更新系は注意喚起

3番目、更新系は注意喚起をします。

更新系は、実行後に元に戻せない処理があったりします。よくある例では月締め、月次処理です。

経理での末締めの処理が締まった場合、更新ができてはいけないケースで誤って押してしまうと、リカバリーが大変になることがあります。

たとえばデータベースを使っている場合は連鎖更新など、リカバリーの考慮がない設計だった場合、押してはいけないタイミングに押してしまうと面倒なことが起きてしまいます。

なので、更新系は注意喚起をする意味でもMsgBoxで「注意」を目立つように表記するケースもたまにあります。

今回はMsgBoxの活用方法について解説をしました。少しでも参考になったというかたはぜひチャンネル登録、高評価をお願いいたします。

毎週金曜日の夜9時に投稿をしています。ありがとうございました。

タケモ塾では、今後も皆さんのVBA学習に役立つコンテンツを作成してまいります。
ブログ記事、Youtubeチャンネルのご質問・ご感想・ご要望などお気軽にお問合せください。
お問合せはこちらから
                         タケモ塾運営:株式会社セルネッツ