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

得意先データをWordに差し込んで印刷するお手本

 

6-5-1 得意先を絞り込んでWordに差し込んで印刷するサンプルデータベース

 

このサンプルデータベースは、得意先テーブルに抽出条件を設定して絞り込んで、Wordに差し込んで印刷します。抽出条件は、得意先テーブルの任意のフィールドに最大3個まで設定することができます。フィールドのコンボボックスからフィールド名を選択すると、比較演算子の一覧(Like, BETWEEN, NOT BETWEEN, =, NOT =, > , < , >=, <=)が表示されますので、9種類の中から1個選択します。演算子を選択すると、フィールド値を入力するテキストボックスにフォーカスが移動しますので、検索値を入力します。演算子に、BETWEENを選択したときは、値1と値2のテキストボックスが表示されます。レコードのフィルタボタンをクリックすると、フィルタ条件に該当する得意先の一覧が表示されます。得意先が表示されたら、マークボタンをクリックしてチェックマークを付けます。このチェックマークは、Wordの差し込み印刷でフィルタ条件として使用します。

 

Wordのアイコンをクリックして、チェックマークの付いた得意先をWordの定型書簡に差し込んで印刷します。Wordのアイコンをクリックすると、定型書簡の一覧が表示されますので、目的の定型書簡を選択してOKボタンをクリックします。Wordが起動されて、定型書簡に、得意先データが差し込まれて印刷されます。

 

6-5-2 定型書簡に得意先データを差し込んで印刷した例

 

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

 

◆ Wordの定型書簡にAccessの得意先データを差し込んで印刷する方法

◆ 得意先テーブルの任意のフィールドにフィルタ条件を設定する方法

◆ フォルダに格納されている定型書簡の一覧をリストボックスに表示させる方法

 

   サンプルデータベースで使用するテーブル/クエリを準備するには

 

1 Access を起動したら作業フォルダに、新規データベースCH6-5.mdbを作成します。

 

2 ファイルメニューから外部データの取り込みインポートをクリックします。インポートのダイアログが表示されたら、Northwind.mdbデフォルトでは、”C:\Program Files\Microsoft Office\Office\Samples”にインストールされます。)を選択してインポートのボタンをクリックします。オブジェクトのインポートのダイアログが表示されたら、テーブルのタブをクリックして、得意先を選択します。OKボタンをクリックしてインポートを完了させます。

 

6-5-3 Northwind.mdbから得意先テーブルを選択してインポートする

 

3 データベースウィンドウのテーブルをクリックして、得意先テーブルがインポートされていることを確認します。得意先テーブルをデザインモードで開いたら、フィールドの最後にSelectedのフィールドを追加します。データ型のコンボボックスからは、Yes/Noを選択します。メニューから上書き保存のアイコンをクリックして保存したら、テーブル閉じます。

 

6-5-4 得意先テーブルに新規フィールド Selected を追加

 

4 データベースウィンドウからクエリをクリックしたら、一覧からデザインビューでクエリを作成するをダブルクリックします。テーブルの表示ダイアログが表示されたら、得意先テーブルを選択して追加ボタンをクリックします。閉じるのボタンをクリックして、ダイアログを閉じます。図6-5-5のようなクエリを作成したら、qryMailMergeの名称で保存します。ここで作成したクエリは、Wordの差し込み印刷で使用します。

 

6-5-5 Wordの差し込み印刷で使用するクエリを作成

 

5 データベースウィンドウからテーブルをクリックして、得意先テーブルを開いたら、得意先コード1,2,3のSelectedフィールドをクリックしてチェックマークを付けます。ここでチェックを付けた得意先は、Wordの定型書簡を作成するときにテスト用に使用します。

 

6 テーブルとクエリの準備ができたら、Access を終了させます。

 

 

   Wordの差し込み印刷で使用する定型書簡を作成するには

 

1 Word を起動したら、挿入メニューからèファイルからをクリックして、Northwind Traderのロゴ(nwlogo.gif)を挿入します。nwlogo.gifは、サブフォルダ(CH6-5)に格納されています。

 

2 ロゴを挿入したら、メニューから図形描画のアイコンをクリックして、図形描画のツールボックスを表示させます。ツールボックスからワードアートのアイコンをクリックしたら、左から1列目の上から3番目のスタイルを選択してOKボタンをクリックします。ワードテキストの編集ダイアログが表示されたら、“Northwind Trader”を入力してOKボタンをクリックします。

 

6-5-6 左から1列目の上から3番目のスタイルを選択

 

3 挿入メニューから日付と時刻をクリックして、ダイアログを表示させたら“平成99年99月99日”の表示形式を選択して、OKボタンをクリックします。

 

6-5-7 日付と時刻のダイアログから先頭の表示形式を選択

 

4 図6-5-8のような定型書簡の雛型を作成したら、ツールメニューから差し込み印刷ヘルパーをクリックします。差し込みヘルパーのダイアログに表示されている手順で、メイン文書(定型書簡)、データファイル(CH6-5.MDBqryMailMerge)を選択します。これで、AccessのクエリとWordの定型書簡がリンクされます。

 

6-5-8 定型書簡の雛型を作成

 

5 メニューから差し込みフィールドの挿入をクリックして、qryMailMergeのフィールド一覧を表示させて、図3-5-9のようにフィールドを埋め込みます。<<郵便番号>>のように表示されているのは、差し込み印刷されることを意味します。

 

6-5-9 定型書簡にqryMailMergeのフィールドを埋め込む

 

6 メニューから差し込みをクリックして、qryMailMergeの内容が差し込み印刷されるか確認します。

 

6-5-10 定型書簡にqryMailMergeのデータが差し込み印刷された例

 

7 差し込み印刷が正常に動作することを確認したら、定型書簡をLetter1.docの名称で作業フォルダに保存して、Word を終了させます。

 

以上、Word の差し込み印刷用の定型書簡を作成する手順を説明しましたが、同様の手順で図6-5-11に示すような定型書簡を作成して、Letter2.docの名称で作業フォルダに保存します。

 

6-5-11 定型書簡2を作成したら、Letter2.docの名称で作業フォルダに保存

 

NOTE

Wordで差し込み印刷用の定型書簡を作成した場合、Access のデータベース(CH6-5.mdb)のフルパス名(例:C:\Access\Temp\CH6-5.mdb)が埋め込まれます。Access

のデータベース(.MDB)を別のドライブ/フォルダに移動すると、このリンクが破壊されます。この場合、Word を起動して定型書簡を開いたら、ツールメニューから差し込み印刷ヘルパーをクリックしてデータファイルを再リンクする必要があります。

 

 

Tip:

Access のデータベースとWord の定型書簡ファイルが同じフォルダに格納されているときは、フォルダごと移動すると再リンクする必要がありません。

 

 

   得意先を絞り込んでWordの定型書簡に差し込み印刷するフォームを作成するには

 

1 Access を起動したら、作業フォルダに作成したCH6-5.mdbを開きます。

 

2 ファイルメニューから外部データの取り込みインポートをクリックしてCH6-5.mdbからモジュール basFileSearch, basMailMerge, basMyLibをインポートします。

 

3 データベースウィンドウからモジュールをクリックして、basMailMergeをデザインモードで開きます。VBEが起動されてモジュールウィンドウが表示されたら、ツールメニューから参照設定をクリックして、参照設定ダイアログを表示させます。参照可能なライブラリファイルから、Microsoft DAO 3.6 Object Library, Microsoft Word X.0 Object Library, Microsoft Office X.0 Object Libraryを選択して登録します。OKボタンをクリックしてダイアログを閉じます。

 

6-5-12 DAO 3.6, Word 9.0, Office 9.0 Object Libraryを登録

 

4 モジュールウィンドウを閉じたら、Access に戻ります。データベースウィンドウからフォームをクリックして、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、リストボックスからデザインビューを選択します。基になるテーブル/クエリのコンボボックスから、得意先テーブルを選択したらOKボタンをクリックします。

 

5 フォームのデザインビューが表示されたら、ツールボックスを表示させます。ツールボックスから、タブコントロールのアイコンをクリックしてフォームヘッダーに配置します。タブコントロールにタブを3個作成したら、1番目のタブをクリックして、得意先テーブルのフィールド名を表示するコンボボックス、比較演算子を表示するコンボボックス、値1、値2を入力するテキストボックスを作成します。値1と値2の間には、”AND”のラベルを作成します。得意先テーブルのフィールド名を表示するコンボボックスの値集合ソースは、実行時に設定します。比較演算子を表示するコンボボックスの値集合ソースには、Like, BETWEEN, NOT BETWEEN, =, NOT =, > , < , >=, <=の9種類の演算子を埋め込みます。同様の手順で、2番目、3番目のタブにも、1番目のタブと同じコントロールを作成します。

 

6-5-13 フォームヘッダーにタブコントロールを作成

 

6 ツールボックスからコマンドボタンのアイコンをクリックしたら、タブコントロールの右に4個のコマンドボタン(Word、フィルタ、フィルタ解除、閉じる)を作成します。フォームヘッダーに配置したコントロールのプロパティは、表6-5-1のように設定します。

 

6-5-14 フォームヘッダーに4個のコマンドボタンを作成

 

6-5-1 フォームヘッダーに配置してコントロールのプロパティ

コントロールの種類

プロパティ

タブコントロール

名前

tabFilter

タブコントロール(ページ1)

標題

条件1

ピクチャ

ビットマップ

タブコントロール(ページ2)

標題

条件2

ピクチャ

ビットマップ

タブコントロール(ページ3)

標題

条件3

ピクチャ

ビットマップ

コンボボックス1
(ページ1~3)

名前

cboFieldNameA(Page1)
cboFieldNameB(Page2)

cboFieldNameC(Page3)

値集合タイプ

値リスト

値集合ソース

実行時設定

連結列

1

列数

2

列幅

2.8cm;0cm

コンボボックス2
(ページ1~3)

名前

cboConditionA(Page1)
cboConditionB(Page2)

cboConditionC(Page3)

値集合タイプ

値リスト

値集合ソース

"LIKE";"BETWEEN";"NOT BETWEEN";"=";"NOT =";">";"<";">=";"<="

連結列

1

列数

1

テキストボックス1
(ページ1~3)

名前

txtValue1A(Page1)

txtValue1B(Page2)

txtValue1C(Page3)

可視

いいえ

ラベル1
(ページ1~3)

標題

AND

可視

いいえ

テキストボックス2
(ページ1~3)

名前

txtValue2A(Page1)

txtValue2B(Page2)

txtValue2C(Page3)

可視

いいえ

コマンドボタン1

名前

cmdMailMerge

ヒントテキスト

差込印刷(Alt+W)

コマンドボタン2

名前

cmdFilter

ヒントテキスト

フィルタの実行(Alt+F)

コマンドボタン3

名前

cmdReSet

ヒントテキスト

フィルタの解除(Alt+R)

コマンドボタン4

名前

cmdExit

ヒントテキスト

フォームを閉じる(Alt+X)

 

7 メニューからフィールドリストのアイコンをクリックして、得意先テーブルのフィールドリストを表示させます。フィールドリストからSelectedをドラッグして、フォーム詳細に配置します。同様の手順で、得意先名、部署、担当者名、電話番号をドラッグしてフォーム詳細に配置します。フォーム詳細に配置した、テキストボックスのラベルを切り取って、フォームヘッダーに貼り付けて図6-5-15のように再配置します。Selectedのラベルは、削除して替わりにトグルボタンを作成します。トグルボタンのプロパティを表示させたら、名前を“tglMark”に書き替えて、標題に“マーク”を設定します。

 

6-5-15 フォーム詳細に得意先のデータを表示するテキストボックスを作成

 

8 フォームのプロパティを表示させたら、既定のビューに“帳票フォーム”を設定します。メニューからコードのアイコンをクリックしてフォームモジュールを表示させたら、CH6-5.mdbを開いて、frmMailMergeのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト6-5-1を参照してください。

 

9 フォームをfrmMailMergeの名称で保存したら、Access を終了させます。

 

 

Form_Load()イベントの処理

このイベントは、フォームが開かれてデータをロードするときに発生します。このイベントでは、フォームに連結されている得意先テーブルのフィールド名を取得して、フィールド名を表示するコンボボックスの値集合ソースに設定します。尚、コンボボックスに表示するフィールドは、“Selected”とデータ型がOLEオブジェクトの場合、除外しています。

 

  With Me.Recordset

    For Each fld In .Fields

      With fld

        If .Name <> "Selected" Then

          If Not .Type = dbLongBinary Then

            strRowSource = strRowSource & .Name & ";" & .Type & ";"

          End If

        End If

      End With

    Next fld

    strRowSource = Left(strRowSource, Len(strRowSource) - 1)

  End With

 

 

cboFieldNameA_AfterUpdate()イベントの処理

このイベントは、コンボボックスからフィールド名を選択したときに発生します。このイベントでは、比較演算子のコンボボックスにフォーカスを移動して、ドロップダウンリストを自動的に表示します。

 

      Me.cboConditionA.SetFocus

      Me.cboConditionA.Dropdown

 

 

cboConditionA_AfterUpdate()イベントの処理

このイベントは、比較演算子のコンボボックスから演算子を選択したときに発生します。このイベントでは、比較演算子に”BETWEEN”が含まれるか調べます。”BETWEEN”が含まれるときは、値1と値2のテキストボックス、そして”AND”のラベルを可視状態にします。”BETWEEN”が含まれないときは、値1のテキストボックスのみ可視状態にします。最後に、値1のテキストボックスにフォーカスを移動します。

 

 

txtValue1A_AfterUpdate()のイベント処理

このイベントは、値1のテキストボックスが更新されたときに発生します。このイベントでは、値2のテキストボックスの可視(Visible)プロパティを調べて、Falseのときフィルタコマンドを使用可能(Enabed)にします。

 

 

txtValue2A_AfterUpdate()のイベント処理

このイベントは、値2のテキストボックスが更新されたときに発生します。このイベントでは、フィルタコマンドを使用可能(Enabled)にします。

 

 

tglMark_AfterUpdate()イベントの処理

このイベントは、マークのトグルボタンをクリックしたときに発生します。このイベントでは、トグルボタンの値(True/False)を調べて、得意先テーブルのSelectedフィールドを更新します。

 

  With Me.tglMark

    If .Value Then

      strSQL = "UPDATE 得意先 SET 得意先.Selected = True"

    Else

      strSQL = "UPDATE 得意先 SET 得意先.Selected = False"

    End If

    If Len(mstrCriteria) <> 0 Then

      strSQL = strSQL & " WHERE " & mstrCriteria & ";"

    End If

    CurrentDb.Execute strSQL

  End With

 

 

cmdFilter_Click()イベントの処理

このイベントは、フォームのフィルタボタンをクリックしたときに発生します。このイベントでは、フォームの条件1~3に入力したフィルタ条件を基に、SQLWHERE句を生成して、フォームのフィルタプロパティ(Filter)に設定します。フォームに入力したフィルタ条件から、WHERE句を生成するにはBuildCriteria()関数を使用します。この関数には引数として、フィールド名、データ型、比較演算子、値1、値2を指定します。

 

 

cmdReSet_Click()イベントの処理

このイベントは、フォームからフィルタ解除ボタンをクリックしたときに発生します。このイベントでは、条件1~3のフィルタ条件の値を初期化したり、コマンドボタンの使用可能(Enabled)プロパティを初期化します。また、フォームのFilter, FilterOnプロパティも初期化します。

 

 

cmdMailMerge_Click()イベントの処理

このイベントは、フォームからWordの差し込み印刷のコマンドボタンをクリックしたときに発生します。このイベントでは、フォームのRecalcメソッドを使用してマークをテーブルに強制的に反映させます。次に、DoCmdOpenFormメソッドでfrmPopWordDocをダイアログモードで開きます。(フォームをダイアログモードで開くと、そのフォームが閉じられるか、非可視状態になるまで、DoCmd.OpenFormは待ち状態になります。)ダイアログから、OKまたはCancelボタンをクリックすると、DoCmd.OpenFormの待ち状態が解除されます。ダイアログから、OKCancelいずれのボタンをクリックしたか調べるのに、IsLoaded()関数を使用します。IsLoaded()の戻り値がTrueのときは、ダイアログからOKボタンをクリックしたことを意味しますから、ダイアログから定型書簡のファイル名を取得して閉じます。最後に、MailMerge_FS()関数を呼び出して、Wordの差し込み印刷を実行します。IsLoaded()の戻り値がFalseのときは、ダイアログからCancelボタンをクリックしたことを意味しますから、差し込み印刷の処理をスキップします。MailMerge_FS()のソースコードは、リスト6-5-2を参照してください。

 

 

BuildCriteria()関数

この関数は引数で指定された、フィールド名、データ型、比較演算子、値1、値2を基に、SQLWHERE句を生成して返します。比較演算子が“BETWEEN”のときは、WHERE句が”フィールド名 BETWEEN 値1 AND 値2“の形式になるようにします。比較演算子が”LIKE”のときは、WHERE句が”フィールド名 LIKE *値1*“の形式になるように値の前後に*を付加します。フィールドのデータ型により、値に(‘、#)などを付加します。

 

例:       テキスト型:        ‘文字列

            日付型:                             #2000/10/03#                    

 

 

IsLoaded()関数

この関数は、引数で指定されたフォームがロードされているか調べて戻り値として(True/False)を返します。この関数は、frmPopWordDocをダイアログモードで開いたとき、ダイアログからOKCancelのいずれのボタンをクリックしたか調べるのに使用しています。OKボタンをクリックしたときは、Trueが返されます。Cancelボタンをクリックしたときは、Falseが返されます。OKボタンをクリックしたときは、frmPopWordDocがロードされていますので、フォーム情報を取得することができます。

 

 

リスト6-5-1 frmMailMergeのフォームモジュール(一部のソースコードのみ掲載しています)

Option Compare Database

Option Explicit

 

Const conErrCantDisable = 2164

Private mstrCriteria As String

 

Private Sub cboConditionA_AfterUpdate()

  With Me

    If InStr(1, .cboConditionA, "BETWEEN", vbTextCompare) > 0 Then

      .txtValue1A.Visible = True

      .txtValue2A.Visible = True

      .lblAndA.Visible = True

    Else

      .txtValue1A.Visible = True

      .txtValue2A.Visible = False

      .lblAndA.Visible = False

    End If

    .txtValue1A.SetFocus

  End With

End Sub

 

Private Sub cboFieldNameA_AfterUpdate()

  Me.cboConditionA.SetFocus

  Me.cboConditionA.Dropdown

End Sub

 

Private Sub chkSelected_AfterUpdate()

  Me.cmdMailMerge.Enabled = True

End Sub

 

Private Sub cmdExit_Click()

  DoCmd.Close

End Sub

 

Private Sub cmdFilter_Click()

  Dim strSQL As String

  Dim strCriteria As String

 

  On Error GoTo HandleErrors

 

  With Me

    If Len(.cboFieldNameA) Then

      If Len(.cboConditionA) Then

        strCriteria = "(" & _

          BuildCriteria(.cboFieldNameA.Column(0), _

          .cboFieldNameA.Column(1), .cboConditionA, _

          Nz(.txtValue1A), Nz(.txtValue2A)) & ") AND "

      End If

    End If

    If Len(strCriteria) Then

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

    End If

  End With

  mstrCriteria = strCriteria

  ' MsgBox strCriteria

  With Me

    .Filter = strCriteria

    .FilterOn = True

    .Requery

    .cmdMailMerge.Enabled = True

    .cmdReSet.Enabled = True

    .cmdFilter.Enabled = False

  End With

 

ExitHere:

  Exit Sub

 

HandleErrors:

  If Err.Number = conErrCantDisable Then

    Dim ctl As Control

    Set ctl = Screen.ActiveControl

    Me.cmdExit.SetFocus

    ctl.Enabled = False

    Resume Next

  Else

    MsgBox Err.Number & vbCrLf & Err.Description, _

      vbExclamation, "cmdFilter_Click()"

    Resume ExitHere

  End If

End Sub

 

Private Function BuildCriteria(strFieldName As String, _

  intType As Integer, _

  strCondition As String, _

  varValue1 As Variant, _

  Optional varValue2 As Variant) As String

 

  Dim fBetween As Boolean

  Dim fLike As Boolean

  Dim strCriteria As String

     

 

  fBetween = IIf(InStr(1, strCondition, "BETWEEN", vbTextCompare) > 0, True, False)

  fLike = IIf(InStr(1, strCondition, "LIKE", vbTextCompare) > 0, True, False)

 

  strCriteria = strFieldName & " "

  Select Case intType

    Case dbText, dbMemo

      If InStr(1, varValue1, "*") > 0 Then

        strCriteria = strCriteria & " Like '" & varValue1 & "'"

      Else

        If fLike Then

          strCriteria = strCriteria _

            & strCondition & " '*" & varValue1 & "*'"

        Else

          strCriteria = strCriteria _

            & strCondition & " '" & varValue1 & "'"

        End If

      End If

     

    Case dbInteger, dbLong, dbCurrency, dbDouble, dbSingle

      If fBetween Then

        strCriteria = strCriteria _

          & strCondition & " " & varValue1 & " AND " & varValue2

      Else

        strCriteria = strCriteria _

          & strCondition & " " & varValue1

      End If

    Case dbDate

      If fBetween Then

        strCriteria = strCriteria & strCondition _

          & " #" & Format(varValue1, "yyyy/mm/dd") & "# AND #" _

          & Format(varValue2, "yyyy/mm/dd") & "#"

      Else

        strCriteria = strCriteria & strCondition _

          & " #" & Format(varValue1, "yyyy/mm/dd") & "#"

      End If

    Case Else

      strCriteria = strCriteria & strCondition & " " & varValue1

  End Select

  BuildCriteria = strCriteria

 

End Function

 

Private Sub cmdMailMerge_Click()

  Const conPopupForm = "frmPopWordDoc"

  Dim strWordDoc As String

 

  Me.Recalc

  DoCmd.OpenForm conPopupForm, WindowMode:=acDialog

  If IsLoaded(conPopupForm) Then

      strWordDoc = Forms(conPopupForm).lstWordDoc.Value

      DoCmd.Close acForm, conPopupForm

      MailMerge_FS (strWordDoc)     

  End If

 

End Sub

 

Private Sub cmdReSet_Click()

  Dim strSQL As String

 

  On Error GoTo HandleErrors

 

  With Me

    .cboConditionA = vbNullString

    .cboFieldNameA = vbNullString

    .txtValue1A = vbNullString

    .txtValue2A = vbNullString

    .lblAndA.Visible = False   

  

    .Filter = vbNullString

    .FilterOn = False

    .Requery

    .cmdMailMerge.Enabled = False

    .cmdFilter.Enabled = False

    .cmdReSet.Enabled = False

  End With

 

ExitHere:

  Exit Sub

 

HandleErrors:

  If Err.Number = conErrCantDisable Then

    Dim ctl As Control

    Set ctl = Screen.ActiveControl

    Me.cmdExit.SetFocus

    ctl.Enabled = False

    Resume Next

  Else

    MsgBox Err.Number & vbCrLf & Err.Description, _

      vbExclamation, "cmdReset_Click()"

    Resume ExitHere

  End If

 

End Sub

 

Private Sub Form_Load()

  Dim strSQL As String

  Dim fld As DAO.Field

  Dim strRowSource As String

 

  With Me.Recordset

    For Each fld In .Fields

      With fld

        If .Name <> "Selected" Then

          If Not .Type = dbLongBinary Then

            strRowSource = strRowSource & .Name & ";" & .Type & ";"

          End If

        End If

      End With

    Next fld

    strRowSource = Left(strRowSource, Len(strRowSource) - 1)

  End With

 

  With Me

    .cboFieldNameA.RowSource = strRowSource

    .cmdMailMerge.Enabled = False

    .cmdFilter.Enabled = False

    .cmdReSet.Enabled = False

    .Repaint

  End With

 

End Sub

 

Private Sub Selected_AfterUpdate()

  Me.cmdMailMerge.Enabled = True

End Sub

 

Private Sub tglMark_AfterUpdate()

  Dim strSQL As String

  With Me.tglMark

    If .Value Then

      strSQL = "UPDATE 得意先 SET 得意先.Selected = True"

    Else

      strSQL = "UPDATE 得意先 SET 得意先.Selected = False"

    End If

    If Len(mstrCriteria) <> 0 Then

      strSQL = strSQL & " WHERE " & mstrCriteria & ";"

    End If

    CurrentDb.Execute strSQL

  End With

  Me.Recalc

  Me.Repaint

End Sub

 

Private Sub txtValue1A_AfterUpdate()

  With Me

    If Not .txtValue2A.Visible Then

      .cmdFilter.Enabled = True

    End If

  End With

End Sub

 

 

Private Sub txtValue2A_AfterUpdate()

  With Me

    .cmdFilter.Enabled = True

  End With

End Sub

 

Private Function IsLoaded(strName As String) _

  As Boolean

  IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strName) <> 0)

End Function

 

 

MailMerge_FS()関数

この関数は、Word を起動して定型書簡の差し込み印刷を行います。この関数には、引数として、定型書簡のファイル名を指定します。Set gobjWord = New Word.Applicationで、Word のインスタンスを生成します。DocumentsオブジェクトのOpenメソッドで、引数で指定された定型書簡を開きます。定型書簡を開いたら、ActiveDocumentMailMergeプロパティのExecuteメソッドを実行して差し込み印刷を実行します。この関数では、MailMergeDestinationプロパティにwdSendToNewDocumentを設定して新規の文書ファイルを作成するように設定していますが、wdSendToEmail, wdSendToPrinterを設定すると、メール送信したりプリンタに出力することもできます。ActiveDocumentPrintPreviewメソッドでプレビュー印刷したら、Word の可視(Visible)プロパティをTrueに設定して表示させます。

 

リスト6-5-2 basMailMergeモジュール

Option Compare Database

Option Explicit

 

Public gobjWord As Word.Application

 

Public Function MailMerge_FS(strDocName As String) As Boolean

 

  On Error GoTo MailMerge_FS_Err

  MailMerge_FS = False

 

  DoCmd.Hourglass True

  Set gobjWord = New Word.Application

  With gobjWord

    .Visible = True

    .Documents.Open Application.CodeProject.Path & "\" & strDocName

    DoEvents

    With gobjWord.ActiveDocument.MailMerge

      .Destination = wdSendToNewDocument

      .SuppressBlankLines = True

      .Execute

    End With

    .ActiveDocument.PrintPreview

    .Visible = True

  End With

 

MailMerge_FS_Exit:

  On Error Resume Next

  DoCmd.Hourglass False

  If Not gobjWord Is Nothing Then

    gobjWord.Quit

    Set gobjWord = Nothing

  End If

  Exit Function

 

MailMerge_FS_Err:

  MsgBox "Error # " & Err.Number & ": " & Err.Description

  Resume MailMerge_FS_Exit

 

End Function

 

 

   Wordの定型書簡を表示するフォームを作成するには

 

1 Access を起動したら、作業フォルダに作成したCH6-5.mdbを開きます。

 

2 データベースウィンドウが表示されたら、フォームをクリックして一覧からデザインビューでフォームを作成するをダブルクリックします。

 

3 フォームのデザインビューが表示されたら、ツールボックスを表示させます。ツールボックスから、リストボックスのアイコンをクリックして、フォーム詳細に配置します。リストボックスのプロパティを表示させたら、名前をlstWordDocに書き替えます。値集合タイプには“値リスト”を設定します。値集合ソースは、実行時に設定します。

 

4 ツールボックスからコマンドボタンのアイコンをクリックして、OKCancelのコマンドボタンを作成します。フォームに配置したコントロールのプロパティは、表6-5-2のように設定します。

 

6-5-2 フォームに配置したコントロールのプロパティ

コントロールの種類

プロパティ

リストボックス

名前

lstWordDoc

値集合タイプ

値リスト

値集合ソース

実行時設定

連結列

1

列数

1

コマンドボタン1

名前

cmdOK

標題

OK

コマンドボタン2

名前

cmdCancel

標題

Cancel

 

 

6-5-16 リストボックスにWordの定型書簡を表示するフォームのレイアウト

 

5 メニューからコードのアイコンをクリックして、フォームモジュールを表示させます。CH6-5.mdbを開いて、frmPopWordDocのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト6-5-3を参照してください。

 

6 フォームをfrmPopWordDocの名称で保存します。

 

7 データベースウィンドウからfrmMailMergeを選択して開きます。フォームが表示されたら、条件1のフィールドリストのコンボボックスから、得意先コードを選択します。比較演算子のコンボボックスにフォーカスが移動したら、“BETWEEN”を選択します。値1と値2のテキストボックスが表示されたら、得意先コードの範囲としてを入力します。フィルタボタンをクリックして、検索条件と一致する得意先を表示させます。得意先の一覧が表示されたら、左端のチェックマークがチェックされているか確認します。チェックされていないときは、マークのトグルボタンをクリックして、チェックマークを付けます。(Wordの差し込み印刷で使用しているクエリは、チェックマークが付いている得意先のみ印刷の対象とします。)Wordのボタンが使用可能状態に切り替わっていますので、クリックします。

 

6-5-17 得意先コードで範囲を指定して、差し込み印刷する得意先を抽出した例

 

8 Wordの差し込み印刷ボタンをクリックすると、カレントフォルダに格納されている、Wordの定型書簡の一覧が表示されますので、Letter1.docを選択してOKボタンをクリックします。

 

6-5-18 カレントフォルダに格納されているWordの定型書簡の一覧が表示された例

 

9 Word が起動されて、定型書簡(Letter1.doc)が開かれます。定型書簡には、Access のクエリqryMailMergeがリンクされていますので、先程抽出した3件の得意先が差し込まれて印刷されます。結果を確認したら、Wordの定型書簡を閉じます。

 

6-5-19 絞り込まれた得意先データがWordの定型書簡(Letter1.doc)に差し込み印刷された例

 

10 Accessを終了させます。

 

 

Form_Load()イベントの処理

このイベントは、フォームが開かれてデータをロードするときに発生します。このイベントでは、FileSearch_FS()関数を呼び出して、カレントフォルダ(現在開かれている、MDBが存在するフォルダ)に格納されている定型書簡(.DOC)のファイル名を取得します。この関数の引数には、検索するパス名と、ファイルの拡張子を指定します。この関数で取得したファイルは、セミコロン(;)区切りになっていますので、リストボックスの値集合ソースに設定します。FileSearch_FS()関数は、basFileSearchモジュールに登録されていますので、詳細はそちらを参照してください。

 

 

cmdOK_Click()イベントの処理

このイベントは、フォームのOKボタンをクリックしたときに発生します。このイベントでは、フォームを非可視状態にして制御を、frmMailMergeDoCmd.OpenFormに戻します。(frmPopWordDocは、ダイアログモードで開かれていますので、DoCmd.OpenFormは、非可視状態になるか閉じられるまで待たされます。)

 

 

cmdCancel_Click()イベントの処理

このイベントは、フォームからCancelボタンをクリックしたときに発生します。このイベントでは、フォームを閉じて、frmMailMergeDoCmd.OpenFormに制御を戻します。

 

 

リスト6-5-3 frmPopWordDocのフォームモジュール

Option Compare Database

Option Explicit

 

Private Sub cmdCancel_Click()

  DoCmd.Close

End Sub

 

Private Sub cmdOK_Click()

  Me.Visible = False

End Sub

 

Private Sub Form_Load()

  Dim strLookIn As String

  Dim strRowSource As String

 

  strLookIn = CurrentProject.Path

  strRowSource = FileSearch_FS(strLookIn, "*.doc")

  Me.lstWordDoc.RowSource = strRowSource

End Sub

 

Private Sub lstWordDoc_DblClick(Cancel As Integer)

  cmdOK_Click

End Sub

 

ダウンロード (CH6-5.lzh)
Accessお手本データベースのホームへ戻る