【VBA】ユーザーフォームの×閉じるボタンを無効にする方法

【VBA】ユーザーフォームの×閉じるボタンを無効にする方法

こんにちは!大阪市を拠点に活動している『縁紡ぐ』の稲垣です。

SWELLを使ったホームページ制作や、Excel、ACCESS、RPAなどのシステム開発を行っています。
また、Excel、Word、Outlookの研修や、情報セキュリティ研修も行っています。身近なITの相談相手になりたいと思っています。

お気軽にお問い合わせください。

目次

ユーザーフォームの×閉じるを無効化する方法

ユーザーフォームのプロパティには、この閉じるボタンを無効化する設定はありません。

では、どうしたら無効化と同じことができるか、2つの方法を紹介します。

コードを実行する前にユーザーフォームを閉じるためのボタンとコードを用意しておいてください

ユーザーフォームの「QueryClose」イベントを利用

ユーザーフォームのコードモジュールにQueryCloseイベントを追加します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' CloseModeが0の場合は「×」ボタンがクリックされたことを意味する
    If CloseMode = 0 Then
        MsgBox "このフォームは「×」ボタンで閉じることはできません。", vbExclamation, "警告"
        Cancel = True ' フォームの閉じる動作をキャンセル
    End If
End Sub

実際に×で閉じようとします。

Windows API関数を使用

GetSystemMenu関数とRemoveMenu関数を使用して、ユーザーフォームのシステムメニューから「閉じる」ボタンを削除します。

Windows API関数の宣言

×を消したいユーザーフォームのメンバー変数に以下を宣言します。

Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hWnd As LongPtr, ByVal bRevert As Long) As LongPtr
Private Declare PtrSafe Function RemoveMenu Lib "user32" (ByVal hMenu As LongPtr, ByVal nPosition As Long, ByVal wFlags As Long) As Long

Private Const MF_BYCOMMAND As Long = &H0&
Private Const SC_CLOSE As Long = &HF060&

ユーザーフォームの初期化時に「閉じる」ボタンを無効にする

ユーザーフォームの初期化時に「閉じる」ボタンを無効にするコードを記述します。UserForm_Initializeイベントを使用して、フォームの表示がされる時に「閉じる」ボタンを削除します。

Private Sub UserForm_Initialize()
    Dim hMenu As LongPtr
    Dim hWnd As LongPtr
    
    ' フォームのウィンドウハンドルを取得
    hWnd = FindWindow("ThunderDFrame", Me.Caption)
    
    ' システムメニューのハンドルを取得
    hMenu = GetSystemMenu(hWnd, 0)
    
    ' システムメニューから「閉じる」ボタンを削除
    Call RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End Sub

コードの全体

Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hWnd As LongPtr, ByVal bRevert As Long) As LongPtr
Private Declare PtrSafe Function RemoveMenu Lib "user32" (ByVal hMenu As LongPtr, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Const MF_BYCOMMAND As Long = &H0&
Private Const SC_CLOSE As Long = &HF060&

Private Sub UserForm_Initialize()
    Dim hMenu As LongPtr
    Dim hWnd As LongPtr
    
    ' フォームのウィンドウハンドルを取得
    hWnd = FindWindow("ThunderDFrame", Me.Caption)
    
    ' システムメニューのハンドルを取得
    hMenu = GetSystemMenu(hWnd, 0)
    
    ' システムメニューから「閉じる」ボタンを削除
    Call RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
End Sub

まとめ

システムの都合上、×でユーザーフォームを閉じることを制御したいことは、結構あると思います。ぜひこの記事を参考に、良いシステム、業務効率化を実現してほしいと願っています。

記事を書いた人

稲垣

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

コメント

コメントする

目次