はじめに
VBAのユーザーフォームで複数のテキストボックスやボタンを配置する際、マウス操作で一つずつ位置やサイズを揃えるのは、手間がかかり、微妙にズレてしまうこともありますよね。
VBAコードを使えば、複数のコントロールの .Top
(上からの位置), .Left
(左からの位置), .Width
(幅), .Height
(高さ) といったプロパティを、ループ処理で一括設定できます。これにより、ピクセル単位で完璧に整列した、美しく使いやすいフォームを効率的に作成することが可能です。
この記事では、複数のコントロールを配列に入れ、それらを等間隔で縦一列に並べる、実践的なマクロの作り方を解説します。
コントロールを整列させるVBAサンプルコード
このコードは、ユーザーフォームが初期化(表示される直前)されるタイミングで実行される UserForm_Initialize
イベント内に記述するのが最も一般的です。
この例では、Label_Name
, TextBox_Name
, SubmitButton
という3つのコントロールを、上から順に等間隔で配置します。
ユーザーフォームのコード
' フォームが初期化されるときに実行されるイベント
Private Sub UserForm_Initialize()
'== 変数と定数を定義します ==
Dim i As Long
Dim controlsToAlign As Variant
Const ITEM_HEIGHT As Long = 24 '各コントロールの高さ
Const ITEM_WIDTH As Long = 180 '各コントロールの幅
Const VERTICAL_GAP As Long = 10 'コントロール間の垂直方向のすき間
Const MARGIN_TOP As Long = 12 'フォーム上端からの最初のすき間
Const MARGIN_LEFT As Long = 12 'フォーム左端からのすき間
'== 整列させたいコントロールを配列に格納します ==
' 配列に入れる順番で、上から順に配置されます
controlsToAlign = Array(Label_Name, TextBox_Name, SubmitButton)
'== ループ処理で各コントロールの位置とサイズを設定します ==
For i = LBound(controlsToAlign) To UBound(controlsToAlign)
With controlsToAlign(i)
' 高さと幅を設定
.Height = ITEM_HEIGHT
.Width = ITEM_WIDTH
' 左端からの位置を設定
.Left = MARGIN_LEFT
' 上端からの位置を計算して設定
' (前のコントロールの高さ + すき間) × インデックス番号 + 上部マージン
.Top = MARGIN_TOP + (ITEM_HEIGHT + VERTICAL_GAP) * i
End With
Next i
End Sub
実行前の準備
- ユーザーフォームを作成します。
- フォーム上に「ラベル」「テキストボックス」「コマンドボタン」を1つずつ配置します。
- それぞれの
(Name)
プロパティを、コードに合わせてLabel_Name
,TextBox_Name
,SubmitButton
に変更します。 - フォームのコードモジュールに上記の
UserForm_Initialize
プロシージャを貼り付けます。 - フォームを表示すると、コントロールが自動で整列します。
コードの解説
Private Sub UserForm_Initialize()
これは特別なイベントプロシージャで、フォームが表示される直前に一度だけ実行されます。フォームやコントロールの初期設定を行うのに最適な場所です。
Const ... As Long
Const
を使って、レイアウトに関する設定値(コントロールの高さ、幅、すき間、マージン)を定数としてまとめています。後からデザインを微調整したい場合に、この部分の数値を変えるだけで済むため、メンテナンス性が向上します。
controlsToAlign = Array(Label_Name, TextBox_Name, ...)
Array
関数を使って、整列させたいコントロールのオブジェクトを配列に格納しています。この配列に格納した順番が、そのまま画面の上から配置される順番になります。コントロールの順序を変更したい場合は、この配列内の並びを変えるだけです。
For i = LBound(controlsToAlign) To UBound(controlsToAlign)
For
ループで、配列 controlsToAlign
に格納したコントロールを一つずつ取り出して処理しています。i
は配列のインデックス番号(0から始まる)です。
.Top = MARGIN_TOP + (ITEM_HEIGHT + VERTICAL_GAP) * i
コントロールの垂直位置(.Top
)を計算している、このコードの核心部分です。
i
が0
のとき(最初のコントロール):.Top = 12 + (24 + 10) * 0
となり、12
(上部マージン) の位置に配置されます。i
が1
のとき(2番目のコントロール):.Top = 12 + (24 + 10) * 1
となり、46
の位置に配置されます。 このように、インデックス番号i
を利用して、コントロールの高さとすき間の分だけ、配置位置を下にずらしていくことで、等間隔のレイアウトを実現しています。
まとめ
今回は、VBAを使ってユーザーフォーム上の複数のコントロールを、プログラムで綺麗に整列させる方法を解説しました。
UserForm_Initialize
イベント内でレイアウト処理を行うのが基本。- 整列させたいコントロールを
Array
で配列化し、For
ループで一括処理する。 .Top
,.Left
,.Width
,.Height
プロパティを計算式で設定することで、正確なレイアウトが実現できる。
この方法を一度覚えてしまえば、コントロールの数が増えても、レイアウトの変更が頻繁に発生しても、迅速かつ正確に対応できるようになります。ぜひ、見やすく使いやすいフォーム作成にご活用ください。