【VBA】ユーザーフォームのコントロールを整列させるマクロ(位置/サイズ設定)

目次

はじめに

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. ユーザーフォームを作成します。
  2. フォーム上に「ラベル」「テキストボックス」「コマンドボタン」を1つずつ配置します。
  3. それぞれの (Name) プロパティを、コードに合わせて Label_Name, TextBox_Name, SubmitButton に変更します。
  4. フォームのコードモジュールに上記の UserForm_Initialize プロシージャを貼り付けます。
  5. フォームを表示すると、コントロールが自動で整列します。

コードの解説

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)を計算している、このコードの核心部分です。

  • i0 のとき(最初のコントロール): .Top = 12 + (24 + 10) * 0 となり、12 (上部マージン) の位置に配置されます。
  • i1 のとき(2番目のコントロール): .Top = 12 + (24 + 10) * 1 となり、46 の位置に配置されます。 このように、インデックス番号 i を利用して、コントロールの高さとすき間の分だけ、配置位置を下にずらしていくことで、等間隔のレイアウトを実現しています。

まとめ

今回は、VBAを使ってユーザーフォーム上の複数のコントロールを、プログラムで綺麗に整列させる方法を解説しました。

  • UserForm_Initialize イベント内でレイアウト処理を行うのが基本。
  • 整列させたいコントロールを Array で配列化し、Forループで一括処理する。
  • .Top, .Left, .Width, .Height プロパティを計算式で設定することで、正確なレイアウトが実現できる。

この方法を一度覚えてしまえば、コントロールの数が増えても、レイアウトの変更が頻繁に発生しても、迅速かつ正確に対応できるようになります。ぜひ、見やすく使いやすいフォーム作成にご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次