今日はよくある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にします。
これで開始位置より後から印刷を開始するようになります。
以上です。コピペで簡単にできると思いますのでやってみてくださいね。