同じラベルを2枚ずつとか5枚ずつといったように印刷する方法についてです。
すべて同じ枚数ずつでよい場合と、レコードごとに記録された値があってその枚数ずつ印刷させる場合が考えられますので、それぞれについて例を示します。
印刷プレビュー時に枚数を入力させる方法
プレビューの時にインプットボックスを使って何枚ずつ印刷させるか入力させる方法です。
サンプルとなるテーブルはこのようなものです。
ラベルとなるレポートのデザインビューです。上記のテーブルをレコードソースとし、表示させようとするフィールドをテキストボックスとして置いていきます。
なおラベルは1ページにつき18枚ずつ(横3×縦6。順序は左上→右上→左下→右下)出力されるようにしています。
そしてレポートモジュールに次のように記します。
Option Compare Database '枚数、ループ Dim num_of_labels As Integer, i As Integer Private Sub Report_Open(Cancel As Integer) '全角OK 漢字等は0になるが結果的に1枚ずつ印刷 num_of_labels = Val(StrConv(InputBox("各ラベルを何枚ずつ印刷するか入力してください(1~)", , 1), vbNarrow)) i = 1 End Sub Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) '指定枚数に応じて出力を繰り返す If i < num_of_labels Then Me.NextRecord = False i = i + 1 Else i = 1 End If End Sub
枚数のカウントとしてはFormatCountを使うことも考えられますがページ末で正しくない結果になります(Formatののち結局表示されず次のページに送られるセクションが発生するため)ので変数を宣言して用いています。
イベントがFormatではなくPrintなのもその関係です。
設定は以上で完了です。
印刷プレビューで開くとインプットボックスが現れますので、ここで「4」と入力してOKすると…
確かに4枚ずつ表示されているのがわかります。
テーブル(クエリ)の各レコードに記録された枚数ずつ印刷する方法
こちらはテーブル(クエリ)のレコードごとに印刷させようとする枚数を記録しておき、その枚数ずつ印刷する方法です。
サンプルとなるテーブルはこのようなものです。「印刷枚数」列に数値が記録されていますので、この枚数ずつ印刷するものとします。
デザインビューです。
印刷枚数をコントロールソースとするテキストボックスを置きます。フィールドが見つからないというエラーの対策であって表示させる必要はありませんので、「可視」プロパティは「いいえ」とします。
あとはレポートモジュールに次のように記せば設定完了です。
Option Compare Database 'ループ Dim i As Integer Private Sub Report_Open(Cancel As Integer) i = 1 End Sub Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) '値に応じて出力を繰り返す If i < Me.印刷枚数 Then Me.NextRecord = False i = i + 1 Else i = 1 End If End Sub
印刷プレビューです。
上記テーブルに記録された印刷枚数の値ずつ印刷されているのがわかります。
備考
なお、前者のようにすべてのラベルを同じ枚数ずつ印刷させる方法としては、ダミーのテーブルを作って元のテーブルとの2つのテーブルに基づくクエリ(結合させない)を作るという方法もあります(同じレコードが複数できるのでその数だけ印刷される)。やり方としてはそちらの方が簡単ですが、そのためだけにテーブルを作らなければならないのと、枚数指定の方法がわかりにくいのが弱点です。