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

スポンサーリンク

こんにちは!Accessでのフォーム開発、日々お疲れ様です。

「せっかく綺麗にフォームを作ったのに、ユーザーがウィンドウのサイズを大きくしたら、右側に無駄な余白がぽっかり空いてしまった…」
「逆にウィンドウを小さくされたら、大事な入力欄が画面の外にはみ出して消えてしまった……」

現場でこんな悩みに直面したことはありませんか?
ExcelやWebの世界では「レスポンシブデザイン」が当たり前になっていますが、実はAccessのフォームでも、ちょっとしたVBAの仕掛けを施すだけで、ウィンドウの拡大・縮小に美しく追従する「レスポンシブUI」を実現できるんです。

今回は、フォームの`OnResize`(サイズ変更時)イベントを完全に手なずけて、プロフェッショナルな動的レイアウトを構築する方法を、優しく、そして本質的なところまで徹底解説していきます。ここをクリアすれば、あなたの作るAccessアプリのUI品質は見違えるほど跳ね上がりますよ!

1. なぜ「固定レイアウト」のままだとダメなのか?

Accessのフォームはデフォルトでは「静的(固定)」です。デザインビューで配置した位置と大きさを、頑なに守り続けます。

しかし、実際の業務アプリを使うユーザーのディスプレイ環境は千差万別です。フルHDの大きな画面で全画面表示する人もいれば、ノートPCのコンパクトな画面で縮小して使う人もいます。固定レイアウトのままだと、以下のような「現場からの悲鳴」が聞こえてきます。

  • 「右側のメモ欄が狭すぎて、スクロールしないと中身が見えない!」
  • 「ウィンドウを広げても、肝心のサブフォーム(一覧表)のサイズが変わらないから、一覧性が悪い!」

これを解決するのが、「ユーザーがウィンドウサイズを変えた瞬間(Resize)をとらえて、中のコントロールのサイズや位置をVBAで計算し直す」というアプローチです。

2. フォームの「OnResize」イベントとは?

`OnResize`は、ユーザーがフォームのウィンドウの縁をドラッグして広げたり、最大化ボタンを押したりしたその瞬間に発生するイベントです。

このイベントプロシージャの中に「ウィンドウが今、どれくらいの大きさになったか」を取得し、それに合わせて「コントロールの幅や高さをいくつにすべきか」を計算して代入するコードを記述します。

まず知っておくべき重要プロパティ

Accessのフォーム(`Me`)やコントロールには、サイズを測るためのプロパティがあります。単位はすべて「トウィップ(Twip)」です(1インチ=1440トウィップ、1センチ=約567トウィップ)。

  • `Me.InsideWidth` … フォームの内側の現在の幅
  • `Me.InsideHeight` … フォームの内側の現在の高さ
  • `control.Width` / `Height` … コントロールの幅・高さ
  • `control.Left` / `Top` … コントロールの左端・上端の位置

3. 【実践】右端に追従し、縦に伸びるレスポンシブフォームを作ろう!

それでは、実際に手を動かしてみましょう。
今回は、よくある「上部に検索条件、中央に大きなデータグリッド(サブフォーム)、下部に閉じるボタン」があるフォームを想定します。

ウィンドウのサイズを変えたときに、以下の挙動をするUIを作ります。
1. サブフォーム(`sfrmDetails`):ウィンドウの拡大に合わせて、幅も高さも一緒に広がる。
2. 閉じるボタン(`btnClose`):常にウィンドウの右下に張り付いて移動する。

ステップ1:イベントの有効化

対象のフォームをデザインビューで開き、プロパティシートの「イベント」タブにある「サイズ変更時 (OnResize)」の欄で、右側の「…」ボタンをクリックして「イベント プロシージャ」を選択します。

ステップ2:VBAコードの実装

VBAのコードウィンドウが開いたら、以下のコードをそのまま貼り付けてみてください。

Option Compare Database
Option Explicit

‘ =====================================================================
‘ イベント名:Form_Resize
‘ 概要:フォームのサイズ変更時に、主要コントロールの配置を動的に最適化する
‘ =====================================================================
Private Sub Form_Resize()
On Error GoTo ErrorHandler

‘ 画面描画のちらつきを抑えるための最適化(お作法として推奨)
‘ ※極端な最小化(アイコン化)の際はInsideWidthが0になるためガードを入れる
If Me.InsideWidth < 2000 Or Me.InsideHeight < 2000 Then Exit Sub ' --- 1. サブフォームのサイズ調整(幅と高さをウィンドウに追従させる) --- ' ウィンドウの幅から、左右の余白(例: 左側マージン200 + 右側マージン200)を引く Me.sfrmDetails.Width = Me.InsideWidth - 400 ' ウィンドウの高さから、上部ヘッダーや下部ボタンのスペース(例: 1500トウィップ)を引く Me.sfrmDetails.Height = Me.InsideHeight - 1800 ' --- 2. 「閉じる」ボタンの位置調整(常に右下に配置する) --- ' X座標(Left):ウィンドウの幅 - ボタンの幅 - 右端からのマージン Me.btnClose.Left = Me.InsideWidth - Me.btnClose.Width - 400 ' Y座標(Top):ウィンドウの高さ - ボタンの高さ - 下端からのマージン Me.btnClose.Top = Me.InsideHeight - Me.btnClose.Height - 300 Exit Sub ErrorHandler: ' 予期せぬエラーでフォームが固まるのを防ぐ MsgBox "レイアウトの調整中にエラーが発生しました: " & Err.Description, vbCritical, "エラー" End Sub ---

4. コードの解説:ここがエンジニアのこだわりポイント!

初心者の方に向けて、コードの大切なポイントを噛み砕いて解説しますね。

1. 極端な縮小に対するガード(`If Me.InsideWidth < 2000...`)
ウィンドウを極限まで小さくしたり、最小化したりすると、`InsideWidth`が「0」やマイナスに近い値になり、コントロールの幅にマイナス値を代入しようとして実行時エラー(「指定した寸法は大きすぎます、または小さすぎます」)が発生します。これを防ぐために、一定以下のサイズになったら処理をスルーする「ガード節」を入れるのがプロの技です。

2. 「現在値からの相対計算」をする
`Me.sfrmDetails.Width = Me.InsideWidth – 400` という部分は、「フォームの今の幅から、常に400トウィップ分の余白を引いたサイズにする」という命令です。これにより、ユーザーがどんな大きさにウィンドウを変えても、綺麗にフィットし続けます。

3. 位置(Left / Top)とサイズ(Width / Height)の連動
ボタン類はサイズ自体は変えず、`Left`(左からの距離)を「ウィンドウの幅 - ボタン自身の幅 - マージン」という計算式で求めることで、「常に右端に張り付くボタン」を簡単に作ることができます。

5. 陥りやすい罠とエラー回避の知見

実務でこのコードを組み込むと、いくつかハマりやすいポイントがあります。先輩からのアドバイスとして頭の片隅に置いておいてください。

  • 罠1:コントロールの最小サイズ(Minimum Size)を超えて縮めようとする

Accessのコントロールには、それぞれ「これ以上小さくできない限界」があります。コードで限界以上に小さくしようとするとエラーになるため、フォーム自体のプロパティで「最小幅・最小高さ」を設定しておくか、VBA側で `If` 文を使ってコントロールの幅に下限値を設けてあげると完璧です。

  • 罠2:画面のチラつき(フリッカ)が気になる場合

もしサイズ変更時に「カクカクっ」と描画のチラつきが気になる場合は、処理の最初に `Me.Painting = False` を入れ、処理の最後に `Me.Painting = True` で描画を再開させるテクニックを使うと、驚くほど滑らかに動くようになります(※今回はコードをシンプルにするため省略していますが、大規模なフォームでは非常に有効です)。

まとめ

いかがでしょうか?
「OnResizeイベント」と「InsideWidth / InsideHeight」を組み合わせるだけで、Accessのフォームは一気にモダンで使いやすい「レスポンシブUI」へと生まれ変わります。

「マクロの記録」や「決まりきったデザイン」から一歩抜け出して、こうした動的なコントロール制御が書けるようになると、AccessVBAを書くのが何倍も楽しくなりますよ。ぜひ、あなたの開発しているアプリのメインフォームに組み込んで、その快適さを実感してみてくださいね!

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