宛名をラベル用紙の任意の位置から指定した部数分印刷するお手本

図5-3-1 宛名を任意の位置から指定した部数分印刷するサンプルデータベース
このサンプルデータベースは、宛名をラベル用紙の任意の位置から指定した枚数分印刷することができます。最近、宛名ラベルを印刷するとき、レーザープリンタ用のラベル用紙を使用することが多くなってきました。ところが、Access の宛名ラベルウィザードで作成したレポートから、宛名ラベルを印刷すると常にラベル用紙の先頭から印刷されますので、途中まで使用済みのラベル用紙を再使用することができません。このサンプルデータベースでは、ラベル用紙の任意の位置から印刷できますので、途中まで使用済みのラベル用紙を再使用して節約することができます。また、宛名ラベルは、印刷部数を指定して印刷することもできます。
サンプルデータベース(CH5-3.mdb)では、以下に示すノウハウを習得することができます。
◆ 宛名ラベルをラベル用紙の任意の位置から印刷する方法
◆ 宛名ラベルの部数を指定して印刷する方法
◆ 宛名ラベルの印刷開始位置をフォームからボタンをクリックして指定する方法
◆ フォーム独自のプロパティを作成する方法
● サンプルデータベースで使用するテーブルを準備するには
1 Accessを起動したら作業フォルダに、新規データベースCH5-3.mdbを作成します。
2 メニューから外部データの取り込み、テーブルのリンクをクリックします。リンクのダイアログが表示されたら、Access のサンプルデータベース Northwind.mdbを選択してリンクボタンをクリックします。(Northwind.mdbは、デフォルトでは”C:\Program Files\Microsoft Office\Office\Samples”にインストールされます。)
3 テーブルのリンクのダイアログが表示されたら、すべて選択のボタンをクリックします。最後にOKボタンをクリックしてリンクを完了させます。
4 テーブルをリンクしたらデータベースウィンドウにNorthwind.mdbの全てのテーブルが表示されているか確認して、Accessを終了させます。
● 宛名ラベルの印刷開始位置を選択するフォームを作成するには
1 Access を起動したら作業フォルダに作成した CH5-3.mdbを開きます。
2 データベースウィンドウからフォーム
をクリックしたら、一覧からデザインビューでフォームを作成するをダブルクリックします。フォームのデザインビューが表示されたら、ツールボックス
からラベルのアイコン
をクリックしてフォームヘッダーに配置します。ラベルの標題には、“ラベルの印刷開始位置をクリックしてください!”を入力します。次に、ツールボックスからテキストボックスのアイコン
をクリックして、フォームヘッダーのラベルの下に配置します。テキストボックスのラベル標題には、“部数:”を入力します。テキストボックスのプロパティを表示させたら、その他のタブをクリックして名前を
txtCopiesに書き替えます。

図5-3-2 フォームヘッダーにラベルとテキストボックスを配置した例
3 ツールボックスからラベルのアイコン
をクリックしたら、フォームの詳細に配置します。ラベルのプロパティを表示させたら、その他のタブをクリックして名前をlbl1に書き替えます。次に、書式タブをクリックしたら立体表示のコンボボックスから“浮き出し”をクリックします。最後に、イベントタブをクリックしたらクリック時のイベントに=Location(“1”)を埋め込みます。ラベルlbl1を選択したら、マウスの右ボタンをクリックしてショートカットメニューを表示させてコピーをクリックします。フォームの詳細をクリックしたらマウスの右ボタンをクリックしてショートカットメニューを表示させて貼り付けをクリックします。コピー&貼り付けの操作を繰り返して、図2-3-3に示すように12個のラベルを作成します。各ラベルのプロパティは、表5-3-1のように設定します。
表5-3-1 フォームの詳細に配置したラベルのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
ラベル1 |
名前 |
lbl1 |
|
|
立体表示 |
浮き出し |
|
|
クリック時 |
=Location(“1”) |
|
ラベル2~ラベル12 |
名前 |
lbl2-12 |
|
|
立体表示 |
浮き出し |
|
|
クリック時 |
=Location(“2”-“12”) |

図5-3-3 フォームの詳細にラベルを12個配置した例
4 ツールボックスからコマンドボタンのアイコン
をクリックしたらフォームフッターに配置します。コマンドボタンのプロパティを表示させて、名前をcmdOK、標題をOKに書き替えます。同様の手順で、Cancelのコマンドボタンを配置したら、プロパティを表示させて名前をcmdCancel、標題をCancelに書き替えます。
図5-3-4 フォームフッターに2個のコマンドボタンを配置した例
5 メニューからコードのアイコン
をクリックしてフォームモジュールを表示させます。CH5-3.mdbを開いたら、frmSelectLableのフォームモジュールをコピーして貼り付けます。フォームモジュールのソースコードは、リスト5-3-1を参照してください。CH5-3.mdbを開いたら、モジュールbasLinkedTables,basMyLib,basWindowsCommonDialogをインポートします。
6 フォームをfrmSelectLabelの名称で保存したら、Accessを終了させます。
Sub cmdOK_Click()イベントの処理
このイベントは、フォームからOKボタンをクリックしたときに実行されます。このイベントでは、フォームの可視(Visible)プロパティにFalseを設定して非可視状態にします。
frmSelectLabelは、ダイアログとして開かれていますので、DoCmd.OpenFormステートメントは、ダイアログが閉じられるか、非可視状態になるまで待たされます。
DoCmd.OpenForm FormName:=”frmSelectLabel”,
WindowMode:=acDialog
If IsLoaded(”frmSelectLabel”) Then ' OK
‘
ダイアログから情報を取得してから閉じます
DoCmd.Close acForm,
”frmSelectLabel”
Else ' Cancel
Cancel = True
End If
OKボタンをクリックすると、ダイアログが非可視状態になりDoCmd.OpenFormの後続ステートメントが実行されます。このテクニックは、ダイアログから情報を取得するのに便利です。サンプルデータベースでは、ダイアログから宛名ラベルの印刷部数と印刷開始位置を取得しています。
Sub cmdCancel_Click()イベントの処理
このイベントは、フォームからCancelボタンをクリックしたときに実行されます。このイベントでは、フォームを閉じます。
Function Location()関数の処理
この関数は、フォームの詳細に配置された12個のラベルをクリックしたときに実行されます。Location()関数は、ラベルのクリック時のイベントに埋め込まれています。どのラベルをクリックしたかを識別するために、関数の引数に番号(1-12)を指定しています。
Location()関数では、For Each ctl In Me.Section(acDetail).Controls…Nextでフォームの詳細に配置されたラベルを検索してラベルの立体表示(SpecialEffect)のプロパティを浮き出し(acEffectRised)、くぼみ(acEffectSunken)のいずれかに書き替えます。浮き出しが設定されたラベルは印刷領域、くぼみが設定されたラベルは、スキップされる領域を意味します。
Property Get Copies()プロパティの処理
このプロパティは、独自に追加したプロパティで宛名ラベルの印刷部数を取得するとき使用します。
mintCopies =
Forms(”frmSelectLabel”).Copies - 1
Property Get LabelsToSkip()プロパティの処理
このプロパティは、独自に追加したプロパティで宛名ラベルの印字開始位置(1-12)を取得するのに使用します。
mintToSkip =
Forms(”frmSelectLabel”).LabelsToSkip
リスト5-3-1 frmSelectLabelのフォームモジュール
|
Option Compare Database Option Explicit Dim mintItem As Integer Private Sub cmdCancel_Click() DoCmd.Close End Sub Private Sub cmdOK_Click() Me.Visible = False End Sub Public Property Get Copies() As Integer Copies = Me.txtCopies End Property Public Property Get LabelsToSkip() As Integer LabelsToSkip = IIf(mintItem > 0, mintItem - 1, 0) End Property Private Function Location(intItem As Integer) Dim ctl As Control Dim intI As Integer
mintItem = intItem
For Each ctl In Me.Section(acDetail).Controls intI = intI + 1 With ctl If intI >= intItem Then .SpecialEffect = acEffectRaised .ForeColor = vbWindowText Else .SpecialEffect = acEffectSunken .ForeColor = vbGrayText End If End With Next ctl Me.cmdOK.SetFocus End Function |
● 宛名ラベルを印刷するレポートを作成するには
1 Access を起動したら作業フォルダに作成した CH5-3.mdbを開きます。
2 データベースウィンドウからレポート
をクリックしたら、新規作成ボタンをクリックします。レポートの新規作成ダイアログが表示されたら、リストボックスから宛名ラベルウィザードを選択します。基になるテーブル/クエリのコンボボックスから得意先を選択してらOKボタンをクリックします。宛名ラベルウィザードのダイアログが表示されたら、メーカーのコンボボックスからA-ONEを選択します。ラベルの種類からは、単票をクリックします。ラベルの製品番号のリストボックスから28171を選択したら、次へのボタンをクリックします。以下、ウィザードの指示に従って図5-3-6のようなレポートを作成します。

図5-3-5 宛名ラベルウィザードからA-ONE、単票、製品番号(28171)を選択

図5-3-6 宛名ラベルウィザードを使用して得意先の宛名ラベルを印刷するレポートを作成
3 メニューからコードのアイコン
をクリックしてレポートモジュールを表示させます。CH5-3.mdbを開いたら、rptSkipLabelsのレポートモジュールをコピーして貼り付けます。レポートモジュールのリストは、リスト5-3-2を参照してください。
4 メニューから印刷プレビューのアイコン
をクリックします。宛名ラベルの部数と印字開始位置を入力するダイアログが表示されますので、部数に2、印刷開始位置2を選択してOKボタンをクリックします。図5-3-8のように1枚目のラベルがスキップされて2枚目のラベルから宛名が印字されます。また、宛名は2部印字されています。

図5-3-7 ラベル印刷のダイアログから部数と印刷開始位置を指定

図5-3-8 宛名ラベル印刷のプレビュー
5 宛名ラベルの印刷が確認できたら、レポートをrptSkipLablesの名称で保存してAccess を終了します。
Sub Report_Open()イベント処理
このイベントは、レポートが開かれたいたときに実行されます。このイベントでは、宛名ラベルの部数と印字開始位置を入力するダイアログを表示させて、指定された位置から宛名ラベルを印刷します。フォームをダイアログとして開くには、DoCmd.OpenFormのWindowModeの引数にacDialogを指定します。ダイアログとしてフォームを開いたとき、DoCmd.OpenFormステートメントは、ダイアログが閉じられるか、非可視状態になるまで待たされます。ダイアログからOKボタンをクリックしたときは、ダイアログが非可視状態になり、後続する If IsLoaded(conFormName) Then がTrueと判定されて部数と印字開始位置を取得します。尚、部数と印字開始位置は、ダイアログ独自のCopiesプロパティとLabelToSkipプロパティを参照して取得します。
mintToSkip =
Forms(conFormName).LabelsToSkip
部数と印字開始位置を取得したら、DoCmd.Closeでダイアログを閉じます。
ダイアログからCancelボタンをクリックしたときは、ダイアログが既に閉じられた状態で、後続する If IsLoaded(conFormName) Thenが実行されます。ダイアログは、既に閉じられていますからIsLoaded()関数からFalseが返されてElseが実行されます。
DoCmd.OpenForm FormName:=conFormName,
WindowMode:=acDialog
mintCopies =
Forms(conFormName).Copies - 1
mintToSkip =
Forms(conFormName).LabelsToSkip
DoCmd.Close acForm, conFormName
Else ' Cancel
Cancel = True
End If
Private Sub 詳細_Print()イベント処理
このイベントは、詳細のデータを印字する直前に実行されます。このイベントでは、印字開始位置を調べて、印字開始位置までラベルをスキップします。ラベルの印字をスキップして印字位置を進めるには、レポートのNextRecord, PrintSectionプロパティをFalseに設定します。印字開始位置までスキップしたら、指定した部数になるまでレコードの移動を抑止して同じ宛名を印字します。レコードの移動を抑止するには、NextRecordプロパティをFalseに設定します。
Function IsLoaded()関数
この関数は、指定されたオブジェクトがロードされているか診断して結果をTrue/Falseで返します。
リスト5-3-2 rptSkipLabelsのレポートモジュール
|
Option Compare Database Option Explicit Dim mintCopies As Integer Dim mintCopied As Integer Dim mintToSkip As Integer Dim mintSkipped As Integer Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) If mintSkipped < mintToSkip Then Me.NextRecord = False Me.PrintSection = False mintSkipped = mintSkipped + 1 Else If mintCopied < mintCopies Then Me.NextRecord = False mintCopied = mintCopied + 1 Else mintCopied = 0 End If End If End Sub Private Sub Report_Open(Cancel As Integer) Const conFormName = "frmSelectLabel"
DoCmd.OpenForm FormName:=conFormName, WindowMode:=acDialog If IsLoaded(conFormName) Then ' OK mintCopies = Forms(conFormName).Copies - 1 mintToSkip = Forms(conFormName).LabelsToSkip DoCmd.Close acForm, conFormName Else ' Cancel Cancel = True End If DoEvents End Sub Private Function IsLoaded(strName As String, _ Optional lngType As AcObjectType = acForm) IsLoaded = (SysCmd(acSysCmdGetObjectState, lngType, strName) <> 0) End Function |
|
MoveLayout、NextRecord,PrintSectionプロパティの使い方: レポートのMoveLayout, NextRecord,PrintSectionプロパティを書き替えるることにより、レポートに印字される内容と印字位置を自由に制御することができます。 表5-3-2 MoveLayout,NextRecord,PrintSectionプロパティの使い方
|