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


Accessで印刷メニューを作成するとき、一般に図1に示すようなコマンドボタンを使用します。コマンドボタンをクリックすると、更に図2に示すような印刷条件を入力するフォームを表示する場合がよくあります。この場合、印刷条件を入力してから印刷ボタンをクリックして印刷します。

Day1_fig1.gif (6239 バイト)
図1-コマンドボタンを使用したメニューの作成例

 

Day1_fig2.gif (3510 バイト)
図2-印刷条件を設定するフォーム

この例では、印刷条件を入力するフォームをコマンドボタン毎に個別に作成する必要があります。この方式は、印刷メニューのコマンドボタンが少ないときは良いのですが、コマンドボタンが多くなると開発効率が低下します。

図3のデータドリブン型の印刷メニューは、この欠点を解決しています。レポートの一覧は、リストボックスに表示されますからレポートが追加されてもフォームを変更する必要がありません。また、印刷条件を入力するフォームをレポート毎に作成しないでリストボックスの右側に配置しています。印刷条件を入力するコンボボックス、テキストボックス、チェックボックスなどはレポートを選択するまで無効にしておきます。

Day1_fig3.gif (10605 バイト)
図3-データドリブン型の印刷メニュー

レポートを選択したとき、該当する印刷条件のみ有効にします。図4では、レポート(完全別寸集計表)を選択したとき、対応する印刷条件(納期ID、登録日)を有効にしています。図4のフォーム下にレーザプリンタとドットプリンタのコマンドボタンがありますが、このボタンもレポートと連動しています。レーザプリンタに印刷するレポートを選択したときは、レーザプリンタのコマンドボタンが有効になり、ドッドプリンタに印刷するレポートを選択したときは、ドッドプリンタのコマンドボタンが有効になります。

Day1_fig4.gif (10726 バイト)
図4-レポートを選択したとき対応する印刷条件を有効とする

前置きが長くなりましたが、これからデータドリブン型の印刷メニューを作成するテクニックを説明します。

  1. Access 97/2000を起動して新規データベース(Day1.mdb)を作成します。

  2. ツールメニューからオプションをクリックしてオプションダイアログを表示させます。全般のタブをクリックしてプロパティの表示を英語に変えてOKのボタンをクリックします。(ここでは、VBAを使用してプロパティを書き換えしますのでプロパティは英語に統一します)

    Access 2000では、ツールメニューからプロパティを英語に変更する機能がありません。プロパティを英語で参照するには、VBE(Visual Basic Editor)を起動して参照します。

     

    Day1_fig5.gif (7454 バイト)
    図5-Access97のオプションダイアログ


  3. データベースウィンドウのテーブルタブをクリックしたら新規作成ボタンをクリックしてレポートテーブル(tblReports)を作成します。
    Day1_fig6.gif (1848 バイト)
    図6-レポートタイトル、レポート名を格納するテーブルの作成

    テーブルのフィールド名とデータ型は以下のように設定します。

    フィールド名 データ型 説明
    ReportID Number (Integer) レポートID(プライマリーキー)
    ReportTitle Text (50) リストボックスに表示されるレポートのタイトルを入力します
    ReportName Text(50) レポート名または関数名を入力します

  4. テーブルを作成したらサンプルデータを入力します。サンプルレポート1-3までは、Accessのレポート名を入力しています。サンプルレポート4と5は、オートメーション機能を使用してExcelから印刷しますからレポート名の代わりに関数名を入力しています。関数名を入力する場合は、レポート名と区別するために先頭に=を付加します。
    Day1_fig7.gif (2501 バイト)
    図7-レポートテーブルのサンプルデータ

  5. これでレポートテーブルの準備が完了しましたので、印刷用のメニューを作成します。

  6. データベースウィンドウのフォームタブをクリックしたら新規作成ボタンをクリックします。

  7. フォームの新規作成ダイアログが表示されたらデザインビューを選択してOKボタンをクリックします。
    Day1_fig8.gif (4779 バイト)
    図8-フォームの新規作成ダイアログ

  8. フォームが表示されたらツールボックスからリストボックスIcon_ListBox.gif (78 バイト)クリックしてリストボックスを作成します。(リストボックスを作成する前に、ツールボックスのコントロールウイザードボタンIcon_ControlWizard.gif (180 バイト)をクリック《有効》にしておきます)
    Day1_fig9.gif (5004 バイト)
    図9-フォームにリストボックスを作成

  9. フォーム上にリストボックスを配置するとリストボックスウイザードが起動されますのでテーブルまたはクエリーの値を表示するを選択して次へのボタンをクリックします。

    Day1_fig10.gif (5202 バイト)
    図10-テーブルまたはクエリーの値を表示するを選択

    tblReportsを選択したら次へのボタンをクリックします。

    Day1_fig11.gif (5552 バイト)
    図11-tblReportsを選択

    >>のボタンをクリックして全てのフィールドを選択したら次へのボタンをクリックします。

    Day1_fig12.gif (6391 バイト)
    図12->>ボタンをクリックして全フィールドを選択

    一覧にレポートタイトル(ReportTitle)のみ表示されるように調整したら次へのボタンをクリックします。

    Day1_fig13.gif (5657 バイト)
    図13-レポートタイトルのみ表示するようにカラムを調整

    最後にリストボックスのラベルにレポート一覧を入力したら完了のボタンをクリックします。

    Day1_fig14.gif (6215 バイト)
    図14-リストボックスのラベルを入力

  10. フォーム上にリストボックスが作成されたら、リストボックスのコントロール名をlstReportsに変更します。その他のプロパティが以下のようになっているか確認します。



    Day1_fig15.gif (4172 バイト)
    Day1_fig15a.gif (5955 バイト)
    Day1_fig15b.gif (4043 バイト)
    図15-リストボックスの各種プロパティ

  11. メニューからフォームビューのアイコンIcon_View.gif (109 バイト)をクリックしてリストボックスにレポート一覧が表示されるか確認します。
    Day1_fig16.gif (3010 バイト)
    図16-リストボックス実行結果

  12. 印刷条件を指定する必要がない場合、レポートをクリックしたときレポートを開く処理を追加すれば完成します。オートメーション機能を使用してExcel97から印刷するときは、レポートを開く代わりにVBAの関数を呼びます。

  13. リストボックスのクリックイベントに以下のコードをコピーして貼り付けます。リストボックスには、ReportID,ReportTitle,ReportNameの3つのフィールドが指定されていますが、一覧リストにはReportTitleのみ表示されるように設定されています。リストボックスの一覧からレポートタイトルをクリックしたとき、ReportID,ReportTitle,ReportNameを取得するにはColumnプロパティを使用します。
    Debug.print lstReports.Column(0) ReportID
    Debug.print lstReports.Column(1) ReportTitle
    Debug.print lstReports.Column(2) ReportName

    また、ReportNameに関数名=basAutomation1()が指定されているときはEval()関数で呼び出します。

    Private Sub lstReports_Click()
    
        Dim strReportName As String
        Dim strFunctionName As String
        Dim varDummy As Variant
        
        strReportName = lstReports.Column(2)
        If Left(strReportName, 1) = "=" Then
            strFunctionName = Mid(strReportName, 2)
            varDummy = Eval(strFunctionName)
        Else
            DoCmd.OpenReport strReportName, acViewPreview
        End If
        
    End Sub  

  14. リストボックスのクリックイベント処理が正常に動作するかどうか確認するために、データベースウィンドウからレポートタブをクリックしたら新規作成ボタンをクリックしてrptReport1,rptReport2,rpReport3を作成します。
    Day1_fig17.gif (5254 バイト)
    図17-サンプルレポートを作成

  15. レポートを作成したらモジュールタブをクリックしてから新規作成ボタンをクリックしてテスト用の関数を作成します。
    Option Compare Database
    Option Explicit
    
    Public Function basAutomation1()
      MsgBox "Hello Automation1"
    End Function
    
    Public Function basAutomation2()
      MsgBox "Hello Automation2"
    End Function
     

  16. データベースウィンドウからフォームのタブをクリックしたらフォームをビューモードで開いて、リストボックスからレポートタイトルをクリックして正常に動作するか確認します。

  17. 正常に動作することが確認できたらフォームをfrmPrintMenuの名前で保存します。

 


さて、リストボックスが完成したところで次に印刷条件を設定するノウハウを説明します。

  1. 先ほど保存した印刷メニュー(frmPrintMenu)をデザインモードで開きます。

  2. フォーム上に印刷条件としてコンボボックス、テキストボックスそしてオプションボックスを作成します。また、印刷とフォームを閉じるコマンドボタンも作成します。
    Day1_fig20.gif (8317 バイト)
    図20-印刷メニューに印刷条件とコマンドボタンを追加

  3. 印刷条件およびコマンドボタンのコントロール名を以下のように書き換えます。
    オブジェクト名 プロパティ 内容(値)
    コマンドボックス Name cboCriteria1
    テキストボックス Name txtCriteria2
    オプショングループ Name grpCriteria3
    コマンドボタン(印刷) Name cmdPrint
    コマンドボタン(閉じる) Name cmdExit

  4. レポートと該当する印刷条件の対応表を作成します。
    ReportID ReportTitle 印刷条件1 印刷条件2 印刷条件3
    1 サンプルレポート1    
    2 サンプルレポート2    
    3 サンプルレポート3    
    4 サンプルレポート4
    5 サンプルレポート5      
      Tagプロパティの内容 ;1;4; ;2;4; ;3;4;

  5. 印刷条件1,2,3のTagプロパティに該当するReportIDを格納します。このときReportIDはセミコロン(;)で囲みます。また、印刷条件1,2,3のEnabledプロパティはNoに設定しておきます。


    Day1_fig21.gif (4246 バイト)
    Day1_fig21a.gif (4528 バイト)
    図21-印刷条件1,2,3のTagとEnabledプロパティ

  6. リストボックスのクリックイベントを削除してAfterUpdat()イベントを追加します。また、印刷とフォームを閉じるコマンドボタンのクリックイベントに以下のコードを追加します。
    Private Sub lstReports_AfterUpdate()
      Dim intLoop As Integer
      Dim strChoice As String
      Dim strTag As String
    
      strChoice = ";" & CStr(lstReports) & ";"
      
      For intLoop = Me.Count - 1 To 0 Step -1
          If Nz(Me(intLoop).Tag) <> "" Then
              strTag = Me(intLoop).Tag
              If InStr(strTag, strChoice) > 0 Then
                  Me(intLoop).Enabled = True
              Else
                  Me(intLoop).Enabled = False
              End If
          End If
      Next intLoop
    End Sub
    
    Private Sub cmdPrint_Click()
      Dim strReportName As String
      Dim strFunctionName As String
      Dim varDummy As Variant
        
      strReportName = lstReports.Column(2)
      If Left(strReportName, 1) = "=" Then
          strFunctionName = Mid(strReportName, 2)
          varDummy = Eval(strFunctionName)
      Else
          DoCmd.OpenReport strReportName, acViewPreview
      End If
    End Sub
    
    Private Sub cmdExit_Click()
      DoCmd.Close
    End Sub
      

  7. Tip:
    リストボックスのAfterUpdate()イベントでFor....NextFor Each... Nextに置き換えることもできます。この場合、詳細セクションのみ検索することができますので効率が良くなります。

    Private Sub lstReports_AfterUpdate()
      Dim strChoice As String
      Dim strTag As String
      Dim ctl As Control
      
      strChoice = ";" & CStr(lstReports) & ";"
      
      For Each ctl In Me.Section(acDetail).Controls
          If Nz(ctl.Tag) <> "" Then
              strTag = ctl.Tag
              If InStr(strTag, strChoice) > 0 Then
                  ctl.Enabled = True
              Else
                  ctl.Enabled = False
              End If
           End If
      Next ctl  
       
    End Sub  

  8. フォームをビューモードに変えてリストボックスから任意のレポートをクリックして対応する印刷条件が有効になるか確認します。
    Day1_fig22.gif (5488 バイト)
    図22-サンプルレポート4をクリックしたときの実行結果

  9. 正常に動作することを確認したら最後にフォームを保存してAccess97/2000を終了します。

 


Downloadサンプルデータベースのダウンロード