ラベル印刷を用紙の途中から開始する

 宛名ラベルの印刷開始位置をずらし、用紙の途中から印刷する方法についてです。
 一度使ったラベルの残りを無駄なく使いたいというときに有用ですが、残りのラベルが少ない用紙を使うと用紙が傾いたり詰まったりするのでご注意ください;-o-)

f:id:accs2014:20180811130532p:plain:right:w550

 これが通常の印刷プレビューです。
 ラベルはレコードの順番に左上→右上→左下→右下という順番で印刷されます。
 このレポートを開いたときにインプットボックスで数字を入力させ、例えば「5」と入力されたときには1番のラベルを5番の位置に、2番のラベルを6番の位置に…と印刷させるように設定してみます。
 なお、画像には1,2,3…という値が表示されていますが、そのような値を持つフィールドが必要というわけではありません。レコードソースはどのようなテーブル(クエリ)でも大丈夫です。


f:id:accs2014:20180814233813p:plain:right:w550

 早速レポートモジュールに次のように記します。
 コントロール名や設定に依存するところがないのでそのままコピペで使えるかと思います。



Option Compare Database

Dim s_position As Integer

Private Sub Report_Open(Cancel As Integer)

'開始位置入力 全角OK 漢字等は0になるが結果的に最初の位置から印刷
s_position = Val(StrConv(InputBox("印刷開始位置を入力してください(1~)", , 1), vbNarrow))

End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

    '最初のレコードのときに開始位置を移動
    If Me.CurrentRecord = 1 And FormatCount < s_position Then
        Me.PrintSection = False
        Me.NextRecord = False
    Else
        Me.PrintSection = True
        Me.NextRecord = True
    End If

End Sub

 補足ですが最初のレコードを印刷するにあたり指定された回数だけ開始位置のスキップを繰り返しています。このときカウンタとなる変数を使わずFormatCount引数を用いて指定された回数と比較しています。

f:id:accs2014:20180811130526p:plain:right:w450

 レポートを印刷プレビューで開くとインプットボックスに既定値1が入った状態で表示されます。


f:id:accs2014:20180811130523p:plain:right:w450

 これを5に書き換えてOKすると…


f:id:accs2014:20180811130520p:plain:right:w550

 5番の位置から印刷が開始されました。
 ちなみに用紙1枚に印刷可能なラベル数より大きい数を指定した場合、2ページ目の最初の位置(1番に当たる位置)から印刷が開始されます。気になるかもしれませんがこれはこれで妥当な気がしたので変えませんでした。