【VBA】メッセージボックスをカスタムする

こんにちは!大阪市住之江区に拠点を置く会社『縁紡ぐ』の稲垣です。

当社は、Excel、ACCESS、RPAなどのシステム開発や既存ツールを使った業務効率化の提案、また、ITスキルアップのための教育に力を入れています。効率的なビジネス運営を目指している企業様、ITスキルの向上を図りたい企業や個人の方に、最適なご提案をさせていただきます。業務プロセスの改善とITスキルアップをサポートし、共に成長するパートナーでありたいと考えています。

目次

メッセージボックスは、フォントの変更ができないので自作する

メッセージボックスとは、MsgBoxで表示することができるフォームのことです。OKボタンのみ表示で、YesNoなど処理の分岐が必要ない場合も、今回ご紹介する方法は対応しています。が、シンプルにOKボタンだけの表示でいい。という場合は、こちらの記事をご参考ください。

フォームの作成

ラベルとボタンを4つ配置します。

種類Captionオブジェクト名
ラベルOKLabel1
ボタンはいCommandButtonYes
ボタンキャンセルCommandButtonCancel
ボタンいいえCommandButtonNo

ボタンの配置は、お好みで変更してくださいね。

コードを作成

それではコードをご紹介します。

フォームのコード

フォームに以下のコードを貼りつけてください。

Private userResponse As VbMsgBoxResult

Private Sub CommandButtonOK_Click()
    userResponse = vbOK
    Unload Me
End Sub

Private Sub CommandButtonYes_Click()
    userResponse = vbYes
    Unload Me
End Sub

Private Sub CommandButtonNo_Click()
    userResponse = vbNo
    Unload Me
End Sub

Private Sub CommandButtonCancel_Click()
    userResponse = vbCancel
    Unload Me
End Sub

Public Function ShowCustomMessageBox(Message As String, Optional Title As String = "メッセージ", Optional Buttons As VbMsgBoxStyle = vbOKOnly) As VbMsgBoxResult
    Dim maxWidth As Single
    Dim labelPadding As Single
    Dim buttonHeight As Single
    Dim formPadding As Single
    Dim textWidthValue As Single
    Dim textHeightValue As Single
    
    ' 初期設定
    maxWidth = 400 ' ラベルの最大幅
    labelPadding = 10 ' ラベルの周囲に余白を追加
    formPadding = 30 ' フォームのパディング(上下左右)
    buttonHeight = Me.CommandButtonYes.Height
    
    ' フォントに基づいてテキストの幅と高さを計算
    With Me.Label1
        textWidthValue = GetTextWidth(Message, .Font)
        textHeightValue = GetTextHeight(Message, .Font, IIf(textWidthValue + labelPadding * 2 > maxWidth, maxWidth, textWidthValue + labelPadding * 2))
        .Caption = Message
        .WordWrap = True
        .AutoSize = False
        .Width = IIf(textWidthValue + labelPadding * 2 > maxWidth, maxWidth, textWidthValue + labelPadding * 2)
        .Height = textHeightValue + labelPadding
    End With
    
    ' ボタンの表示を制御
    Select Case Buttons
        Case vbOKOnly
            Me.CommandButtonOK.Visible = True
            Me.CommandButtonYes.Visible = False
            Me.CommandButtonNo.Visible = False
            Me.CommandButtonCancel.Visible = False
        Case vbYesNo
            Me.CommandButtonOK.Visible = False
            Me.CommandButtonYes.Visible = True
            Me.CommandButtonNo.Visible = True
            Me.CommandButtonCancel.Visible = False
        Case vbYesNoCancel
            Me.CommandButtonOK.Visible = False
            Me.CommandButtonYes.Visible = True
            Me.CommandButtonNo.Visible = True
            Me.CommandButtonCancel.Visible = True
    End Select
    
    ' フォームのサイズを調整(フォームのパディングを考慮)
    Me.Width = Me.Label1.Width + formPadding * 2
    Me.Height = Me.Label1.Top + Me.Label1.Height + buttonHeight + formPadding * 2 + 10
    
    ' ボタンの位置を調整
    If Me.CommandButtonOK.Visible Then
        Me.CommandButtonOK.Top = Me.Label1.Top + Me.Label1.Height + 10
        Me.CommandButtonOK.Left = (Me.Width - Me.CommandButtonOK.Width) / 2
    ElseIf Me.CommandButtonCancel.Visible Then
        Me.CommandButtonYes.Top = Me.Label1.Top + Me.Label1.Height + 10
        Me.CommandButtonNo.Top = Me.CommandButtonYes.Top
        Me.CommandButtonCancel.Top = Me.CommandButtonYes.Top
        Me.CommandButtonYes.Left = (Me.Width - (Me.CommandButtonYes.Width + Me.CommandButtonNo.Width + Me.CommandButtonCancel.Width + 20)) / 2
        Me.CommandButtonNo.Left = Me.CommandButtonYes.Left + Me.CommandButtonYes.Width + 10
        Me.CommandButtonCancel.Left = Me.CommandButtonNo.Left + Me.CommandButtonNo.Width + 10
    Else
        Me.CommandButtonYes.Top = Me.Label1.Top + Me.Label1.Height + 10
        Me.CommandButtonNo.Top = Me.CommandButtonYes.Top
        Me.CommandButtonYes.Left = (Me.Width - (Me.CommandButtonYes.Width + Me.CommandButtonNo.Width + 10)) / 2
        Me.CommandButtonNo.Left = Me.CommandButtonYes.Left + Me.CommandButtonYes.Width + 10
    End If
    
    ' フォームのタイトルを設定
    Me.Caption = Title
    
    ' フォームをモーダルで表示し、ユーザーの応答を取得
    Me.show vbModal
    ShowCustomMessageBox = userResponse
End Function

' テキストの幅を計算する関数
Private Function GetTextWidth(ByVal Text As String, ByVal Font As Object) As Single
    ' Label1を利用してテキスト幅を計算
    Me.Label1.Caption = Text
    Me.Label1.AutoSize = True
    GetTextWidth = Me.Label1.Width
End Function

' テキストの高さを計算する関数
Private Function GetTextHeight(ByVal Text As String, ByVal Font As Object, ByVal Width As Single) As Single
    ' Label1を利用してテキスト高さを計算
    Me.Label1.Caption = Text
    Me.Label1.WordWrap = True
    Me.Label1.Width = Width
    Me.Label1.AutoSize = True
    GetTextHeight = Me.Label1.Height
End Function

呼び出し元のコード

OKボタンのみ表示、YesNoボタン、キャンセル付のYesNoと3種類が連続で表示されるようにしました。

Sub CustomMessageBox()
    Dim response As VbMsgBoxResult
    
    ' OKボタンのみを表示
    response = UserForm1.ShowCustomMessageBox("これはカスタムメッセージボックスです。OKをクリックしてください。", "確認", vbOKOnly)
    
    Select Case response
        Case vbOK
            MsgBox "OKが選択されました。"
    End Select
    
    ' Yes/Noボタンのみを表示
    response = UserForm1.ShowCustomMessageBox("これはカスタムメッセージボックスです。続行しますか?", "確認", vbYesNo)
    
    Select Case response
        Case vbYes
            MsgBox "Yesが選択されました。"
        Case vbNo
            MsgBox "Noが選択されました。"
    End Select
    
    ' Yes/No/Cancelボタンを表示
    response = UserForm1.ShowCustomMessageBox("これはカスタムメッセージボックスです。続行しますか?", "確認", vbYesNoCancel)
    
    Select Case response
        Case vbYes
            MsgBox "Yesが選択されました。"
        Case vbNo
            MsgBox "Noが選択されました。"
        Case vbCancel
            MsgBox "Cancelが選択されました。"
    End Select
End Sub

使い方は、メソッドの後に以下順で、引数を渡します。

ShowCustomMessageBox(メッセージの内容, メッセージボックスのタイトル, モード)

表示してみる

それでは、コードを実行してどのように表示されるのか確認してみましょう!

OKボタンのみ表示

response = UserForm1.ShowCustomMessageBox("これはカスタムメッセージボックスです。OKをクリックしてください。", "確認", vbOKOnly)

Yes/Noボタンを表示

response = UserForm1.ShowCustomMessageBox("これはカスタムメッセージボックスです。続行しますか?", "確認", vbYesNo)

Yes/No/Cancelボタンを表示

response = UserForm1.ShowCustomMessageBox("これはカスタムメッセージボックスです。続行しますか?", "確認", vbYesNoCancel)

まとめ

今回は、メッセージボックスの文字の大きさについて変更するためのコードをご紹介しました。使う人によっては、大きな文字を好む場合もあると思います。

もし、メッセージボックスの文字の大きさを変更したいと要望があった場合には、お役に立てれば幸いです。

記事を書いた人

稲垣

  • Excel、ACCESSでのシステム開発が得意
  • ITスキルを共有し実践的に学びながら成長する人を見るのが幸せ
  • 自家焙煎するほどのコーヒー好き
  • 使用言語 VBA、Python、Javascript、Java、HTML、CSS etc.
  • 保有資格 Kintoneアソシエイト、日商簿記検定2級、マンション管理士、管理業務主任者、情報セキュリティマネジメント、ExcelVBA etc.
  • 業務フロー図の作成や業務時間分析を通して、効率化ポイントを探る人
  • お客様にとって本当に良いことかを第一に考える人
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次