VBA Griffin編
【4】ユーザフォームに最大化最小化ボタンを追加する
今回のようにユーザフォームとワークシート間でやり取りをする場合はユーザフォームを最小化できると
ワークシートが操作しやすいのだが、元来ユーザフォームに最大化最小化ボタンを付けられない。
windowを管理するWindowsAPIによって実現できるので次回のリリースには対応します。
'以下を標準モジュールに記述する
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function DrawMenuBar Lib "user32" _
(ByVal hWnd As Long) As Long
Public Const GWL_STYLE = (-16) 'ウィンドウスタイルを取得
Public Const WS_THICKFRAME = &H40000 'ウィンドウのサイズ変更
Public Const WS_MINIMIZEBOX = &H20000 '最小化ボタン
Public Const WS_MAXIMIZEBOX = &H10000 '最大化ボタン
'以下を対象とするユーザフォームを表示するプロシージャに記述する
Dim fRet As Long
Dim hWnd As Long
Dim fStyle As Long
'対象とするユーザーフォームを表示する
UserForm1.Show vbModeless
'ユーザーフォームのハンドルを取得する(注)第二引数はユーザーフォームのCaptionを指定する
hWnd = FindWindow("ThunderDFrame", "UserForm1")
'ウィンドウに関する情報を取得する
fStyle = GetWindowLong(hWnd, GWL_STYLE)
'Min,Maxメニューボタンを付加する
fStyle = (fStyle Or WS_THICKFRAME Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX)
'ユーザーフォームに追加したいボタンを設定する
fRet = SetWindowLong(hWnd, GWL_STYLE, fStyle)
'ユーザーフォームのメニューバー外枠を再描画する
fRet = DrawMenuBar(hWnd)