MsgBoxのボタンを文字を任意のものに変更する
VBAでダイアログを表示するときに用いるMsgBox関数では、ボタンの文言(キャプション)はあらかじめ決まったものしか設定できません。
そこで、Windows APIを用いて、ボタンの文言を変更する方法を紹介します。
以下のように、「OK」「キャンセル」ボタンを「Open」「Close」に変更など、自由に変えられます。
方法
基本的には下記のサイトのコードをVBAの標準モジュールにコピペすれば良いです。
コピーするのは、Public Sub MsgBoxCustom( ...
というプロシージャなどがあるコードブロックです。
基本的な使い方は以下の通りです。
Sub Custom_MsgBox_Demo1() ' (1) 各ボタンのラベルを設定 MsgBoxCustom_Set vbOK, "Open" MsgBoxCustom_Set vbCancel, "Close" ' (2) ダイアログを表示(返り値は変数ansに入る) Dim ans MsgBoxCustom ans, "Click a button.", vbOKCancel If ans = vbOk Then Debug.Print "Open!" Else Debug.Print "Close!" End If ' (3) ボタンのラベルの設定をリセット MsgBoxCustom_Reset 0 End Sub
(1) MsgBoxCustom_Set
で各ボタン (vbOK
などの定数で指定) の文言を設定
(2) MsgBoxCustom
でダイアログを表示。このプロシージャの引数は、1番目に値を返す変数を指定する以外は、標準のMsgBox関数の引数と同じです。
(3) MsgBoxCustom_Reset 0
でボタンのラベルの設定をリセット。0
の代わりにvbOK
などの定数を指定することで、各ボタンのラベル設定のみリセットできます。
注意点
MsgBoxのボタンの数やサイズは変更できません。あくまでボタンの文言を変更するだけです。 あまり多くの文字を表示するとはみ出すので、レイアウトの確認が必要です。
また、最後にMsgBoxCustom_Reset 0
を実行するのを忘れないようにしてください。
補足
MsgBoxCustomをFunctionにしないでSubにしているのは、ワークシートから関数として表示されないようにするためと解説がありました。
ただし、Functionにしても、モジュール先頭にOption Private Module
と記載すればワークシートから表示されなくなります。
まとめ
あまりMsgBoxの文言だけ変更したいという機会はないかもしれませんが、一応方法はあるということで紹介しました。
より複雑なことをするのであれば、素直にユーザフォームを使うのが良いです。