「Excel] [VBA] ユーザーフォームをリサイズ可能にする
ExcelVBAではフォームを作成できます。
ですが、このフォーム、VBで作るフォームと違って、ユーザーが自由にリサイズすることができません。
プロパティにもその設定がありません。
用途として普段そんなにリサイズしたいこともないと思いますが、設定がないのは不便です。
ということで、リサイズ可能なフォームにするロジックです。
ユーザーフォームを作って、なかにテキストボックス(txtResult)を配置した状態です。
Option Explicit 'Windows API宣言 Private Const GWL_STYLE = (-16) Private Const WS_THICKFRAME = &H40000 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function GetActiveWindow Lib "user32" () As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long ' フォームをリサイズ可能にするための設定 Public Sub FormSetting() Dim result As Long Dim hwnd As Long Dim Wnd_STYLE As Long hwnd = GetActiveWindow() Wnd_STYLE = GetWindowLong(hwnd, GWL_STYLE) Wnd_STYLE = Wnd_STYLE Or WS_THICKFRAME Or &H30000 result = SetWindowLong(hwnd, GWL_STYLE, Wnd_STYLE) result = DrawMenuBar(hwnd) End Sub Private Sub UserForm_Activate() Call FormSetting End Sub Private Sub UserForm_Resize() txtResult.Width = Me.InsideWidth - txtResult.Left * 2 txtResult.Height = Me.InsideHeight - txtResult.Top * 2 End Sub
Activateイベントで、リサイズ可能にする設定関数FormSettingを呼び出しています。
フォームのリサイズ自体はこれだけで可能となり、ユーザーがフォームの端をドラッグすることでリサイズできます。
ただ、フォームだけリサイズしても、中のコントロールが追従しないと多分意味が無いと思いますので、このサンプルでもUserForm_Resizeイベントで、中のテキストボックスのリサイズ処理を行っています。
旧VBではこのリサイズ処理をそれぞれ実装する必要があるのが面倒ですね。
(VB.NETでは追従するようにプロパティで設定できます。)
実行例
【FormSetting関数を実行しない場合】
リサイズイベントも呼ばれないので、テキストボックスのサイズが中途半端なままです。
【FormSetting関数を実行した場合】
リサイズ処理が有効になるだけではなく右上の最小化最大化ボタンも有効になります。
ユーザーがフォームの端をドラッグしてリサイズした際には、中のテキストボックスも合わせて拡大/縮小します。
== ランキングに参加しています。ぜひクリックお願いします ==
「電気代安くなるシール」詐欺じゃなかったらスゴイのに GoogleChromeに64ビット版が登場