プロプログラマ

プログラマーを職業としてます。 Flex,Air,C#,Oracle,HTML+JSの言語ノウハウを中心に情報発信していきます

「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関数を実行しない場合】

リサイズイベントも呼ばれないので、テキストボックスのサイズが中途半端なままです。
Image

【FormSetting関数を実行した場合】

リサイズ処理が有効になるだけではなく右上の最小化最大化ボタンも有効になります。
ユーザーがフォームの端をドラッグしてリサイズした際には、中のテキストボックスも合わせて拡大/縮小します。
Image

 

== ランキングに参加しています。ぜひクリックお願いします ==

プログラム ブログランキングへ
にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください