
詳細部が表形式のサブフォームになっているデザインのフォームがあって、親フォームがサイズ変更が可能になっている場合、そのままだと、最初に設定したとおりのサイズでしかサブフォームは表示されない。
が、表形式のデータ入力画面の場合は、親フォームを最大化したら、サブフォームもそれにあわせて大きくしたいし、ほかの画面を見ながらやりたいときは、親フォームに合わせて小さくもしたい。
そういう場合、自動的に親フォームに合わせて、サブフォームのサイズを変更することが必要になります。
のでので、[(親)フォーム]の[プロパティー]から、[イベント]-[サイズ変更時]で、[イベントプロシージャ]を指定して、下記のようなコードを入れるとサイズ変更が出来るようになります
Private Sub Form_Resize()
Dim intWindowHeight As Integer 'フォームビューの高さ
Dim intWindowWidth As Integer 'フォームビューの幅
Dim intTotalFormHeight As Integer 'デザインビュー全体の高さ
Dim intTotalFormWidth As Integer 'デザインビュー全体の幅
Dim intHeightHeader As Integer 'デザインビュー ヘッダーの高さ
Dim intHeightFooter As Integer 'デザインビュー フッターの高さ
' フォームのデザインビューの高さを取得します。
' 詳細部は、後で指定するので、ヘッダー部・フッター部の合計値を出します
' ヘッダー部
intHeightHeader = Me.Section(acHeader).Height
' フッター部
intHeightFooter = Me.Section(acFooter).Height
intTotalFormHeight = intHeightHeader + intHeightFooter
' フォームのデザインビューの幅を取得します。
intTotalFormWidth = Me.Width
' フォームビューの高さを取得します。
intWindowHeight = Me.InsideHeight
' フォームビューの幅を取得します。
intWindowWidth = Me.InsideWidth
' 詳細部(サブフォーム部)の高さを指定します
' 詳細部の最小値を決めておいて、その値よりも小さくなる場合は数値を指定しています。
If intWindowHeight - intTotalFormHeight < 2568 Then
' サブフォームのコントロールの高さを指定します
Me.SUB_明細入力F.Height = 2568
' 詳細部の高さを指定します
Me.Section(acDetail).Height = 2568
Else
Me.SUB_明細入力F.Height = intWindowHeight - intTotalFormHeight
Me.Section(acDetail).Height = intWindowHeight - intTotalFormHeight
End If
' サブフォームのコントロールの幅を指定します
Me.SUB_明細入力F.Width = Me.InsideWidth
' デザインビュー全体の高さを算出します
intTotalFormHeight = intTotalFormHeight + Me.Section(acDetail).Height
' フォームビューの最小値を決めておき、その値よりも小さい場合は指定したサイズになるように変更します
' フォームビューの高さを変更する
If intWindowHeight < intTotalFormHeight Then
Me.InsideHeight = 5115 'フォームビューの高さ
End If
' フォームビューの幅の変更と、スクロールバーの指定
If intWindowWidth < 16455 Then
If intWindowWidth < 6360 Then
Me.InsideWidth = 6360 'フォームビューの幅
End If
' 横スクロールバーを表示します
Me.ScrollBars = 1
Else
' スクロールバーを消します
Me.ScrollBars = 0
End If
End Sub
このままで、問題ありませんでした。
ただし、サブフォームが「開くとき」に「別フォームを開く」コードを書いている場合、一旦フォーカスがその別のフォームに移動してしまい、動きがおかしくなってしまいました。
(最大化した状態で、サブフォームが見えなくなるまでAccessウィンドウを小さくすると、その後サブフォームを見える状態にしたときに、「開く時」のコマンドが実行されているようです。)
ので、私は、別フォームは見える必要がなかったので、非表示(acHidden)をセットすることにしました。(OpenFormで指定するクラスの定数
参照)
そうすると、上記コードで問題なく動きます。