得意先データを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.MDBのqryMailMerge)を選択します。これで、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の名称で作業フォルダに保存
|
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 |
名前 |
cboFieldNameA(Page1) cboFieldNameC(Page3) |
|
値集合タイプ |
値リスト |
|
|
値集合ソース |
実行時設定 |
|
|
連結列 |
1 |
|
|
列数 |
2 |
|
|
列幅 |
2.8cm;0cm |
|
|
コンボボックス2 |
名前 |
cboConditionA(Page1) cboConditionC(Page3) |
|
値集合タイプ |
値リスト |
|
|
値集合ソース |
"LIKE";"BETWEEN";"NOT BETWEEN";"=";"NOT =";">";"<";">=";"<=" |
|
|
連結列 |
1 |
|
|
列数 |
1 |
|
|
テキストボックス1 |
名前 |
txtValue1A(Page1) txtValue1B(Page2) txtValue1C(Page3) |
|
可視 |
いいえ |
|
|
ラベル1 |
標題 |
AND |
|
可視 |
いいえ |
|
|
テキストボックス2 |
名前 |
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に入力したフィルタ条件を基に、SQLのWHERE句を生成して、フォームのフィルタプロパティ(Filter)に設定します。フォームに入力したフィルタ条件から、WHERE句を生成するにはBuildCriteria()関数を使用します。この関数には引数として、フィールド名、データ型、比較演算子、値1、値2を指定します。
cmdReSet_Click()イベントの処理
このイベントは、フォームからフィルタ解除ボタンをクリックしたときに発生します。このイベントでは、条件1~3のフィルタ条件の値を初期化したり、コマンドボタンの使用可能(Enabled)プロパティを初期化します。また、フォームのFilter, FilterOnプロパティも初期化します。
cmdMailMerge_Click()イベントの処理
このイベントは、フォームからWordの差し込み印刷のコマンドボタンをクリックしたときに発生します。このイベントでは、フォームのRecalcメソッドを使用してマークをテーブルに強制的に反映させます。次に、DoCmdのOpenFormメソッドでfrmPopWordDocをダイアログモードで開きます。(フォームをダイアログモードで開くと、そのフォームが閉じられるか、非可視状態になるまで、DoCmd.OpenFormは待ち状態になります。)ダイアログから、OKまたはCancelボタンをクリックすると、DoCmd.OpenFormの待ち状態が解除されます。ダイアログから、OK、Cancelいずれのボタンをクリックしたか調べるのに、IsLoaded()関数を使用します。IsLoaded()の戻り値がTrueのときは、ダイアログからOKボタンをクリックしたことを意味しますから、ダイアログから定型書簡のファイル名を取得して閉じます。最後に、MailMerge_FS()関数を呼び出して、Wordの差し込み印刷を実行します。IsLoaded()の戻り値がFalseのときは、ダイアログからCancelボタンをクリックしたことを意味しますから、差し込み印刷の処理をスキップします。MailMerge_FS()のソースコードは、リスト6-5-2を参照してください。
BuildCriteria()関数
この関数は引数で指定された、フィールド名、データ型、比較演算子、値1、値2を基に、SQLのWHERE句を生成して返します。比較演算子が“BETWEEN”のときは、WHERE句が”フィールド名 BETWEEN 値1 AND 値2“の形式になるようにします。比較演算子が”LIKE”のときは、WHERE句が”フィールド名 LIKE *値1*“の形式になるように値の前後に*を付加します。フィールドのデータ型により、値に(‘、#)などを付加します。
例: テキスト型: ‘文字列’
日付型: #2000/10/03#
IsLoaded()関数
この関数は、引数で指定されたフォームがロードされているか調べて戻り値として(True/False)を返します。この関数は、frmPopWordDocをダイアログモードで開いたとき、ダイアログからOK、Cancelのいずれのボタンをクリックしたか調べるのに使用しています。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メソッドで、引数で指定された定型書簡を開きます。定型書簡を開いたら、ActiveDocumentのMailMergeプロパティのExecuteメソッドを実行して差し込み印刷を実行します。この関数では、MailMergeのDestinationプロパティにwdSendToNewDocumentを設定して新規の文書ファイルを作成するように設定していますが、wdSendToEmail, wdSendToPrinterを設定すると、メール送信したりプリンタに出力することもできます。ActiveDocumentのPrintPreviewメソッドでプレビュー印刷したら、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 ツールボックスからコマンドボタンのアイコン
をクリックして、OKとCancelのコマンドボタンを作成します。フォームに配置したコントロールのプロパティは、表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のテキストボックスが表示されたら、得意先コードの範囲として1と3を入力します。フィルタボタンをクリックして、検索条件と一致する得意先を表示させます。得意先の一覧が表示されたら、左端のチェックマークがチェックされているか確認します。チェックされていないときは、マークのトグルボタンをクリックして、チェックマークを付けます。(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ボタンをクリックしたときに発生します。このイベントでは、フォームを非可視状態にして制御を、frmMailMergeのDoCmd.OpenFormに戻します。(frmPopWordDocは、ダイアログモードで開かれていますので、DoCmd.OpenFormは、非可視状態になるか閉じられるまで待たされます。)
cmdCancel_Click()イベントの処理
このイベントは、フォームからCancelボタンをクリックしたときに発生します。このイベントでは、フォームを閉じて、frmMailMergeのDoCmd.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 |