VBAのフォームは通常の方法ではサイズの変更ができない

VBAでフォームを作成した場合に、ひとつ不便なことがあります。それはフォームのサイズが変更できないことです。

×ボタンが付いているだけで、最大化や最小化もできません。でも、フォームのサイズは変更したくなるのが一般的なPCユーザーの感覚です。


Win32APIを使えばサイズの変更は可能

しかし、サイズ変更したい場合はやはり出てきます。たとえばテキストボックスを広げたい場合などですね。

VBAの機能だけでは実現できませんが、Win32APIを利用すると実現できます。


ソースコード

以下のソースコードは標準モジュールに書いていきます。

フォームのサイズ変更をするには以下の4つを用意します。

  1. Win32APIの参照宣言
  2. フォームのサイズ変更をする関数
  3. フォームサイズ変更関数を呼ぶ処理
  4. フォームサイズ変更時の処理

Win32APIの参照宣言

以下のWin32APIの参照宣言は標準モジュールの先頭に書いてください。

32bit版と64bit版を#Ifで分けていますが、そのままコピペしてもいいですし、必要な方だけをコピーしてもいいです。わかんない場合はそのままコピペしてください。

フォームのサイズ変更をする関数

フォームのサイズの変更を行うメインの関数です。

このフォームサイズ変更処理の簡単な説明です。

  1. アクティブフォームのハンドル(フォームの識別番号)を取得します。GetActiveWindowの部分です。
  2. 現在のフォームのスタイル(表示状態)を取得します。GetWindowLongの部分です。
  3. フォームの表示状態変数に、サイズ可変と最小ボタンと最大ボタンを追加します。style = style Or ~の部分です。
  4. 再度ウインドウのスタイルを設定します。SetWindowLongの部分です。

処理自体は簡単な流れですが、Windowsプログラミングは見慣れない定数などが多くあり、それらの知識が要求されるため、もしカスタマイズをする際にはいろいろと調べる必要が出てきます。

このマクロはフォームのサイズ変更と最小ボタンと最大ボタンの対応を行っていますが、たとえば、サイズ変更のみでよい場合は、

の部分を以下のように変更します。

フォームサイズ変更関数を呼ぶ処理

次に、フォームからその関数を呼ぶ処理です。

フォームがアクティブになった際のイベント関数であるUserForm_Activate()を作成して、フォームサイズ変更関数を呼びます。

フォームが選択された際にフォームサイズ変更関数を呼ぶことで、サイズ変更を実現します。

ここでは例としてリストビュー(lstvCell)を用意しています。

フォームサイズ変更時の処理

最後にフォームサイズ変更時の処理です。フォームのサイズを変更する場合は、一緒に他のコントロールのサイズも変更することがほとんどです。そのため、他のコントロールのサイズを設定する必要があります。

フォームサイズが変わったときのイベント関数であるUserForm_Resize()を作成して、他のコントロールのサイズ変更処理を記述します。ここでは例としてリストビュー(lstvCell)のサイズを変更しています。

UserForm_Resize()でのテキストボックス等のサイズ設定の際には、微調整が必要な場合があります。以下の例ではListViewのサイズ変更時に、高さに+36して調整しています。

そのあたりは作りながらやってみてください。