【入門編】フォームのOnResizeイベントでコントロール配置を動的に最適化するレスポンシブUI – Access VBA解析バイブル

スポンサーリンク

Accessを「古臭い」なんて言わせない。OnResizeで創るレスポンシブUIの極意

こんにちは。現場で「Accessは動けばいい」という時代は終わりました。画面を開いた瞬間、ユーザーが「おっ、使いやすそう」と感じるか、それとも「また昔ながらの窮屈なツールか」と溜息をつくか。その差は、ほんの少しのVBAの心得で決まります。

今回は、AccessのフォームをモダンなWebアプリのように「ウィンドウサイズに合わせてコントロールを自動調整する」手法を伝授します。これさえ押さえれば、あなたの作るツールは一気にプロの風格を纏いますよ。

1. なぜ「OnResize」なのか?

Accessのフォームを普通に設計すると、ウィンドウを広げてもコントロールは左上に固定されたままですよね。余白が広がるだけで、中身が追従しない。これが「Access臭さ」の正体です。

`OnResize`イベントは、フォームのサイズが変更された瞬間に発火するトリガーです。ここで「ウィンドウの幅からコントロールの幅を計算し直す」という処理を挟むことで、レスポンシブなUIが実現します。

2. 実践!動的レイアウトを構築するコード

以下のコードを、対象のフォームモジュールに貼り付けてください。ここでは、フォームの幅に合わせて「テキストボックスの横幅を自動で広げる」例を示します。

Option Compare Database
Option Explicit

‘ フォームのサイズ変更時に実行されるイベント
Private Sub Form_Resize()
On Error Resume Next ‘ 最小化時などにエラーが出るのを防ぐ防御策

‘ 定数:右端の余白(Twip単位。1cmは約567Twip)
Const MARGIN = 500

‘ フォームの現在の幅(Me.InsideWidth)を取得し、
‘ コントロールの幅を再計算して代入する
‘ Me.txtMain は対象のコントロール名に置き換えてください
If Me.InsideWidth > (Me.txtMain.Left + MARGIN) Then
Me.txtMain.Width = Me.InsideWidth – Me.txtMain.Left – MARGIN
End If

‘ 複数のコントロールを動かす場合は、ここに同様の計算式を並べる
‘ Me.btnSave.Left = Me.InsideWidth – Me.btnSave.Width – 300

End Sub

コードの重要ポイント解説

  • Me.InsideWidth: フォームの「表示領域」の幅です。枠線やスクロールバーを除いた、純粋な作業領域を取得します。
  • Twip(トゥイップ): Accessの距離単位です。1cm=567Twipという独特な単位系なので、微調整は「500〜1000」程度の数値で試すと分かりやすいですよ。
  • On Error Resume Next: フォームを極端に小さくしたり、最小化したりした際、計算結果がマイナスになりエラーが出るのを防ぐための「お守り」です。

3. 初学者が陥りやすい「罠」

この実装を始めると、多くの人が以下の壁にぶつかります。

① 「チラつき」問題

ウィンドウをドラッグしてサイズを変える際、コントロールがガタガタと震えることがあります。これは描画の更新が追いついていないためです。

  • 解決策: あまりに複雑なレイアウトにする場合は、処理を少し制限する必要がありますが、まずは上記のシンプルなコードで「フォームの動きに追従する」感覚を掴んでください。

② 座標計算の混乱

`Left`(左端)と `Width`(幅)の概念を混同すると、コントロールが画面外に消えてしまいます。

  • 図解的イメージ:
  • `Left`: 親(フォーム)の左端からどれだけ離れているか
  • `Width`: コントロール自体の厚み
  • `Right = Left + Width` という関係性を常に頭に置いておくと、計算が驚くほどスムーズになります。

4. プロの現場からのアドバイス

実務でこの手法を使うなら、「すべてのコントロールを個別に書かない」のが鉄則です。

フォーム上のコントロールをループで回し、特定のタグ(コントロールのプロパティにある「タグ」欄)に「Resize」と入力されているものだけを自動調整する関数を作れば、どんなフォームでも使い回せる「共通モジュール」に進化します。

「動けばいい」から「使いやすい」へ。
この `OnResize` の一歩が、あなたの開発者としての価値を大きく引き上げます。まずは今のフォームに、たった一行 `Me.txtMain.Width = …` を追加するところから始めてみてください。

もし分からないことがあれば、いつでも聞いてくださいね。応援しています!

タイトルとURLをコピーしました