Access

Accessでラベル印刷する際、ラベルの印刷開始位置を指定する方法

ACCESS途中印刷
記事内に商品プロモーションを含む場合があります

今日はよくある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にします。

これで開始位置より後から印刷を開始するようになります。

以上です。コピペで簡単にできると思いますのでやってみてくださいね。

ABOUT ME
アズビーパートナーズ
プログラマー→社内SE→SIerのお仕事をしています。 メーカー勤務を経て、中小企業の社内SE、フリーランスなど様々な形態で働いてきました。 業務上生まれた困った…を解決してきたTipsを備忘録も兼ねて公開しています。 困っている誰かのお役に立てれば幸いです。