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

スポンサーリンク

Accessで「レスポンシブUI」を実装せよ:OnResizeイベントを支配する極限の最適化術

Accessのフォーム開発において、最も素人臭いUIは「固定サイズのウィンドウに、固定サイズのコントロールを詰め込むこと」だ。ユーザーの解像度は千差万別であり、広大なモニターを使っているのに隅っこで窮屈に動くアプリは、それだけで業務効率を著しく低下させる。

今回は、Accessの`OnResize`イベントを掌握し、ウィンドウの伸縮に合わせてコントロールを動的に再配置する「真のレスポンシブUI」の実装論を伝授する。

1. なぜ「個別に書く」のが悪手なのか

多くの開発者は、各フォームのコードモジュールに直接計算式を書き込む。これは「アンチパターン」だ。フォームが増えるたびに同じコードをコピペし、仕様変更のたびに全フォームを修正する羽目になる。

業務自動化のプロであれば、「制御ロジックの抽象化」を最優先せよ。コントロールのIDと、追従ルール(左端固定、右端追従など)を定義し、それを処理する共通プロシージャに流し込むのが、保守性の高い設計の正解だ。

2. 実装の核心:クラス設計による中央集権管理

フォームの`OnResize`イベントでは、再描画の抑制が鍵となる。何も考えずにサイズを変更すると、コントロールが一つ動くたびに画面が激しくチラつく(Flickering)。これを防ぐための設計をコードに落とし込む。

【プロダクションコード】レスポンシブUI制御モジュール

まずは標準モジュールに、制御用の構造体とロジックを用意する。

‘ 標準モジュール: modFormResizer
Option Compare Database
Option Explicit

‘ コントロールごとの追従ルールを定義
Public Enum ResizeRule
Fixed ‘ 固定
StretchWidth ‘ 幅だけ追従
MoveRight ‘ 右端に追従して移動
End Enum

Public Type ControlSetting
Name As String
Rule As ResizeRule
End Type

‘ フォームのサイズ変更時に呼び出す汎用エンジン
Public Sub ApplyResize(frm As Form, settings() As ControlSetting, originalWidth As Long, originalHeight As Long)
Dim i As Integer
Dim ctl As Control
Dim ratioW As Double

‘ 現在のウィンドウサイズと初期サイズの比率を算出
ratioW = frm.InsideWidth / originalWidth

‘ 描画停止(チラつき防止)
On Error Resume Next

For i = LBound(settings) To UBound(settings)
Set ctl = frm.Controls(settings(i).Name)

Select Case settings(i).Rule
Case ResizeRule.StretchWidth
ctl.Width = ctl.Width ratioW ‘ 幅を比率で拡大
Case ResizeRule.MoveRight
ctl.Left = ctl.Left ratioW ‘ 位置を比率で移動
End Select
Next i
End Sub

【フォーム側】呼び出し実装

フォームのモジュールは、これほどまでにシンプルになる。

‘ フォームモジュール: Form_frmMain
Option Explicit

Private m_Settings(0 To 1) As ControlSetting

Private Sub Form_Open(Cancel As Integer)
‘ 初期設定:どのコントロールをどう動かすか定義
m_Settings(0) = CreateSetting(“txtDataGrid”, ResizeRule.StretchWidth)
m_Settings(1) = CreateSetting(“btnSave”, ResizeRule.MoveRight)
End Sub

Private Sub Form_Resize()
‘ 汎用モジュールを呼び出すだけ。ロジックはここには書かない
ApplyResize Me, m_Settings, 8000, 6000 ‘ 8000×6000は設計時の基準サイズ
End Sub

‘ 補助関数
Private Function CreateSetting(name As String, rule As ResizeRule) As ControlSetting
CreateSetting.Name = name
CreateSetting.Rule = rule
End Function

3. 実務で「詰まない」ための3つの鉄則

コードを動かすことと、運用に耐えることは別次元の話だ。以下の注意点を蔑ろにする者は、数ヶ月後の改修で必ず地獄を見る。

① 「基準サイズ」を魔法の数字にするな

コード内に直接 `8000` と書くのは避けるべきだ。フォームのモジュールレベル変数、あるいは隠しテーブルで「設計時のフォーム幅」を保持しておけ。そうすれば、レイアウト微調整のたびにコードを修正する必要はなくなる。

② `On Error Resume Next` の正しい使い方

UI更新処理は、コントロールの存在チェックなどでエラーが起きやすい。しかし、エラーを隠蔽しすぎるとバグの温床になる。`On Error Resume Next` は最小限の範囲(プロパティ変更箇所のみ)に限定し、必ずエラーハンドリングを意識せよ。

③ 最小サイズのガード

ウィンドウを極端に小さくされた場合、コントロールが重なったり消滅したりする。`Form_Resize` の冒頭で、`If Me.InsideWidth < 4000 Then Exit Sub` のように、UIが崩壊する境界線をハードコードで制限する勇気を持て。 ---

結論

AccessのUI構築において、最も避けるべきは「手動による場当たり的な修正」だ。
オブジェクト指向的な思考(カプセル化、共通化)をVBAに持ち込めば、Accessは単なる「事務用ツール」から「堅牢なエンタープライズアプリケーション」へと変貌する。

今回提供したアーキテクチャをベースに、君たちの現場のUIを「モダンな操作性」へと昇華させてほしい。設計をサボるな。コードの美しさは、そのまま業務効率の高さに直結するのだから。

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