PR

【VBA】UserFormに最小化/最大化を追加して「閉じる」を無効化する!

これで楽に!?VBA活用
記事内に広告が含まれています。

こんにちは、Ryoです。
VBAでUserFormを使う機会は多いと思いますが、操作している際にうっかり「×」を押して閉じてしまったり、Windowサイズを調整したいなーと思ったり、邪魔だから最小化したかったり、とにかく最大にしてみたい(・・・これは微妙かな)と思うことありますよね。
今回はWindowsAPIを使って、これらを実施するサンプルコードをご紹介します。

 

スポンサーリンク

1.サンプル画面

シンプルなUserFormと中央に終了する為のボタンのみですが、「最小化」ボタンと
「最大化」ボタン、そして「×」(閉じる)ボタンは無効(グレー)となっています。
又、Windowサイズを調整出来るようにしています。

 

2.サンプルコード

◆標準モジュール(Module1等)に記述

'FindWindowAPI関数の宣言
 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
         (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'GetWindowLongAPI関数の宣言
 Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
         (ByVal hWnd As Long, ByVal nIndex As Long) As Long

'SetWndowLongAPI関数の宣言
 Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
         (ByVal hWnd As Long, ByVal nIndex As Long, _
         ByVal dwNewLong As Long) As Long

'DrawMenuBar関数の宣言
 Declare Function DrawMenuBar Lib "user32" _
         (ByVal hWnd As Long) As Long
         
'GetSystemMenu関数の宣言
 Declare Function GetSystemMenu Lib "user32.dll" _
(ByVal hWnd As Long, ByVal bRevert As Long) As Long

'DeleteMenu関数の宣言
Declare Function DeleteMenu Lib "user32" _
    (ByVal hMenu As Long, ByVal nPosition As Long, _
     ByVal wFlags As Long) As Long

'※これらの関数は標準モジュール(Module1等)に記述する

API関数の宣言を行いますが、これらは標準Moduleに記述します。

 

◆UserFormに記述

Private Const GWL_STYLE = -16
Private Const SC_CLOSE = &HF060      'メニューの「×」(閉じる)
Private Const MF_BYCOMMAND = &H0&    '定数の設定
Private Const WS_THICKFRAME = &H40000 'ウィンドウのサイズ変更
Private Const WS_MINIMIZEBOX = &H20000 '最小化ボタン
Private Const WS_MAXIMIZEBOX = &H10000 '最大化ボタン

'****UserFormを閉じる****
Private Sub CommandButton1_Click()

  Unload Me

End Sub

'***UserForm_Initializeに以下の記述をする***

Private Sub UserForm_Initialize()

Dim wRet As Long
Dim hWnd As Long
Dim wStyle As Long
Dim hMenu As Long
Dim rClose As Long

hWnd = FindWindow("ThunderDFrame", Me.Caption)  'Windowハンドルの取得
wStyle = GetWindowLong(hWnd, GWL_STYLE)  'UserFormのWindow情報の取得
wStyle = (wStyle Or WS_THICKFRAME Or _
WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)  'Min,Maxメニューボタン、サイズ変更を付加
wRet = SetWindowLong(hWnd, GWL_STYLE, wStyle) 'ユーザーフォームに追加したボタンを設定する
hMenu = GetSystemMenu(hWnd, 0&) 'メニュー情報を取得
rClose = DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)  '「×」ボタンの無効化
wRet = DrawMenuBar(hWnd) 'UseFormのメニューバー外枠を再描画


End Sub

定数の設定を行い、UserForm_Initialize()にてウィンドウ情報を取得して「最小化」、
「最大化」、「サイズ変更」を付加した後にDeleteMenuにて「×」ボタンを無効化します。

通常のUserFormは「×」ボタンのみでサイズ変更も出来ませんから、この辺りを知ってると
幅が広がりますから有用かなーと思います。




以上、UserFormに最小化/最大化ボタン追加、サイズ変更可として「閉じる」を無効化する
サンプルコードでした!何かの参考になれば幸いです。

Ryo

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