MsgBoxで「保存」ボタンを使わずにデータをSaveする
MsgBox関数(メッセージボックス関数)について質問をいただきました。
例えば以下画像のようなメッセージボックスで用意されている保存ボタンです。(一番左のボタン)
Excelを「保存」せずに右上の×ボタンを押下した際以下のようなメッセージボックスにボタンが表示されます。
結論としてはMsgBox関数では「保存」ボタンは作成できません。しかし同じ効果を得る事はできます。
少し違ったアプローチをすることでメッセージボックスからデータの保存を可能にします。
直接「保存」というボタンは作成できないので別の方法をとります。
画像と違いボタンも2つにする事でよりシンプルに保存作業を構築してみます。
MsgBox関数が理解出来ていれば少しのアレンジで作業を構築できますよ。以降で解説していきます。
関連記事
MsgBox関数とIfステートメントは相性が良いです。
今回もこの組み合わせを使って事例を用意しています。基本的な使い方は以下記事で解説しています。
基本的な操作VBA-11マクロ内でMsgBoxとIFステートメントを組み合わせる
関連書籍
今回のような質問は事例がたくさん載っている書籍を探すとヒントを得られる可能性が高いです。
事例集は読むだけでも勉強になり思考の幅も広がりますよ。お試しください。
MsgBox関数
まずはMsgBox関数(メッセージボックス関数)について紹介します。
仕様
Microsoftのリファレンスでは以下の様に定義されています。
ダイアログ ボックスにメッセージを表示し、ユーザーがボタンをクリックするのを待機し、ユーザーがどのボタンをクリックしたかを示す整数を返します。
Microsoft/Learn/VBA MsgBox 関数
ポイントは戻り値が「整数」というところです。
なんらかの指示をした結果ボタンを押すと「数値」が返ってくるという事になります。
構文
基本的な構文です。ブラケット(コの字かっこ)は任意です。ここではpromptが必須になります。
promptはメッセージボックスの中央に配置される実際にメッセージが表示される場所です。
最低限の仕様として「メッセージが無いとメッセージボックスにならないので必須」という覚え方をします。
Buttons以下の引数が知りたい方はこちらの記事でご確認ください。
「保存」ボタンが作れない理由
Claudeも私が考えていた事と同じ回答を出してくれました。
MsgBox関数のpromptををうまく使って「保存」ボタンと同じ効果を再現してみます。
「保存」ボタンと同じ効果を再現する
メッセージボックスの「はい」ボタンでデータを保存、「いいえ」ボタンで保存しないという分岐に仕立てます。
具体的な仕様は以下コードをご覧ください。キーは「プロンプトの文字とボタンの連携」です。
コード
サンプルとなるプロシージャを1つ用意しました。
シンプルなコードですがこれで「保存する」or「保存しない」をコントロールできますよ。
Sub メッセージボックスで保存ボタンを再現()
Dim a As Long '変数aを整数で定義
a = MsgBox("保存しますか?", vbYesNo + vbExclamation, "保存するorしない")
If a = 6 Then '4つ目のポイント
Application.DisplayAlerts = False '1つ目のポイント
ThisWorkbook.Save '2つ目のポイント
Application.DisplayAlerts = True
MsgBox "保存完了!", vbInformation, "お知らせ"
Else
MsgBox "保存していません 作業に戻ります", vbCritical, "お知らせ"
End If
'3つ目のポイントはアラートマークです
'「vbExclamation」、「vbInformation」、「vbCritical」を使い分けてください
End Sub
promptで保存するかを確認しボタン=返事という仕様にしました。
解説
ポイントは4つです。
- DisplayAlertsプロパティ ・・・ アラートをコントロールします
- Saveメソッド ・・・ データをセーブ(保存)します
- アイコン(アラートマーク) ・・・ メッセージボックスの表示を構成します
- If a = 6 Then ・・・ メッセージボックスの戻り値をIfステートメントの条件にします
1_DisplayAlertsプロパティ
英語のままの仕様ですね。画面に出るアラートに関連するプロパティです。
Boolean型ですのでTrueかFalseをセットする事になります。今回は最初にFalseをセットしています。
保存する前に出てくるアラート(冒頭画像のメッセージボックス)を出ない様にしています。
続いてワークブックを保存し最後に止めたアラートの仕様をTrueで元に戻しています。
2_Saveメソッド
こちらも英語のままの仕様です。「保存」する為のメソッドです。
開いているファイル(ワークブック)を「上書き保存」します。
3_ アイコン(アラートマーク)
「vbExclamation」(黄)、「vbInformation」(青)、「vbCritical」(赤)を使い分けています。
メッセージボックスにはアイコンを表示できます。見た目で操作内容を印象付ける働きを持っています。
作業前は黄色で注意を促し保存したら青色、保存しない時は赤色を使う事で操作に印象を持たせます。
記事を読んでいただいた皆様がご自身でコードを実行して確認してみてください。
参考:インプットボックスを使った事例
インプットボックスを使ったコードの中でもメッセージボックスのアイコンを使い分けています。
InputBoxメソッドの使い方VBA|InputBoxメソッドで戻り値空白とキャンセルの処理を分ける
4_If a = 6 Then
MsgBox関数の戻り値とIfステートメントが連動する一番大事なポイントになります。
MsgBox関数に用意したボタンには戻り値として数値が決められています。ソースはこちら。
構文のセクションでMsgBox関数の戻り値は数値だと書かせてもらいました。ここで話が繋がります。
MsgBox関数内でvbYesNoを指示しているのでvbYes(定数6)、vbNo(定数7)のどちらかが返ってきます。
今回は定数6であるvbYesのボタンが押された時はワークブックをSaveするというコードを書きました。
ボタンに作業を登録して使う
紹介したコードをワークシートで使用する際はボタンを用意する事でより使いやすくなります。
ボタンの作り方が分からない方はこちらをご覧ください。
その他:Claudeにコードを添削してもらいました
Claudeにコードを見てもらったところ以下のようなコメントをもらえました。
エラーは無い様子です。おおむねOKというところでしょうか。安心しました。
最近はAIと一緒にコーディングする事でただコードを書くだけじゃなくより良いコードを書ける様になりました。
コードを考えるところからAIに参加してもらうとより良いコードを生成する事が出来る様になります。
プログラミング(VBA)とAIをうまく共存させることでさらなる業務改善を目指します。
まとめ
MsgBox関数の仕様をアレンジして「保存」ボタンでできる事を再現しました。
今回紹介したメッセージボックスは自分以外の第三者がVBAを使う時のサポート機能として効果を発揮します。
「自分以外がデータを使う為にコードを用意する」という思考は非常に重要な考え方です。
達成するには色々な角度から仕事を考える必要があります。結果思考の幅が広がりできる事が増えます。
今後コードを考える際は「第三者が使ったら・・・」という思考で取り組んでいただく事をおすすめします。
その思考、作業がグループの作業効率Upにつながり最後は自身のレベルUpにつながります。
関連記事:Saveメソッド
Saveメソッドを使っている関連記事を用意しておきます。
今回紹介したコードはワークブック間の転記でも使う事ができます。アレンジしてみてください。