連続印刷機能のコード設計。印刷範囲設定や途中終了と停止

fuutorenzokueyecatch

連続印刷の範囲指定に、アクティブセルを利用した方法を採用します。
さらに、単独印刷のVBAコードからの展開や、連続印刷の途中停止機能を付加しておきます。

こんにちは、じゅんぱ店長(@junpa33)です。

大量の宛名印刷を行う場合は、連続印刷を行えるようにする必要があります。

市販の年賀状印刷ソフトでも、あるあるですが、「住所変更の修正をしないまま連続印刷をスタートしてしまった。」とか。

100%の確率で封筒やはがきが無駄になりました。

今回のコード設計では、その100%を60%ぐらいに下げられないかとやってみます。

その前に、先回の記事を確認されたいという場合は、こちら↓になります。

fuutotandokueyecatch 単独印刷のマルチページ。16種類に対応したテンプレ作成

連続印刷で出来ることのプラン

renzokuinsatup015

今回作成する「連続印刷」ページはこのようになります。

renzokuinsatu001
  • 設置しているマルチページに「連続印刷」ページを設置します。
  • 「連続印刷」ページに必要なコントロールを配置します。
  • ユーザーフォームモジュールにコントロールのコードを記述します。
  • ボタンから呼び出されるプロシージャーをModule4に記述します。
今回のテーマのコード作成のポイント

印刷の範囲指定を簡単に設定できるようにする。簡単に範囲を修正・変更できるようにすることです。

  1. 印刷の始点終点の指定方法はアクティブセルのRangeオブジェクトを利用する。
  2. 昇順・降順を考えたコード組み立てを行う。
  3. 印刷のためのコードは、単独印刷での「単独印刷」プロシージャーを利用します。
  4. 連続印刷とは言うものの、「何かの場合のための」途中停止できる機能を付けておく。

封筒宛名ユーザーフォームへ連続印刷ページを設置

renzokuinsatup016

青矢印と赤矢印が配置したコントロールです。

その他の文字はラベルで作成してください。

renzokuinsatu002

コントロールの配置

ラベルとコマンドボタンを設置していきます。

ラベルの配置

②ラベル「アクティブプリンター」
renzokuinsatu003
③ラベル「宛名始点A」
renzokuinsatu004
⑥ラベル「宛名終点A」
renzokuinsatu005
オブジェクト名 「アクティブプリンター」
Caption 「(空白)」
オブジェクト名 「宛名始点A」
Caption 「(空白)」
オブジェクト名 「宛名終点A」
Caption 「(空白)」
⑩-1ラベル「印刷範囲1」
renzokuinsatu006
⑩-2ラベル「印刷範囲2」
renzokuinsatu007
オブジェクト名 「印刷範囲1」
Caption 「(空白)」
オブジェクト名 「印刷範囲2」
Caption 「(空白)」

コマンドボタンの配置

①コマンドボタン「宛名リスト表示」
renzokuinsatu008
④コマンドボタン「始点入力」
renzokuinsatu009
⑤コマンドボタン「始点クリア」
renzokuinsatu010
オブジェクト名 「宛名リスト表示」
Caption 「宛名リスト表示」
オブジェクト名 「始点入力」
Caption 「始点入力」
オブジェクト名 「始点クリア」
Caption 「クリア」
⑦コマンドボタン「終点入力」
renzokuinsatu011
⑧コマンドボタン「終点クリア」
renzokuinsatu012
⑨コマンドボタン「印刷範囲確認」
renzokuinsatu013
オブジェクト名 「終点入力」
Caption 「終点入力」
オブジェクト名 「終点クリア」
Caption 「クリア」
オブジェクト名 「印刷範囲確認」
Caption 「印刷範囲プレビュー」
⑪コマンドボタン「連続印刷」
renzokuinsatu014
オブジェクト名 「連続印刷」
Caption 「印刷開始」

フォームモジュールへVBAコードを記述

オブジェクト名 「アクティブプリンター」

接続しているプリンター名を表示するようにします。

VBA
Private Sub アクティブプリンター_Click()
        宛名印刷設定.アクティブプリンター.Caption = _
                    Application.ActivePrinter
End Sub

オブジェクト名 「宛名リスト表示」

印刷の範囲を指定するために表示させます。

VBA
Private Sub 宛名リスト表示_Click()
        Worksheets("宛名リスト").Select
End Sub

オブジェクト名 「始点入力」

Module4の「宛名始点選択」モジュールを呼び出します。

vbacalleyecatch 部品化プロシージャーでCallステートメントは必須
VBA
Private Sub 始点入力_Click()
        Call Module4.宛名始点選択
End Sub

オブジェクト名 「始点クリア」

VBA
Private Sub 始点クリア_Click()
        宛名印刷設定.宛名始点A.Caption = ""
        宛名印刷設定.宛名始点A.BackColor = &H8000000F
        shiR = 0
End Sub

オブジェクト名 「終点入力」

Module4の「宛名終点選択」モジュールを呼び出します。

VBA
Private Sub 終点入力_Click()
        Call Module4.宛名終点選択
End Sub

オブジェクト名 「終点クリア」

VBA
Private Sub 終点クリア_Click()
        宛名印刷設定.宛名終点A.Caption = ""
        宛名印刷設定.宛名終点A.BackColor = &H8000000F
        shuR = 0
End Sub

オブジェクト名 「印刷範囲確認」

ラベル「宛名始点A」、「宛名終点A」、「印刷範囲1」、「印刷範囲2」のCaptionを操作します。

Module4の「連続印刷PV」モジュールを呼び出します。

VBA
Private Sub 印刷範囲確認_Click()
        Worksheets("宛先").Select
        If 宛名印刷設定.宛名始点A.Caption = "" Then
           MsgBox "宛名始点が指定されていません。", vbOKOnly, _
                    "メッセージ"
           宛名印刷設定.印刷範囲1.Caption = ""
           Exit Sub
        End If
        If 宛名印刷設定.宛名終点A.Caption = "" Then
           MsgBox "宛名終点が指定されていません。", vbOKOnly, _
                    "メッセージ"
           宛名印刷設定.印刷範囲1.Caption = ""
           Exit Sub
        End If
        宛名印刷設定.印刷範囲1.Caption = "「" & 宛名印刷設定 _
            .宛名始点A.Caption & "」から「" & 宛名印刷設定 _
            .宛名終点A.Caption & "」まで"
        宛名印刷設定.印刷範囲2.Caption = Abs(shuR - shiR) + 1 _
            & "件分を印刷します。"
        Call Module4.連続印刷PV
End Sub

オブジェクト名 「連続印刷」

Module4の「連続印刷開始」モジュールを呼び出します。

VBA
Private Sub 連続印刷_Click()
        Call Module4.連続印刷開始
End Sub

コントロール関連のVBAコードをModule4へ記述

renzokuinsatup017

モジュール内で共通の変数の宣言を先頭に記述します。

VBA
Option Explicit
    
    Public STY As Variant
    Public shiR, shuR As Long
    Dim SOrder, EXT As Long

「宛名始点選択」プロシージャー

アクティブになっているセルの行番号を取得します。

この行番号を始点として設定します。

VBA
Sub 宛名始点選択()
        Worksheets("宛名リスト").Select
        宛名印刷設定.宛名始点A.Caption = Range("B" & ActiveCell.Row)
        宛名印刷設定.宛名始点A.BackColor = &HFFFFC0
        shiR = ActiveCell.Row
End Sub

「宛名終点選択」プロシージャー

アクティブになっているセルの行番号を取得します。

この行番号を終点として設定します。

VBA
Sub 宛名終点選択()
        Worksheets("宛名リスト").Select
        宛名印刷設定.宛名終点A.Caption = Range("B" & ActiveCell.Row)
        宛名印刷設定.宛名終点A.BackColor = &HFFFFC0
        shuR = ActiveCell.Row
End Sub

「連続印刷PV」プロシージャー

連続印刷は、印刷部分のコードをModule1の単独印刷モジュールの呼び出しで行います。

変数「shiR」と変数「shuR」を比較することで、

リストの昇順と降順の両方に対応させています。

昇順の場合と降順の場合では印刷の順番が逆になりますが、宛先1つ1つについての実行コードは同じです。

なので、今回は部品プロシージャーとして、「連続印刷PVコア」プロシージャーを作成しています。

連続印刷を選択時のプレビュー画面は、シンプルにコード設計すると連続印刷範囲のすべての宛名について実行されることになります。

なので、

ユーザーからのアクセスで、スキップや途中終了などが出来るようにする必要があります。

ここでは、メッセージボックスで操作の選択が出来るようにしています。

VBA
Sub 連続印刷PV()
        STY = 宛名印刷設定.TP_no.Caption
            If STY = "" Then
                MsgBox "封筒サイズが指定されていません。" _
                    , vbOKOnly, "封筒宛名印刷"
                Exit Sub
            End If
        EXT = 0
        If shuR >= shiR Then
            For SOrder = shiR To shuR
                Call Module4.連続印刷PVコア
                If EXT = 1 Then Exit Sub
            Next SOrder
        ElseIf shuR < shiR Then
            For SOrder = shiR To shuR Step -1
                Call Module4.連続印刷PVコア
                If EXT = 1 Then Exit Sub
            Next SOrder
        End If
End Sub
VBA
Sub 連続印刷PVコア()
    Dim ans As Integer
        Worksheets("宛名リスト").Select
        Cells(SOrder, 2).Select
        Call Module1.単独印刷
        Call Module1.発送便記入
        ans = MsgBox("プレビュー画面に切替えしますか?" & vbCrLf & _
            "「はい」は実行" & vbCrLf & "「いいえ」はスキップ" _
            & vbCrLf & "「キャンセル」は終了" & vbCrLf & " " _
            & vbCrLf & "プレビュー画面の「プレビューを閉じるボタン」" _
            & "で次に移ります。", vbYesNoCancel + vbQuestion, "封筒宛名印刷")
        If ans = vbYes Then
            Worksheets("宛先").PrintPreview
        ElseIf ans = vbNo Then
            MsgBox "スキップします。", vbInformation, "封筒宛名印刷"
            Exit Sub
        Else
            MsgBox "終了します。", vbInformation, "封筒宛名印刷"
            EXT = 1
            Exit Sub
        End If
End Sub

「連続印刷開始」プロシージャー

印刷プレビューで確認した内容を連続印刷して行きます。

印刷順の昇順・降順は印刷プレビュー同様です。

ここでも、部品プロシージャーとして「連続印刷開始コア」プロシージャーを作成します。

「Worksheets(“宛先”).PrintOut」の記述で印刷出力命令を出しています。

連続印刷を実行すると、当たり前には、すべての印刷が終了するまで停止することはありません。

とは言うものの、何かの事情で途中で中止したいことも良くあります。

なので、1件印刷ごとにメッセージボックスを表示させて途中中止できるステップを設定しておきます。(これでは連続印刷にはなりませんが・・・)

VBA
Sub 連続印刷開始()
        Worksheets("宛名リスト").Select
        STY = 宛名印刷設定.TP_no.Caption
        EXT = 0
        If STY = "" Then
            MsgBox "封筒サイズが指定されていません。", _
                vbOKOnly, "封筒宛名印刷"
            Exit Sub
        End If
        If shuR >= shiR Then
            For SOrderp = shiR To shuR
                Call Module4.連続印刷開始コア
                If EXT = 1 Then Exit Sub
            Next SOrderp
        ElseIf shuR < shiR Then
            For SOrderp = shiR To shuR Step -1
            Call Module4.連続印刷開始コア
            If EXT = 1 Then Exit Sub
        Next SOrderp
    End If
End Sub
VBA
Sub 連続印刷開始コア()
    Dim ans As Integer
        If EXT = 2 Then GoTo step1
        ans = MsgBox("印刷を開始してよろしいですか?" & vbCrLf & _
            "「はい」は実行。途中停止は出来ません。" & vbCrLf & _
            "「いいえ」は印刷を実行しません。" & vbCrLf & _
            "「キャンセル」はこのメッセージを以降表示しません。" _
            , vbYesNoCancel + vbQuestion, "封筒宛名印刷")
        If ans = vbNo Then
            MsgBox "印刷を中止します。", vbInformation, "封筒宛名印刷"
            EXT = 1
            Exit Sub
        ElseIf ans = vbCancel Then
            EXT = 2
        End If
step1:
        Worksheets("宛名リスト").Select
        Cells(SOrderp, 2).Select
        Call Module1.単独印刷
        Call Module1.発送便記入
        Worksheets("宛先").PrintOut
End Sub

封筒宛名印刷の「連続印刷機能」のまとめ

renzokuinsatup018

連続印刷とは、単独印刷を連続して行うことという考え方で、

実際にコード組み立ての中でModule1の「単独印刷」プロシージャーを呼び出して利用することにしました。

この連続印刷のコード組み立ての中で、今回の注目コードの1つは「印刷の範囲設定」の部分になります。

普通なら範囲指定には、「テキストボックス」かまたは「InputBox」を使いたくなるところです。

が、今回は敢えて簡便に住所録「宛名リスト」で直接セル指定で「開始位置」と「終了位置」を指定できるようにしました。

その分、指定するための入力作業やその処理コードも要らなくなり、効果もメリットも大きかったと思います。

もう1つは、連続のプレビューと印刷での途中停止や終了を行なえるようにする設計です。

” あっ!ボタン押しちゃった ” による失望感を和らげるためにも「エスケイプ」機能を設置しておきましょう。

メモ

ユーザーフォームを表示させるときの「Showメソッド」について、引数として「vbModeless」を付けています。

この引数を付けることで、ユーザーフォームを表示しながら、その都度のワークシート上のデータを指定することが出来るようになります。(アクティブセルとして指定することが出来ます。)

非常に重要なコードです。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。