こんにちは、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

