MsgBoxのボタンを文字を任意のものに変更する

VBAでダイアログを表示するときに用いるMsgBox関数では、ボタンの文言(キャプション)はあらかじめ決まったものしか設定できません。

そこで、Windows APIを用いて、ボタンの文言を変更する方法を紹介します。

以下のように、「OK」「キャンセル」ボタンを「Open」「Close」に変更など、自由に変えられます。

f:id:kamocyc:20191210162318p:plain

方法

基本的には下記のサイトのコードをVBAの標準モジュールにコピペすれば良いです。

wellsr.com

コピーするのは、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の文言だけ変更したいという機会はないかもしれませんが、一応方法はあるということで紹介しました。

より複雑なことをするのであれば、素直にユーザフォームを使うのが良いです。