【実務・中級編】【中級】フォームの「OnResize」イベントでコントロール配置を動的に最適化するレスポンシブUIの基礎 – Access VBA解析バイブル

スポンサーリンク

Accessフォームを「モダン」に仕立てる:OnResizeイベントによるレスポンシブUI設計の極意

業務システムのUIを設計していて、こんなフラストレーションを抱えたことはないだろうか。

「ユーザーがウィンドウを最大化しても、フォームの右側に虚無のグレー領域が広がるだけ」
「サブフォームの幅が固定されているため、中のリストビューが見切れて横スクロールを強いられる」

Accessは、Webフロントエンド(ReactやVue)のようにCSSのFlexboxやGridレイアウトが標準で用意されているわけではない。しかし、フォームの `OnResize` イベントを正しく飼い慣らせば、Access標準フォームであってもリキッドで美しいレスポンシブUIを実現できる。

今回は、数々の現場で「使いやすい業務システム」を構築してきたアーキテクトの視点から、ウィンドウサイズ変更に完全追従する堅牢なコントロール配置ロジックを伝授しよう。

愚直な実装の罠:なぜ「何となくコードを書く」と破綻するのか

多くの開発者がやりがちな失敗は、`Form_Resize()` イベントの中に直接、無数のコントロールの `Width` や `Left` をハードコーディングすることだ。

‘ 【アンチパターン】絶対にやってはいけない実装
Private Sub Form_Resize()
Me.BumonList.Width = Me.WindowWidth – 500
Me.BumonList.Height = Me.WindowHeight – 1200
Me.DetailBox.Width = Me.BumonList.Width
End Sub

このアプローチには、プロフェッショナルとして見過ごせない致命的な問題が3つある。

1. ちらつき(Flicker)の発生
サイズ変更のたびに個別のコントロールのプロパティをバラバラに変更すると、描画処理が追いつかず、画面が激しくちらつく。
2. 定数の魔窟化
「`500`」や「`1200`」といったマジックナンバーがコードに散乱し、デザインを微調整するたびにパズルを解く羽目になる。
3. 最小サイズの考慮漏れ
ウィンドウを小さくしすぎた際、コントロールの幅がマイナス値になり、ランタイムエラー(実行時エラー)で容赦なくアプリがクラッシュする

堅牢な業務システムを構築するためには、「一括描画停止(Echoの制御)」「相対座標の計算ロジック」「許容最小サイズのガード」の3つを組み込んだアーキテクチャが必要だ。

プロダクションコード:保守性の高いレスポンシブ・フォーム基盤

以下のコードは、中規模以上の業務システムでそのまま流用できるプロダクション品質のテンプレートである。対象フォームの `OnResize` プロパティにこのプロシージャを紐付けるだけで、ウィンドウの拡大・縮小に完璧に追従するようになる。

Option Compare Database
Option Explicit

‘ ==============================================================================
定数定義:デザイン時の基準サイズとマージン(単位:twip)
‘ 1cm = 約 567 twip
‘ ==============================================================================
Private Const BASE_MIN_WIDTH As Long = 9000 ‘ フォームが許容する最小幅
Private Const BASE_MIN_HEIGHT As Long = 6000 ‘ フォームが許容する最小高さ
Private Const MARGIN_X As Long = 240 ‘ 左右の余白
Private Const MARGIN_TOP As Long = 240 ‘ 上部余白
Private Const MARGIN_BOTTOM As Long = 480 ‘ 下部余白(ステータスバー等考慮)

Private Sub Form_Resize()
‘ エラーハンドリング:最小化時(WindowHeight = 0)の除外と多重発火対策
If Me.WindowWidth = 0 Or Me.WindowHeight = 0 Then Exit Sub

On Error GoTo ErrorHandler

‘ 1. 描画を一時停止し、レイアウト変更時の「ちらつき」を完全になくす
Application.Echo False

‘ 2. 最小サイズを下回った場合の強制ガード(レイアウト崩壊を防ぐ)
Dim currentWidth As Long, currentHeight As Long
currentWidth = Me.WindowWidth
currentHeight = Me.WindowHeight

If currentWidth < BASE_MIN_WIDTH Then currentWidth = BASE_MIN_WIDTH Me.InsideWidth = BASE_MIN_WIDTH End If If currentHeight < BASE_MIN_HEIGHT Then currentHeight = BASE_MIN_HEIGHT Me.InsideHeight = BASE_MIN_HEIGHT End If ' ========================================================================== ' 3. コントロールの動的レイアウト計算 ' ========================================================================== ' 例:上部検索パネル(横幅のみ可変、高さ固定) Me.grpSearch.Width = currentWidth - (MARGIN_X 2) ' 例:左側ツリービュー・リスト(高さ可変、幅固定) Dim calculatedHeight As Long calculatedHeight = currentHeight - Me.grpSearch.Height - (MARGIN_TOP 3) - MARGIN_BOTTOM If calculatedHeight > 0 Then
Me.lstItems.Height = calculatedHeight
End If

‘ 例:右側メイン詳細エリア(幅・高さともに可変)
Dim calculatedWidth As Long
calculatedWidth = currentWidth – Me.lstItems.Width – (MARGIN_X 3)

If calculatedWidth > 2000 Then ‘ 最小限確保すべき幅
Me.txtDetailArea.Width = calculatedWidth
Me.txtDetailArea.Height = calculatedHeight
End If

‘ ボタン類を右下に固定配置する場合の例
Me.cmdClose.Left = currentWidth – Me.cmdClose.Width – MARGIN_X
Me.cmdClose.Top = currentHeight – Me.cmdClose.Height – MARGIN_BOTTOM

Exit_Label:
‘ 4. 描画を再開
Application.Echo True
Exit Sub

ErrorHandler:
‘ 予期せぬエラーでもEchoがFalseのまま固まるのを防ぐ
Application.Echo True
MsgBox “レイアウト調整中にエラーが発生しました: ” & Err.Description, vbCritical, “UIレイアウトエラー”
End Sub

アーキテクトが解説する実装の急所

1. `Application.Echo False` による描画バイパス

AccessのVBAはシングルスレッドで動作するため、イベント内で複数のコントロールの `.Width` や `.Top` をイジるたびに、OSへ再描画命令が飛ぶ。これが「画面のチラツキ」の正体だ。
処理の冒頭で `Application.Echo False` を宣言し、一連の計算が終わった直後に `True` に戻すことで、人間の目には一瞬でレイアウトが切り替わったように見せることができる。

2. 最小値ガード(ガード条項)の徹底

ユーザーがウィンドウを極端に小さくした場合、`WindowWidth – MARGIN` の結果がマイナスになり、Accessがコントロールの配置に失敗して実行時エラーを吐く。
コード内の `BASE_MIN_WIDTH` のように下限値を設け、必要に応じて `Me.InsideWidth` を強制書き換えするアプローチをとることで、アプリの堅牢性が劇的に向上する。

3. Twip単位の特性を理解する

Accessの画面座標系はすべて Twip(1インチの1/1440、約1/567cm) で処理される。
ピクセル単位の感覚でコードを書くと、縮小・拡大時に微小なズレや隙間(端数誤差)が生じるため、余白や基準値は必ず偶数かつ一定の規則性を持ったTwip値で定義するのが美しい。

実務でワンランク上の品質を目指すあなたへ

今回紹介した `OnResize` による動的レイアウトは、単に「見た目がカッコいい」だけではない。
「どんなディスプレイ解像度(ノートPCのHD画面から、4Kの大型モニターまで)で開かれても、ユーザーがスクロールバーと格闘せずにデータを視認できる」 という、業務効率化ツールにおいて最も本質的な価値をもたらす。

Accessだからといって、UIのクオリティを諦める必要は一切ない。
堅牢な基盤コードを一度組んでしまえば、あなたの作るAccessシステムは、市販のWebアプリと遜色ないモダンな操作感を手に入れるだろう。

現場のエンジニア諸君、ぜひ明日からの開発に取り入れてみてほしい。

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