Accessお手本データベースのホームへ戻る

データドリブン型の印刷メニューを作成するお手本データベース

 

1-2-1 レポートに該当する印刷条件のみ使用可能状態にする

 

このサンプルデータベースは、リストボックスに表示されたレポートをクリックすると、そのレポートに該当する印刷条件のみ自動的に使用可能状態にします。通常、レポートは印刷条件を指定して印刷するのが一般的ですが、データドリブン型の印刷メニューを作成すれば、レポート毎に印刷条件を入力するフォームを用意する必要がありません。

 

サンプルデータベース(CH1-2.mdb)では、以下のノウハウを習得することができます。

 

◆ レポートに該当する印刷条件のみ自動的に使用可能状態にする方法

◆ レポートの印刷条件を、レポートヘッダーに印刷する方法

◆ フォーム上の必須項目のコントロールを調べて、未入力のときエラーメッセージを表示する方法

 

   データドリブン型の印刷メニューを作成するには

 

 Accessを起動して作業フォルダに新規データベース CH1-2.mdbを作成します。

 

 データベースウィンドウからテーブルをクリックして、新規作成ボタンをクリックします。テーブルの新規作成ダイヤログが表示されたら、デザインビューを選択してOKボタンをクリックします。テーブルが表示されたら、フィールド名にReportID, ReportTitle, ReportNameを入力します。データ型とフィールドサイズは、表1-2-1のように設定します。

 

1-2-1 テーブルtblReportsの構成

フィールド名

データ型

サイズ

説明

ReportID(主キー)

数値型

整数型

レポートID

ReportTitle

テキスト型

50

レポートタイトル

ReportName

テキスト型

50

レポート名

 

ReportIDフィールドを選択したら、メニューから主キーのアイコンをクリックして主キーを設定します。

 

1-2-2 テーブル tblReportsを作成

 

 テーブルをtblReportsの名称で保存したら、テーブルを開いて図1-2-3に示すようなメニューアイテムを入力します。ReportIDは、3桁で000-999の数字を入力します。ReportTitleには、レポートのタイトルと用紙サイズを入力します。ReportNameには、レポートの名称を入力します。

 

1-2-3 テーブル tblReportsに印刷メニューアイテムを登録

 

 データベースウィンドウからフォームをクリックして、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、デザインビューを選択してOKをクリックします。フォームのデザインビューが表示されたら、詳細セクションにリストボックスと印刷条件を入力するコントロールを作成します。詳細セクションに作成したコントロールのプロパティを表1-2-2のように設定します。

 

1-2-4 詳細セクションにリストボックスと印刷条件を入力するコントロールを作成

 

リストボックスは、ツールボックスからのアイコンをクリックして作成します。リストボックスの値集合ソース(RowSource)を作成するには、値集合ソースのプロパティをクリックしてクエリビルダボタンをクリックします。テーブルの表示ダイアログが表示されたら、テーブルタブをクリックしてtblReportsを選択して追加ボタンをクリックします。閉じるのボタンをクリックしてダイアログを閉じます。tblReportsからReportID, ReportTitle, ReportNameのフィールドをダブルクリックしてQBEフィールドに移動します。ReportIDの並べ替えをクリックして、コンボボックスから昇順を選択します。クエリを保存して、値集合ソースを更新します。印刷条件のコンボボックスは、ツールボックスからをクリックして作成します。コンボボックスの値集合タイプに値リストを設定して、値集合ソースに2列のペアで構成される値を入力します。印刷条件を入力するコントロールのタグ(Tag)プロパティには、該当するレポートのReportIDを格納します。例えば、ReportID(110)が該当するときは、前後にセミコロン(;)を付加して;110;のように格納します。ヒントテキスト(ControlTipText)のプロパティには、カーソルを移動したときに表示されるツールチップを入力します。サンプルデータベースでは、ヒントテキストの内容をエラーメッセージとして使用しますので、必須項目のコントロールにのみ設定します。

 

1-2-5 リストボックスの値集合ソースのSQL

 

1-2-2 詳細セクションに作成したコントロールのプロパティ

コントロールの種類

プロパティ

ラベル

標題

レポート一覧

リストボックス

名前

lstReortID

値集合タイプ

テーブル/クエリ

値集合ソース

SELECT tblReports.ReportID, tblReports.ReportTitle, tblReports.ReportName

FROM tblReports

ORDER BY tblReports.ReportID;

連結列

列数

列幅

0cm;4cm;0cm

立体表示

なし

境界線スタイル

透明

背景色

16777190

ラベル

標題

印刷条件

コンボボックス1

名前

cboBankID

ヒントテキスト

銀行を選択してください!

タグ

;110;120;210;220;230;240;

値集合タイプ

値リスト

値集合ソース

100;東京銀行;200;神奈川銀行;300;埼玉銀行;400;千葉銀行

連結列

列数

列幅

0cm;4cm

コンボボックス2

名前

cboBrachID

ヒントテキスト

支店を選択してください!

タグ

;110;120;

値集合タイプ

値リスト

値集合ソース

100;赤羽支店;200;浦和支店;300;大宮支店

連結列

列数

列幅

0cm;4cm

コンボボックス3

名前

cboTypeID

ヒントテキスト

納期を選択してください!

タグ

;210;220;230;240;

値集合タイプ

値リスト

値集合ソース

1;通常;2;緊急

連結列

列数

列幅

0cm;2,5cm

テキストボックス1

名前

txtFromDate

ヒントテキスト

開始日を入力してください!

タグ

;110;120;210;220;230;240;

テキストボックス2

名前

txtToDate

ヒントテキスト

 

タグ

;110;120;210;220;230;240;

ラベル

標題

チェックボックス1

(ストック)

名前

chkStock

タグ

;410;

チェックボックス2

(ノンストック)

名前

chkNonStock

タグ

;410;

チェックボックス3

(印刷プレビュー)

名前

chkPreview

使用可能

いいえ

四角形

立体表示

くぼみ

 

 フォームフッターに3個のコマンドボタンを作成して表1-2-3に示すようなプロパティを設定します。

 

 

1-2-6 フォームフッターに3個のコマンドボタン作成

 

1-2-3 フォームフッターに作成したコマンドボタンのプロパティ

コントロールの種類

プロパティ

コマンドボタン1

名前

cmdPrintLaserPrinter

 

タグ

;110;210;220;410;420;430;440;450;460;

コマンドボタン2

名前

cmdPrintDotPrinter

 

タグ

;230;240;

コマンドボタン3

名前

cmdExit

 

 

 メニューからコードのアイコンをクリックしてフォームモジュールを表示させたら、CH1-2.mdbを開いてfrmPrintMenuのフォームモジュールをコピーして貼り付けます。フォームモジュールのリストは、リスト1-2-1を参照してください。また、CH1-2.mdbのレポートから rptSample、モジュール からbasMyLibをインポートしてください。rptSampleは、印刷メニューからレポートをクリックしたときに開かれます。

 

 フォームを開いたら、リストボックスから適当なレポートをクリックして印刷条件のコントロールが使用可能/不可に切り替わるか確認します。印刷条件を入力してから、プリンタのコマンドボタンをクリックするとレポートが表示/印刷されます。尚、レポートには、印刷メニューで設定した印刷条件が印字されます。

 

1-2-7 レポートに印刷条件が印字された例

 

 印刷メニューが正常に動作することを確認したら、フォームをfrmPrintMenuの名称で保存して、Access を終了します。

 

 

Sub Form_Load()イベント処理について

このイベントは、フォームが開かれてデータをロードしたときに実行されます。このイベントでは、フォームに配置されている印刷条件のコントロールを検索して使用可能(Enabled)プロパティをいいえに設定します。フォームに配置されているコントロールが印刷条件用のコントロールかどうかは、タグ(Tag)プロパティを調べて判断します。

 

 

Sub lstReportID_AfterUpdate()イベント処理について

このイベントは、リストボックスのアイテムをクリックしたときに実行されます。このイベントでは、選択したレポートに該当する印刷条件のコントロールを検索して使用可能(Enabled)プロパティをはいに設定します。レポートに該当しない印刷条件は、使用可能プロパティをいいえに設定します。With Me.lstReportID…End Withでは、リストボックスのカラム1、カラム2からレポートタイトルとレポート名を取得して、モジュールレベルのメモリ変数に退避しています。  For Each ctl In Me.Controls…Nextでは、印刷条件設定用コントロールの使用可能(Enabled)プロパティを更新しています。プレビュー印刷のチェックボックスは、常に使用可能状態とします。

 

 

Sub cmdPrintDotPrinter_Click()/Sub cmdPrintLaserPrinter_Click()イベント処理について

これらのイベントは、印刷用のコマンドボタンをクリックしたときに実行されます。これらのイベントでは、ValidControl()関数を呼び出して、印刷条件の値が入力されているか調べます。印刷条件が入力されていることを確認したら、BuildCriteria()関数を呼び出して、レポートのフィルタ条件を生成します。最後に、DoCmdOpenReportメソッドを実行してレポートを開きます。OpenReportメソッドの引数として、レポート名、ビュータイプ、フィルタ条件を指定します。

 

 

Function ValidControls()関数について

この関数は、フォームの詳細セクションに配置されたコントロールを検索して、印刷条件が入力されていないコントロールを見つけたらエラーメッセージを表示して、そのコントロールにフォーカスを移動します。この関数からは、True/Falseが返されます。

For Each ctl In Me.Section(acDetail).Controls…Nextでは、フォームの詳細セクションに配置された全てのコントロールを検索します。Select Case .ControlType…End Selectでは、コントロールのタイプを調べて、テキストボックスとコンボボックスに対してエラーチェックを行います。コントロールが必須項目かどうかは、ヒントテキスト(ControlTipText)で調べます。必須項目に値が入力されていないときは、MsgBoxでエラーメッセージを表示して、SetFocusメソッドでフォーカスを移動します。尚、エラーメッセージは、ヒントテキストに設定した内容が表示されます。ValidControls()関数をPublic属性にして、引数にフォームを追加すれば、他のフォームからも使用できる汎用関数になります。

 

Public Function ValidControls(frm As Form) As Boolean

                For Each ctl In frm.Section(acDetail).Controls

                Next ctl

     End Function

 

Function BuildCriteria() 関数について

この関数は、印刷条件の値を元にレポートのフィルタ条件を生成して返します。例えば、銀行IDのコンボボックスで100を選択したときは、BankID = 100が返されます。

Left(strCriteria, Len(strCriteria) - 5)では、メモリ変数から最後の” AND ”を除去します。

 

 

フォームのSetCaption()メソッドについて

このメソッドは、フォーム固有のメソッドでレポートの標題を設定します。rptSampleReport_Openイベントから次のように呼ばれます。

  Forms(“frmPrintMenu”).SetCaption Me

 

 

フォームのSetCriteria()メソッドについて

このメソッドは、フォーム固有のメソッドでフィルタ条件を設定します。rptSampleReport_Openイベントから次のように呼ばれます。

  Forms(“frmPrintMenu”).SetCriteria Me.lblCriteria

 

 

リスト1-2-1 frmPrintMenuのフォームモジュール

Option Compare Database

Option Explicit

 

Private mstrReportTitle As String

Private mstrReportName As String

Private mintView As Integer

Private mstrCriteria As String

 

Private Sub cmdExit_Click()

  DoCmd.Close

End Sub

 

Private Sub cmdPrintDotPrinter_Click()

  If ValidControl() Then

    mstrCriteria = BuildCriteria()

    On Error Resume Next

    DoCmd.OpenReport ReportName:=mstrReportName, _

      View:=mintView, WhereCondition:=mstrCriteria

  End If

End Sub

 

Private Sub cmdPrintLaserPrinter_Click()

  If ValidControl() Then

    mstrCriteria = BuildCriteria()

    On Error Resume Next

    DoCmd.OpenReport ReportName:=mstrReportName, _

      View:=mintView, _

      WhereCondition:=mstrCriteria

  End If

End Sub

 

Private Sub Form_Load()

  Dim ctl As Control

  For Each ctl In Me.Controls

    With ctl

      If Len(.Tag) <> 0 Then

        .Enabled = False

      End If

    End With

  Next ctl

End Sub

 

Private Sub Form_Open(Cancel As Integer)

  Call SetAppTitle_FS("Data-Driven Print Menu (C) " _

    & Year(Date) & " by Akio Kasai")

End Sub

 

Private Sub lstReportID_AfterUpdate()

  Dim ctl As Control

  Dim strChoice As String

 

  With Me.lstReportID

    mstrReportTitle = Nz(.Column(1), "")

    mstrReportName = Nz(.Column(2), "")

  End With

 

  strChoice = ";" & CStr(Me.lstReportID) & ";"  ' ;999;

  For Each ctl In Me.Controls

    With ctl

      If Len(.Tag) <> 0 Then

        If InStr(1, .Tag, strChoice) > 0 Then

          .Enabled = True

        Else

          .Enabled = False

        End If

      End If

    End With

  Next ctl

  Me.chkPreview.Enabled = True

  If Me.chkPreview Then

    mintView = acViewPreview

  Else

    mintView = acViewNormal

  End If

End Sub

 

Private Function ValidControl() As Boolean

  Dim ctl As Control

  ValidControl = False

  For Each ctl In Me.Section(acDetail).Controls

    With ctl

      Select Case .ControlType

        Case acTextBox, acComboBox

          If .Enabled Then

            If Len(.ControlTipText) <> 0 Then

              If IsNull(.Value) Then

                MsgBox .ControlTipText, vbExclamation

                .SetFocus

                Exit Function

              End If

            End If

          End If

        End Select

    End With

  Next ctl

  ValidControl = True

End Function

 

Private Function BuildCriteria() As Variant

  Dim strCriteria As String

 

  With Me.cboBankID

    If .Enabled Then

      If Len(.Value) <> 0 Then

        strCriteria = strCriteria _

          & "BankID=" & .Value & " AND "

      End If

    End If

  End With

 

  With Me.cboBranchID

    If .Enabled Then

      If Len(.Value) <> 0 Then

        strCriteria = strCriteria _

          & "BranchID=" & .Value & " AND "

      End If

    End If

  End With

 

  With Me.cboTypeID

    If .Enabled Then

      If Len(.Value) <> 0 Then

        strCriteria = strCriteria _

          & "TypeID=" & .Value & " AND "

      End If

    End If

  End With

 

  If Me.txtFromDate.Enabled And Me.txtToDate.Enabled Then

    If Len(Me.txtFromDate) <> 0 And Len(Me.txtToDate) <> 0 Then

      strCriteria = strCriteria _

        & "Date Between #" & Format(Me.txtFromDate, "yyyy/mm/dd") _

        & "# And #" & Format(Me.txtToDate, "yyyy/mm/dd") & "# AND "

    End If

  End If

  最後の “AND”を除去する

  If Len(strCriteria) <> 0 Then

    strCriteria = Left(strCriteria, Len(strCriteria) - 5)

  End If

  BuildCriteria = strCriteria

 

End Function

 

'---------------------------------------

' フォーム固有のメソッド

'---------------------------------------

Public Sub SetCaption(rpt As Report)

  rpt.Caption = mstrReportTitle

End Sub

 

Public Sub SetCriteria(lbl As Label)

  lbl.Caption = "印刷条件(" & mstrCriteria & ""

End Sub

 

 

 

Tip

印刷条件を入力するコントロールのタブ(Tab)プロパティに、ReportIDを設定するとき表1-2-3に示すようなマトリックスを作成すると便利です。

 

1-2-3 印刷条件とReportIDのマトリックス  (○:該当)

 

 110

 120

 210

 220

 230

 240

 410

 420

 430

 440

 450

 460

銀行ID

 

 

 

 

 

 

支店ID

 

 

 

 

 

 

 

 

 

 

納期ID

 

 

 

 

 

 

 

 

受注日

 

 

 

 

 

 

ストック

 

 

 

 

 

 

 

 

 

 

 

ノンストック

 

 

 

 

 

 

 

 

 

 

 

レーザー

 

 

 

ドッド

 

 

 

 

 

 

 

 

 

 

 

 

 

ダウンロード (CH1-2.lzh)