VBA|MsgBoxの「保存」ボタンを使わずにデータをSaveする

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

MsgBoxで「保存」ボタンを使わずにデータをSaveする

MsgBox関数(メッセージボックス関数)について質問をいただきました。

質問はこちら

MsgBox関数で「保存」というボタンは作成出来るのか?

例えば以下画像のようなメッセージボックスで用意されている保存ボタンです。(一番左のボタン)

Excelを「保存」せずに右上の×ボタンを押下した際以下のようなメッセージボックスにボタンが表示されます。

結論としてはMsgBox関数では「保存」ボタンは作成できません。しかし同じ効果を得る事はできます。

少し違ったアプローチをすることでメッセージボックスからデータの保存を可能にします。

EnjoyExcel
EnjoyExcel

直接「保存」というボタンは作成できないので別の方法をとります。

画像と違いボタンも2つにする事でよりシンプルに保存作業を構築してみます。

MsgBox関数が理解出来ていれば少しのアレンジで作業を構築できますよ。以降で解説していきます。

関連記事

MsgBox関数とIfステートメントは相性が良いです。

今回もこの組み合わせを使って事例を用意しています。基本的な使い方は以下記事で解説しています。

基本的な操作VBA-11マクロ内でMsgBoxとIFステートメントを組み合わせる

関連書籍

今回のような質問は事例がたくさん載っている書籍を探すとヒントを得られる可能性が高いです。

事例集は読むだけでも勉強になり思考の幅も広がりますよ。お試しください。

おすすめ書籍はこちら

MsgBox関数

まずはMsgBox関数(メッセージボックス関数)について紹介します。

仕様

Microsoftのリファレンスでは以下の様に定義されています。

ダイアログ ボックスにメッセージを表示し、ユーザーがボタンをクリックするのを待機し、ユーザーがどのボタンをクリックしたかを示す整数を返します。

Microsoft/Learn/VBA MsgBox 関数

ポイントは戻り値が「整数」というところです。

なんらかの指示をした結果ボタンを押すと「数値」が返ってくるという事になります。

構文

基本的な構文です。ブラケット(コの字かっこ)は任意です。ここではpromptが必須になります。

promptはメッセージボックスの中央に配置される実際にメッセージが表示される場所です。

構文はこちら

MsgBox (prompt, [ buttons, ] [ title, ] [ helpfilecontext ])

最低限の仕様として「メッセージが無いとメッセージボックスにならないので必須」という覚え方をします。

Buttons以下の引数が知りたい方はこちらの記事でご確認ください。

「保存」ボタンが作れない理由

そもそもMsgBox関数の仕様の中に「保存」ボタンの設定がないです。ソースはこちら

私最近はClaudeというAIを使っているのですが同じ質問をしてみました。

Q
VBAのMsgBox関数について教えてください。
「保存」ボタンは通常の設定にありますか?
A

VBAのMsgBox関数は、メッセージボックスを表示するための関数です。

MsgBox関数には、表示するメッセージのほかに、ボタンの設定を指定することができます。

MsgBox関数で指定できる主なボタンの種類は以下の通りです。

  • vbOKOnly – [OK]ボタンのみ
  • vbOKCancel – [OK]と[キャンセル]ボタン
  • vbYesNoCancel – [はい]、[いいえ]、[キャンセル]ボタン
  • vbYesNo – [はい]と[いいえ]ボタン
  • vbRetryCancel – [再試行]と[キャンセル]ボタン

「保存」ボタンは、標準の設定としてMsgBox関数にはありません。


必要な場合はvbYesNoを指定し、「はい」を「保存」、「いいえ」を「保存しない」などとメッセージで表現することになります。

MsgBoxの挙動をカスタマイズするには、vbCustomButtonコンスタントとメッセージボックスのボタン配列を使う必要があります。

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つです。

  1. DisplayAlertsプロパティ ・・・ アラートをコントロールします
  2. Saveメソッド ・・・ データをセーブ(保存)します
  3. アイコン(アラートマーク) ・・・ メッセージボックスの表示を構成します
  4. 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というところでしょうか。安心しました。

はい、コードを確認しました。

If分岐でMsgBoxのプロパティを変更しているのがポイントだと思います。

保存した場合はvbInformationで情報アイコンにし、保存していない場合はvbCriticalで警告アイコンにするという使い分けはとても良いですね。

視覚的な印象に訴えることで、ユーザーにとって状況がより明確に伝わる効果があると思います。

分岐処理とMsgBoxのプロパティを使いこなしているコードだと思います。

実際の業務でこのようなテクニックを使っていただければ、分かりやすく使いやすいアプリケーション作成に役立つはずです。

最近はAIと一緒にコーディングする事でただコードを書くだけじゃなくより良いコードを書ける様になりました。

コードを考えるところからAIに参加してもらうとより良いコードを生成する事が出来る様になります

プログラミング(VBA)とAIをうまく共存させることでさらなる業務改善を目指します。

まとめ

MsgBox関数の仕様をアレンジして「保存」ボタンでできる事を再現しました。

今回紹介したメッセージボックスは自分以外の第三者がVBAを使う時のサポート機能として効果を発揮します。

「自分以外がデータを使う為にコードを用意する」という思考は非常に重要な考え方です。

達成するには色々な角度から仕事を考える必要があります。結果思考の幅が広がりできる事が増えます。

今後コードを考える際は「第三者が使ったら・・・」という思考で取り組んでいただく事をおすすめします。

その思考、作業がグループの作業効率Upにつながり最後は自身のレベルUpにつながります。

関連記事:Saveメソッド

Saveメソッドを使っている関連記事を用意しておきます。

今回紹介したコードはワークブック間の転記でも使う事ができます。アレンジしてみてください。

EnjoyExcel

タイトルとURLをコピーしました