Sibainu Relax Room

柴犬と過ごす

ACCESS 名簿を考えてみる

ぼくカッコイイと狛犬に聞いている柴犬です。

概要(特徴)

メインフォームにすべてのメニューを配置しクリックしてフォーム・レポートを選択します。

選択したものは別のフォームで開くのではなく、メインフォームのスペースに子フォームを開きます。

印刷は、印刷ボタンを設けクリックすると印刷フォームが開きます。

フォームの大きさは自由にストレッチすることができます。

ベースのフォームのストレッチに応じて子フォームの表示範囲・レポート大きさが変わります。

テーブル

名簿は次のようなものです。

フォームを開いたとき

フォームを開いたときの画面です。

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

最大化をしてみます

ボタン「一覧プレ」~「選択フォーム」が中央に配置するようにしています。

拡大と同時に「選択フォーム」の表示範囲が拡大するようにしています。

ボタン「タックシールプレ」をクリック

レポートの性質上、上下に合わせてストレッチしますので、このままでは内容の確認ができません。

プリントシートを拡大

シートを拡大してみました。

しかし、見える範囲が狭いので、確認しずらいです。

最大化をしてみます

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

ボタン「一覧プレ」をクリック

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

プリントシートを拡大

拡大してみます。

最大化してみます

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

印刷はボタン「印刷」をクリック

レポートを選択していれば、印刷ダイヤログが開きます。

あとは項目をセットして印刷します。

ACCESSの構成

テーブル

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

フォーム1

詳細にフィールド「名前」「住所」「郵便番号」を配置しています。

フォームのプロパティは次のとおりです。(デフォルトから変更)

書式   コントロールボックス => いいえ
     閉じるボタン     => いいえ
     最小化/最大化ボタン => なし

ベース

使っているフォームは「フォームヘッダー」のみです。

ボタン「bu閉じる」「bu印刷」「bu0」「bu1」「bu2」を配置しています。

オブジェクト名はキャプションと同じにしています。

フォームのプロパティは次のとおりです。(デフォルトから変更)

書式   既定のビュー   => 単票フォーム
     レコードセレクタ => いいえ
     移動ボタン    => いいえ
     スクロールバー  => なし
     閉じるボタン   => いいえ
その他  ポップアップ   => はい

レポート1

詳細にフィールド「名前」「住所」「郵便番号」を配置しています。

フォームのプロパティは次のとおりです。(デフォルトから変更)

データ  レコードソース  => テーブル1

他に設定はしていません。

レポート2

同様に、詳細にフィールド「名前」「住所」「郵便番号」を配置しています。

フォームのプロパティは次のとおりです。(デフォルトから変更)

データ  レコードソース  => テーブル1
フォームの「詳細」
     代替の背景色   => 色なし

あと、ラベルで敬称をセットしています。

コード

フォーム「ベース」のコード

説明は別の投稿の機会にしたいと思います。

copy

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関数を使っています。

結構な数になりました。

copy

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