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

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

 

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 メニューから印刷プレビューのアイコンをクリックします。宛名ラベルの部数と印字開始位置を入力するダイアログが表示されますので、部数に、印刷開始位置を選択してOKボタンをクリックします。図5-3-8のように1枚目のラベルがスキップされて2枚目のラベルから宛名が印字されます。また、宛名は2部印字されています。

 

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

 

5-3-8 宛名ラベル印刷のプレビュー

 

5 宛名ラベルの印刷が確認できたら、レポートをrptSkipLablesの名称で保存してAccess を終了します。

 

 

Sub Report_Open()イベント処理

このイベントは、レポートが開かれたいたときに実行されます。このイベントでは、宛名ラベルの部数と印字開始位置を入力するダイアログを表示させて、指定された位置から宛名ラベルを印刷します。フォームをダイアログとして開くには、DoCmd.OpenFormWindowModeの引数にacDialogを指定します。ダイアログとしてフォームを開いたとき、DoCmd.OpenFormステートメントは、ダイアログが閉じられるか、非可視状態になるまで待たされます。ダイアログからOKボタンをクリックしたときは、ダイアログが非可視状態になり、後続する  If IsLoaded(conFormName) Then Trueと判定されて部数と印字開始位置を取得します。尚、部数と印字開始位置は、ダイアログ独自のCopiesプロパティとLabelToSkipプロパティを参照して取得します。

 

    mintCopies = Forms(conFormName).Copies - 1

    mintToSkip = Forms(conFormName).LabelsToSkip

 

部数と印字開始位置を取得したら、DoCmd.Closeでダイアログを閉じます。

 

ダイアログからCancelボタンをクリックしたときは、ダイアログが既に閉じられた状態で、後続する  If IsLoaded(conFormName) Thenが実行されます。ダイアログは、既に閉じられていますからIsLoaded()関数からFalseが返されてElseが実行されます。

 

  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

 

 

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

 

 


 

Tip

MoveLayoutNextRecord,PrintSectionプロパティの使い方:

 

レポートのMoveLayout, NextRecord,PrintSectionプロパティを書き替えるることにより、レポートに印字される内容と印字位置を自由に制御することができます。

 

5-3-2 MoveLayout,NextRecord,PrintSectionプロパティの使い方

MoveLayout

NextRecord

PrintSection

結果

True

True

True

次の印字位置に移動、次のレコードに移動、レコードの印字(既定値)

True

True

False

次の印字位置に移動、次のレコードに移動、レコードの印字抑止

※空白を残してレコードをスキップするとき使用

True

False

True

次の印字位置に移動、レコードの移動抑止、レコードの印字

※同じレコードを複写するとき使用

True

False

False

次の印字位置に移動、レコードの移動抑止、レコードの印字抑止

※印字位置をスキップするとき使用

False

True

True

印字位置の移動抑止、次のレコードに移動、レコードの印字

※直前の印字内容に重ねて印字するとき使用

False

True

False

印字位置の移動抑止、次のレコードに移動、レコードの印字抑止

※空白無しでレコードをスキップするとき使用

False

False

True

この組み合わせは使用不可

False

False

False

この組み合わせは使用不可

 

 

 

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