単一の Access レコードに対して 1 つ以上のラベルを印刷する方法 - TechRepublic

単一の Access レコードに対して 1 つ以上のラベルを印刷する方法 - TechRepublic

テーブルまたはクエリ内の各レコードにラベルを1つだけ印刷する必要がある場合、ラベルの印刷は簡単です。ウィザードがすべての作業を実行します。しかし、1つまたは複数のレコードに複数のラベルを印刷する必要がある場合、ウィザードは不十分です。このような印刷タスクには、いくつかの追加オブジェクトとVisual Basic for Applications (VBA) コードが必要です。この記事では、1つのレコードに1つまたは複数のラベルを印刷する方法を説明します。来月は、1つまたは複数のレコードに1つまたは複数のラベルを印刷する方法を説明します。

Windows 10 64ビットシステムでAccess 2016を使用していますが、オブジェクトとコードは2003までの以前のバージョンでも動作します。ご参考までに、サンプルの.accdbファイルまたは.mdbファイルをダウンロードできます。このデータベースは、Access Web AppsまたはAccess Web Servicesには適していません。この記事では、テーブルの作成方法とウィザードを使用したフォームとレポートの作成方法を理解していることを前提としています。

一言で言えば

まず、ラベルレポートで使用するデータを格納するテーブルから始めましょう。今回は、NorthwindのCustomersテーブルを使用します(お好きなテーブルをご使用いただけます)。このテーブルを基に、レコードを選択して必要なラベル数を指定できる簡単なフォームを作成します。例えば、このフォームを使用して、顧客Around the Hornに5枚のラベルを印刷したり、顧客Familia Arquibaldoに15枚のラベルを印刷したりできます。

ラベル情報を格納するテーブルをコピーして一時テーブルを作成し、それを基にラベルレポートを作成します。レポートには元のテーブルのすべてのレコードは必要ありません。印刷したいレコードのみが必要です。最後に、処理を実行するVBAプロシージャが必要です。

一時テーブルを作成する

一時テーブルはCustomers(Northwindのテーブル)に基づいています。ラベルに必要な共通フィールドは共有しますが、データは共有しません。後ほど追加するVBAコードで、ラベル実行で使用されるレコードを追加します。一時テーブルを手動で作成するか、Customersテーブルを以下の手順でコピーしてください。

  1. ナビゲーション ウィンドウで [顧客] を右クリックし、[コピー] を選択します。
  2. ナビゲーション ウィンドウで右クリックし、[貼り付け] を選択します。
  3. 名前に「一時顧客」と入力します。
  4. 「構造のみ」オプションを選択します(図 A)。
  5. [OK]をクリックします。

図A

ラベル データを含むテーブルに基づいて一時テーブルを作成します。

「Customers」テーブルをコピーした場合は、コピーをデザインビューで開き、主キーを削除してください。また、必須フィールドがなく、インデックスが設定されているフィールドがないことを確認してください。このコードによってレコードが重複し、これらのテーブルプロパティによってエラーが発生します。一時テーブルにラベルレポートに不要なフィールドが含まれていても心配ありません。必要に応じて削除できますが、問題はありません。

ラベルレポートを作成する

次に、ラベルレポートウィザードを使用して、一時テーブル「Temporary Customers」のレポートを生成します。CustomerID、CompanyName、Address、City、Region、PostalCode、Countryの各フィールドを追加します。レポートに「Customer Label Report」という名前を付けます(図B)。Access 2016では、ウィザードは「作成」タブの「レポート」グループにあります。Access 2003では、レポートウィザードを使用します。

図B

一時テーブルに基づいてラベル レポートを作成します。

フォームを作成する

フォームウィザードを使用して、Customersテーブル(一時テーブルではありません)に基づいたシンプルなフォームを作成します。フォームにはCustomersテーブルのすべてのレコードが表示されるので、そこから選択できます。不要なフィールドを削除してもしなくても、コードはラベルレポートに含めるフィールドのみを参照します。タスクに合わせてフォームをカスタマイズするには、テキストボックス、コマンドボタン、そして以下のコードを追加します。

  1. フォームをデザイン ビューで開きます。
  2. フォーム ヘッダー セクションにテキスト ボックス コントロールを追加し、txtNumberofLabels という名前を付けます。
  3. キャプションテキスト「ラベルの数」を入力します。
  4. コマンド ボタンを追加します。名前を「cmdPrintLabels」にして、キャプションに「Print Multiple Labels」と入力します。
  5. ボタンを選択した状態で、プロパティ シートの [イベント] タブをクリックします。
  6. [クリック時] のドロップダウン リストから [イベント プロシージャ] を選択し (図 C )、[ビルダー] ボタンをクリックしてフォームのモジュールを開きます。
  7. リストAのコードを入力してください。ウェブページからコピー&ペーストしないでください。ダウンロード可能なデータベースファイルからコピーするか、ダウンロードに含まれる.clsモジュールをインポートしてください。独自のデータを扱う場合は、フィールド名とテーブル名を適宜更新してください。

図C

ボタンの Click イベントのサブ プロシージャを入力します。

リストA

Private Sub cmdPrintMultipleLabels_Click()

'Print multiple labels for current record.

Dim i As Integer

Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset

'Delete previous label data.

DoCmd.SetWarnings False

DoCmd.RunSQL "DELETE FROM [Temporary Customers]"

DoCmd.SetWarnings True

On Error GoTo errHandler

'Catch blank control.

'If set to 0, label report is blank but runs.

If IsNull(Me!txtNumberOfLabels) Then

MsgBox "Please indicate the number of labels you want to print", _

vbOKOnly, "Error"

DoCmd.GoToControl "txtNumberOfLabels"

Exit Sub

End If

rst.Open "[Temporary Customers]", CurrentProject.Connection, adOpenDynamic, _ adLockPessimistic

'Adds duplicate records for selected company using input value.

For i = 1 To Me!txtNumberOfLabels.Value

With rst

.AddNew

!CustomerID = Me.CustomerID

!CompanyName = Me.CompanyName

!Address = Me.Address

!City = Me.City

!Region = Me.Region

!PostalCode = Me.PostalCode

!Country = Me.Country

.Update

End With

Next i

'Opens report.

DoCmd.OpenReport "Customer Label Report", acViewPreview

rst.Close

Set rst = Nothing

Exit Sub

'Error handling routine.

errHandler:

MsgBox Err.Number & ": " & Err.Description, vbOKOnly, "Error"

DoCmd.SetWarnings True

rst.Close

Set rst = Nothing

End Sub

ラベルレポートを実行する

データベースに戻り、フォームビューでフォームを開いて、カスタムラベルレポートを生成します。先ほど、組み込みフィルターを使って会社を選択すると言いました。この処理は自動化することもできますが、例を簡略化するために、次のようにします。

  1. [並べ替えとフィルター] グループで、[詳細設定] ドロップダウンから[フォームでフィルター] (図 D ) を選択します。
  2. 「CustomerID」ドロップダウンから、BERGSなどの顧客を選択します(図E)。CustomerIDコントロールに表示されている値と異なる値が表示されても心配ありません。この機能は最後に使用したフィルターを記憶しています。
  3. [並べ替えとフィルター] グループの [フィルターの切り替え] をクリックすると、選択した顧客のデータがフォームに入力されます。
  4. 印刷するラベルの数(たとえば 5)を [ラベル数] テキスト ボックスに入力します (図 F )。
  5. [複数のラベルを印刷] ボタンをクリックすると、図 Gに示すラベル レポートが生成されます。

図D

顧客を選択するには、「フォームでフィルター」オプションを使用します。

図E

顧客を選択してください。

図F

印刷するラベルの数を入力します。

図G

ラベル レポートでは、Berglunds snabbköp の 5 つのラベルが印刷されます。

コードの仕組み

幸いなことに、処理を実行するコードはシンプルです。まず、SQL DELETE 文で一時テーブル(前回のセッションから)の既存レコードをすべて削除します。この文を省略すれば、複数の顧客データを使ったカスタムレポートを作成できますが、次の印刷タスクのために、ある時点でテーブルをクリアする必要があります。

If ステートメントは、txtNumberofLabels テキストボックスに値があるかどうかを確認します。コントロールが空白の場合、コードは警告メッセージを表示し、コントロールを選択して終了します。コントロールに 0 が含まれている場合、コードは空白のレポートを表示します。この動作は、既存の If ステートメントの条件に 2 つ目の If ステートメントを追加するか、OR ステートメントを追加することで省略できます。

Temporary Customersテーブルに基づくRecordsetオブジェクトを開いた後、ForループはtxtNumberofLabelsの値を使用して各ラベルにレコードを追加します。例えば、値5を入力すると、Forループは5つのレコードを追加します。

この時点で、Temporary Customers テーブルには各ラベルのレコードが含まれています。レポートを開くと、適切なラベルレポートが生成されます。エラー処理ルーチンは汎用的なものなので、ニーズに合わせてもう少しカスタマイズする必要があるかもしれません。

複数のラベルを印刷する

1つのレコードに1つ以上のラベルを印刷するこのシンプルなテクニックは、ほぼすべてのデータベースに追加できます。来月は、複数のレコードに1つ以上のラベルを印刷する方法を取り上げます。

Officeに関するご質問をお送りください

読者からの質問には可能な限りお答えしますが、必ずお答えできるとは限りません。ご連絡の際は、できるだけ具体的にご記入ください。例えば、「ワークブックのトラブルシューティングをして、問題点を修正してください」といった質問ではおそらく回答が得られないでしょうが、「この数式が期待どおりの結果にならない理由を教えていただけますか?」といった質問であれば、回答が得られるかもしれません。ご使用のアプリとバージョンを明記してください。リクエストがない限り、ファイルは送信しないでください。添付ファイル付きの初回ヘルプリクエストは未読のまま削除されます。読者サポートにあたり、TechRepublicから時間や専門知識の報酬を受け取ることはありません。また、サポートした読者から料金を請求することもありません。お問い合わせは[email protected]までお願いいたします。

また読んでください…

  • Excelピボットテーブルを最大限に活用するための便利なヒント
  • IMAP アカウントの Outlook カテゴリを再利用する
  • Office Q&A: Word 文書内の複数のインデックスの操作
  • Wordの定型句の力を活用するための7つのヒント
Tagged: