
ぼくカッコイイと狛犬に聞いている柴犬です。
概要(特徴)
メインフォームにすべてのメニューを配置しクリックしてフォーム・レポートを選択します。
選択したものは別のフォームで開くのではなく、メインフォームのスペースに子フォームを開きます。
印刷は、印刷ボタンを設けクリックすると印刷フォームが開きます。
フォームの大きさは自由にストレッチすることができます。
ベースのフォームのストレッチに応じて子フォームの表示範囲・レポート大きさが変わります。
テーブル
名簿は次のようなものです。

フォームを開いたとき
フォームを開いたときの画面です。
ボタン「選択フォーム」をクリックしたときと同じです。

最大化をしてみます
ボタン「一覧プレ」~「選択フォーム」が中央に配置するようにしています。
拡大と同時に「選択フォーム」の表示範囲が拡大するようにしています。

ボタン「タックシールプレ」をクリック
レポートの性質上、上下に合わせてストレッチしますので、このままでは内容の確認ができません。

プリントシートを拡大
シートを拡大してみました。
しかし、見える範囲が狭いので、確認しずらいです。

最大化をしてみます
拡大と同時に上下の範囲に合わせてレポートも拡大します。

ボタン「一覧プレ」をクリック
「タックシールプレ」と同様に、このままでは内容の確認ができません。

プリントシートを拡大
拡大してみます。

最大化してみます
「タックシールプレ」と同様に、上下に合わせて拡大します。

印刷はボタン「印刷」をクリック
レポートを選択していれば、印刷ダイヤログが開きます。
あとは項目をセットして印刷します。

ACCESSの構成
テーブル
テーブルのフィールド名・データ型です。

フォーム1
詳細にフィールド「名前」「住所」「郵便番号」を配置しています。
フォームのプロパティは次のとおりです。(デフォルトから変更)
書式 コントロールボックス => いいえ
閉じるボタン => いいえ
最小化/最大化ボタン => なし

ベース
使っているフォームは「フォームヘッダー」のみです。
ボタン「bu閉じる」「bu印刷」「bu0」「bu1」「bu2」を配置しています。
オブジェクト名はキャプションと同じにしています。
フォームのプロパティは次のとおりです。(デフォルトから変更)
書式 既定のビュー => 単票フォーム
レコードセレクタ => いいえ
移動ボタン => いいえ
スクロールバー => なし
閉じるボタン => いいえ
その他 ポップアップ => はい

レポート1
詳細にフィールド「名前」「住所」「郵便番号」を配置しています。
フォームのプロパティは次のとおりです。(デフォルトから変更)
データ レコードソース => テーブル1
他に設定はしていません。

レポート2
同様に、詳細にフィールド「名前」「住所」「郵便番号」を配置しています。
フォームのプロパティは次のとおりです。(デフォルトから変更)
データ レコードソース => テーブル1
フォームの「詳細」
代替の背景色 => 色なし
あと、ラベルで敬称をセットしています。

コード
フォーム「ベース」のコード
説明は別の投稿の機会にしたいと思います。
Option Compare Database
Option Explicit
Private TP As Long
Private X As Long
Private Y As Long
Private cx As Long
Private cy As Long
Private curReportName As String
Private curFormName As String
Private CapRepo As Dictionary
Private CmdBL As Variant
Private Const Margin As Long = 56
'---------------------------------------
'
Public Property Let SetReport(ByVal NewName As String)
Dim Ret As Variant
On Error Resume Next
'------表示しているフォーム・レポートを閉じる
Call ObjClose
'------新しいレポートを開く
DoCmd.OpenReport NewName, acViewPreview
curReportName = NewName
'------ベースに表示するレポート・フォームの位置とサイズを調整
Call MWindow
'------新しいレポートの子ウィンドウを親ウィンドウのフォームに設定
SetParent Reports(curReportName).hWnd, Me.hWnd
DoCmd.SelectObject acReport, curReportName
End Property
'---------------------------------------
'
Public Property Get SetReport() As String
SetReport = curReportName
End Property
'---------------------------------------
'
Public Property Let SetForm(ByVal NewName As String)
Dim Ret As Variant
On Error Resume Next
'------表示しているフォーム・レポートを閉じる
Call ObjClose
'------新しいフォームを開く
DoCmd.OpenForm NewName, acNormal
curFormName = NewName
'------ベースに表示するレポート・フォームの位置とサイズを調整
Call MWindow
'------新しいフォームの子ウィンドウを親ウィンドウのフォームに設定
SetParent Forms(curFormName).hWnd, Me.hWnd
DoCmd.SelectObject acForm, curFormName
End Property
'---------------------------------------
'
Public Property Get SetForm() As String
SetForm = curFormName
End Property
'---------------------------------------
'
Private Sub ObjClose()
Dim Rpt As Report
Dim Frm As Form
On Error Resume Next
'------表示しているレポートを閉じる
If Len(curReportName) > 0 Then
For Each Rpt In Reports
If Rpt.Name = curReportName Then
DoCmd.Close acReport, Rpt.Name
curReportName = ""
End If
Next Rpt
End If
'------表示しているフォームを閉じる
If Len(curFormName) > 0 Then
For Each Frm In Forms
If Frm.Name = curFormName Then
DoCmd.Close acForm, Frm.Name
curFormName = ""
End If
Next Frm
End If
End Sub
'---------------------------------------
'
Private Sub Form_Load()
Dim Ret As Variant
Dim SetValue As Long
Dim OpenObj As Variant
Dim I As Long
On Error Resume Next
'------Win32API関数を使ってアクセスを最小化します
CloseWindow Application.hWndAccessApp
'------現在の設定値を取得
SetValue = GetWindowLong(Me.hWnd, GWL_STYLE)
'------最小化ボタンを無効
SetValue = SetValue And Not WS_MINIMIZEBOX
'------設定値をセット
SetWindowLong Me.hWnd, GWL_STYLE, SetValue
'------単位変換の変換率の計算
TP = TwipPixel
'------ボタンのキャプションリスト
CmdBL = Array("一覧プレ", "タックシールプレ", "選択フォーム")
'------ボタンのキャプションをセット
For I = 0 To UBound(CmdBL)
Me("bu" & I).Caption = CmdBL(I)
Next I
'------ボタンのキャプション名とレポート名・フォーム名の
' ハッシュテーブル
Set CapRepo = New Dictionary
With CapRepo
.Add CmdBL(0), "R:レポート1"
.Add CmdBL(1), "R:レポート2"
.Add CmdBL(2), "F:フォーム1"
End With
'------初期値
curReportName = ""
curFormName = ""
'------子フォームの原点
X = 0
Y = Me.bu閉じる.Height + Me.bu閉じる.Top * 2
'------子フォームの大きさ
Call ChildFormSize
'------フォームの OpenArgs プロパティを使用します
If IsNull(Me.OpenArgs) Then
Call ChangeObj(CapRepo("選択フォーム"))
Else
Call ChangeObj(Me.OpenArgs)
End If
End Sub
'---------------------------------------
'
Private Sub Form_Close()
Call ObjClose
Set CapRepo = Nothing
End Sub
'---------------------------------------
'
Private Sub Form_Resize()
Dim Ret As Variant
On Error Resume Next
'------リサイズ後のレポート・フォームのサイズ
Call ChildFormSize
'------ベースに表示するレポート・フォームの位置とサイズを調整
Call MWindow
'------ボタンの配置
Call BuPosiSet
End Sub
'---------------------------------------
'
Private Sub bu印刷_Click()
On Error Resume Next
If Len(curReportName) = 0 Then
Exit Sub
End If
DoCmd.SelectObject acReport, curReportName, False
DoCmd.RunCommand acCmdPrint
End Sub
'---------------------------------------
'
Private Sub bu閉じる_Click()
DoCmd.Quit acQuitSaveNone
End Sub
'---------------------------------------
'
Private Sub bu0_Click()
Call ChangeObj(CapRepo(Me.bu0.Caption))
End Sub
'---------------------------------------
'
Private Sub bu1_Click()
Call ChangeObj(CapRepo(Me.bu1.Caption))
End Sub
'---------------------------------------
'
Private Sub bu2_Click()
Call ChangeObj(CapRepo(Me.bu2.Caption))
End Sub
'---------------------------------------
'
Private Sub ChangeObj(ByVal strCap As String)
Dim OpenObj As Variant
OpenObj = Split(strCap, ":")
If OpenObj(0) = "F" Then
SetForm = OpenObj(1)
Else
SetReport = OpenObj(1)
End If
End Sub
'---------------------------------------
'
Public Function TwipPixel() As Long
Dim DskhWnd As Long
Dim nhDc As Long
Dim Bit As Long
Dim nWidth As Long
Dim nHeight As Long
'------デスクトップのハンドル
DskhWnd = GetDesktopWindow
'------デスクトップのデバイスコンテキストハンドル
nhDc = GetDC(DskhWnd)
'------画面の横幅
nWidth = GetDeviceCaps(nhDc, HORZRES)
'------画面の縦幅
nHeight = GetDeviceCaps(nhDc, VERTRES)
'------ピクセル当たりのビット数
Bit = GetDeviceCaps(nhDc, BITSPIXEL)
TwipPixel = CLng(1440 / GetDeviceCaps(nhDc, LOGPIXELSX))
End Function
'---------------------------------------
'
Private Sub MWindow()
Dim Ret As Variant
If Len(curReportName) > 0 Then
Ret = MoveWindow(Reports(curReportName).hWnd, _
X / TP, _
Y / TP, _
cx / TP, _
cy / TP, _
SWP_SHOWWINDOW)
End If
If Len(curFormName) > 0 Then
Ret = MoveWindow(Forms(curFormName).hWnd, _
X / TP, _
Y / TP, _
cx / TP, _
cy / TP, _
SWP_SHOWWINDOW)
End If
End Sub
'---------------------------------------
'
Private Sub BuPosiSet()
Dim buStart As Long
Dim buAreaLen As Long
Dim I As Long
buStart = Me.bu閉じる.Width + _
Me.bu印刷.Width + _
Margin * 2
For I = 0 To UBound(CmdBL)
buAreaLen = buAreaLen + _
Me("bu" & I).Width + Margin
Next I
If buStart < (cx - buAreaLen) Then
Me("bu0").Left = buStart + _
((cx - buStart - buAreaLen) / 2)
Else
Me("bu0").Left = buStart
End If
For I = 1 To UBound(CmdBL)
Me("bu" & I).Left = Me("bu" & (I - 1)).Left + _
Me("bu" & (I - 1)).Width + Margin
Next I
End Sub
'---------------------------------------
'
Private Sub ChildFormSize()
cx = Me.InsideWidth
cy = Me.InsideHeight - Y
End Sub
標準モジュール「M_API」のコード
API関数を使っています。
結構な数になりました。
Option Compare Database
Option Explicit
'// 64bit版
#If VBA7 And Win64 Then
Public Declare PtrSafe Function CloseWindow _
Lib "user32" (ByVal hWnd As LongPtr) As Long
Public Declare PtrSafe Function SetParent _
Lib "user32" (ByVal hWndChild As LongPtr, _
ByVal hWndNewParent As LongPtr) As Long
Public Declare PtrSafe Function MoveWindow _
Lib "user32" (ByVal hWnd As LongPtr, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Public Declare PtrSafe Function SetWindowPos _
Lib "user32.dll" (ByVal hWnd As LongPtr, _
ByVal hWndInsetAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal uFlags As Long) As Long
Public Declare PtrSafe Function GetWindowLong _
Lib "user32" Alias "GetWindowLongA" ( _
ByVal hWnd As LongPtr, _
ByVal nIndex As Long) As Long
Public Declare PtrSafe Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare PtrSafe Function GetDeviceCaps _
Lib "gdi32" (ByVal hDC As LongPtr, ByVal nIndex As Long) As Long
Public Declare PtrSafe Function GetDC _
Lib "user32" (ByVal hWnd As LongPtr) As Long
Public Declare PtrSafe Function GetDesktopWindow _
Lib "user32" () As Long
'// 32bit版
#Else
Public Declare Function CloseWindow _
Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SetParent _
Lib "user32" (ByVal hWndChild As Long, _
ByVal hWndNewParent As Long) As Long
Public Declare Function MoveWindow _
Lib "user32" (ByVal hWnd As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Public Declare Function SetWindowPos _
Lib "user32.dll" (ByVal hWnd As Long, _
ByVal hWndInsetAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal uFlags As Long) As Long
Public Declare Function GetWindowLong _
Lib "user32" Alias "GetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong _
Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function GetDeviceCaps _
Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
Public Declare Function GetDC _
Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetDesktopWindow _
Lib "user32" () As Long
#End If
Public Const HWND_TOP = &H0
Public Const HWND_TOPMOST = -1
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_SHOWWINDOW = &H40
Public Const GWL_EXSTYLE = -20
Public Const GWL_STYLE = -16
Public Const GWL_HWNDPARENT = -8
Public Const WS_MAXIMIZEBOX = &H10000
Public Const WS_MINIMIZEBOX = &H20000
Public Const WS_SIZEBOX = &H40000
Public Const WS_THICKFRAME = &H40000
Public Const WS_SYSMENU = &H80000
Public Const WS_CAPTION = &HC00000
Public Const WS_HSCROLL = &H100000
Public Const WS_VSCROLL = &H200000
Public Const WS_BORDER = &H800000
Public Const HORZRES As Long = 8
Public Const VERTRES As Long = 10
Public Const BITSPIXEL As Long = 12
Public Const LOGPIXELSX As Long = 88
Public Const LOGPIXELSY As Long = 90