広告 Access

【Access】サブフォームのサイズをフォームに合わせる(Resize)

2022年10月24日

結構ハマりました。
わかってしまえばなんてことがありませんでした。
まずは完成形のコードを示します。
複数のフォームにて共通して利用しましたので、サブルーチン(Public Sub)にしました。

'---------------------------------
'サブフォームの大きさを変更するサブルーチン
'frm:フォーム
'ctl:コントロール
'---------------------------------
Public Sub AdjustWidth(frmAs Form, ctlAs Control)
    On Error Resume Next
    
    ctl.Height = ctl.Height * 0.7             '最初にフォームの内側のコントロールを小さくしておく
    frm.Section(acFooter).Height = frm.InsideHeight - frm.Section(acDetail).Height - frm.Section(acHeader).Height
    ctl.Height = frm.Section(acFooter).Height
    '
    ctl.Width = frm.InsideWidth
End Sub

まずハマったのが、サブフォームのサイズをフォームのサイズに合わせて大きくする分にはエラーが起きませんが、小さくする際には「コントロールのサイズがフォームサイズを上回っている」」というエラーが発生します。On Error Resume Next」はそのエラーを無視するためです。

私はフォームの詳細にテキストボックスやコマンドボタンを配置し、フッターにサブフォームを配置していました。ところがサブフォームのサイズを変更しますと、詳細エリアまで浸食してしまい、詳細のコントロールが見えなくなってしまいました。

まずはサブフォームのサイズを小さくしておく必要があります。「strCtrl.Height = strCtrl.Height * 0.7」がそれです。
次にコントロールのサイズを「フッターの高さ=フォームの内側の高さ-詳細の高さ-ヘッダーの高さ」とします。
私は逸って「サブフォームの高さ=フォームの内側の高さ-詳細の高さ-ヘッダーの高さ」としてしまったがためにドはまりの無限ループに陥っていました。
バカですね。
幅・Widthに関しては単に「サブフォームの幅=フォームの内側の幅」とすればOKです。

上のサブルーチンは共通して利用するために、標準モジュールにあります。フォームに付属のVBAに記述の場合、「サブフォーム名.フォームフッター.Height」という記述で書けるのですが、標準モジュール内ですと「コントロール名.section(acFuuter).Height」としなければなりませんでした。
これが本来の書き方ではあります。

呼び出し側の記述は

Call AdjustWidth(Me, Me.(サブフォーム名))

「Me」として呼び出し側フォームを、「Me.SF_テスト」としてフォームに配置したサブフォームのコントロール(SF_テスト)を渡しています。

今回、サブフォームはフッターのトップ位置(.Top=0)にありますので、上記のコードで済んでいますが、もし=0でない位置に配置されているのであれば、もう少し工夫が必要かと思います。サブフォームはフッターに配置してしまうのが楽だと思います。

-Access