今日はよくあるAccessのレポートを使ったラベル印刷です。
宛名シールだったりラベルだったりレポートで簡単に印刷できる訳ですが、このラベルシール、中途半端に余ったときの印刷方法にちょっと迷います。
何も知らないと上から印刷して、ひっくり返して今度は下から印刷・・・。
そして真ん中が残る・・・。ということになる場合があります。
今日はラベルシールの印刷開始位置を指定して印刷する手順をご紹介します。
印刷までの流れ
今回想定している印刷(プレビュー)までの流れはこんな感じです。
①印刷実行画面で印刷プレビューボタンクリック
今回私が作った画面は検索条件入力項目・検索ボタン・検索結果リスト表示エリアがあり、かつリスト内から必要な行を選択できるような作りにしています。(ご紹介は割愛します)
②印刷開始位置指定画面でラベルの開始位置を指定(フォーム名:F_CDラベル印刷開始位置)
③プレビューで正しく印刷開始位置が設定されているか確認してから印刷実行(レポート名:RptCDラベル印刷)
それぞれのフォームまたはレポートでちょっとだけコードを書きますので詳しくご紹介します。
印刷開始位置を指定して印刷プレビューするプログラム
前準備
各フォームやレポートで使う変数をPublic変数として事前に定義しておきます。
共通モジュールなどがあればそのモジュールに定義しておけば良いかと思います。
Public cdLabelStart As Integer
印刷実行画面のプログラム
①の印刷実行画面、印刷プレビューボタンのクリックイベントに以下のコードをコピペしてください。
‘———————————————————————
‘プレビューボタンクリック時
‘———————————————————————
Private Sub cmdプレビュー_Click()
‘印刷 ラベル表示
DoCmd.OpenForm “F_CDラベル印刷開始位置”, acNormal, , , acFormEdit, acDialog
DoCmd.OpenReport “RptCDラベル印刷”, acViewPreview
End Sub
②のフォームを呼び出した後、③のレポートを呼び出すプログラムです。
印刷開始位置指定画面でラベルの開始位置を指定
フォームのデザイン

オプショングループを作成し、ラベル印刷枚数分のラベル(トグルボタン)を用意します。
今回のラベルは4列11行のラベルシールです。
各ボタンの値は1~44までを定義します。
Accessのウィザード機能を利用してオプショングループの設定をしていると「20個までしか定義できない」エラーが表示されます。
ウィザードでは20個までしか定義できませんが、デザインビューでは追加作成できます。
オプショングループ内でトグルボタンをコピペして数を増やしましょう。
フォームのコード
Option Compare Database
Option Explicit
'---------------------------------------------------------------------
' プレビューボタンをクリックされたら選択値をセット
'---------------------------------------------------------------------
Private Sub プレビューボタン_Click()
cdLabelStart = 選択フレーム.VALUE
DoCmd.Close acForm, Me.Name
End Sub
'---------------------------------------------------------------------
' 閉じるときにも現在の選択値をセット
'---------------------------------------------------------------------
Private Sub Form_Close()
cdLabelStart = 選択フレーム.VALUE
End Sub
プレビューボタンを押された時は選択値をPublic変数にセットしてフォームを閉じます。
プレビューをクリックされなくてもフォームを閉じられたらPublic変数に現在の選択値をセットします。
とにかく、この画面はすぐに終了します。
レポート側のコード
Option Compare Database
Option Explicit
'変数宣言
Private intSkipNum As Integer
Private intSkip As Integer
'---------------------------------------------------------------------
' ヘッダーフォーマット時に印字をスキップする数を取得
'---------------------------------------------------------------------
Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
If cdLabelStart > 0 Then
intSkipNum = cdLabelStart - 1
Else
intSkipNum = 0
End If
intSkip = 0
End Sub
'---------------------------------------------------------------------
' 詳細フォーマット時、印字スキップ
'---------------------------------------------------------------------
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
'印字位置がスキップ位置より前ならレコードは移動せずレイアウトのみ移動する
If intSkip < intSkipNum Then
Me.MoveLayout = True
Me.NextRecord = False
Me.PrintSection = False
intSkip = intSkip + 1
End If
End Sub
レポート内ではまずヘッダーイベントで開始位置としてPublic変数に定義されている値を取得します。
詳細のフォーマット時に開始位置より前までのフォーマットはレイアウトをスキップ送りします。
その際レコードは移動しないようにMoveRecordはFalseにします。
これで開始位置より後から印刷を開始するようになります。
以上です。コピペで簡単にできると思いますのでやってみてくださいね。
コメント