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