結構ハマりました。
わかってしまえばなんてことがありませんでした。
まずは完成形のコードを示します。
複数のフォームにて共通して利用しましたので、サブルーチン(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でない位置に配置されているのであれば、もう少し工夫が必要かと思います。サブフォームはフッターに配置してしまうのが楽だと思います。