ぼくカッコイイと狛犬に聞いている柴犬です。
概要(特徴)
メインフォームにすべてのメニューを配置しクリックしてフォーム・レポートを選択します。
選択したものは別のフォームで開くのではなく、メインフォームのスペースに子フォームを開きます。
印刷は、印刷ボタンを設けクリックすると印刷フォームが開きます。
フォームの大きさは自由にストレッチすることができます。
ベースのフォームのストレッチに応じて子フォームの表示範囲・レポート大きさが変わります。
テーブル
名簿は次のようなものです。
フォームを開いたとき
フォームを開いたときの画面です。
ボタン「選択フォーム」をクリックしたときと同じです。
最大化をしてみます
ボタン「一覧プレ」~「選択フォーム」が中央に配置するようにしています。
拡大と同時に「選択フォーム」の表示範囲が拡大するようにしています。
ボタン「タックシールプレ」をクリック
レポートの性質上、上下に合わせてストレッチしますので、このままでは内容の確認ができません。
プリントシートを拡大
シートを拡大してみました。
しかし、見える範囲が狭いので、確認しずらいです。
最大化をしてみます
拡大と同時に上下の範囲に合わせてレポートも拡大します。
ボタン「一覧プレ」をクリック
「タックシールプレ」と同様に、このままでは内容の確認ができません。
プリントシートを拡大
拡大してみます。
最大化してみます
「タックシールプレ」と同様に、上下に合わせて拡大します。
印刷はボタン「印刷」をクリック
レポートを選択していれば、印刷ダイヤログが開きます。
あとは項目をセットして印刷します。
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