連続印刷の範囲指定に、アクティブセルを利用した方法を採用します。
さらに、単独印刷のVBAコードからの展開や、連続印刷の途中停止機能を付加しておきます。
こんにちは、じゅんぱ店長(@junpa33)です。
大量の宛名印刷を行う場合は、連続印刷を行えるようにする必要があります。
市販の年賀状印刷ソフトでも、あるあるですが、「住所変更の修正をしないまま連続印刷をスタートしてしまった。」とか。
100%の確率で封筒やはがきが無駄になりました。
今回のコード設計では、その100%を60%ぐらいに下げられないかとやってみます。
その前に、先回の記事を確認されたいという場合は、こちら↓になります。
単独印刷のマルチページ。16種類に対応したテンプレ作成封筒宛名印刷の記事編成
- 封筒宛名印刷の使い方とダウンロード
コンテンツ
連続印刷で出来ることのプラン
今回作成する「連続印刷」ページはこのようになります。
- 設置しているマルチページに「連続印刷」ページを設置します。
- 「連続印刷」ページに必要なコントロールを配置します。
- ユーザーフォームモジュールにコントロールのコードを記述します。
- ボタンから呼び出されるプロシージャーをModule4に記述します。
印刷の範囲指定を簡単に設定できるようにする。簡単に範囲を修正・変更できるようにすることです。
- 印刷の始点終点の指定方法はアクティブセルのRangeオブジェクトを利用する。
- 昇順・降順を考えたコード組み立てを行う。
- 印刷のためのコードは、単独印刷での「単独印刷」プロシージャーを利用します。
- 連続印刷とは言うものの、「何かの場合のための」途中停止できる機能を付けておく。
封筒宛名ユーザーフォームへ連続印刷ページを設置
青矢印と赤矢印が配置したコントロールです。
その他の文字はラベルで作成してください。
コントロールの配置
ラベルとコマンドボタンを設置していきます。
②ラベル「アクティブプリンター」 | ③ラベル「宛名始点A」 | ⑥ラベル「宛名終点A」 |
オブジェクト名 「アクティブプリンター」 Caption 「(空白)」 | オブジェクト名 「宛名始点A」 Caption 「(空白)」 | オブジェクト名 「宛名終点A」 Caption 「(空白)」 |
⑩-1ラベル「印刷範囲1」 | ⑩-2ラベル「印刷範囲2」 |
オブジェクト名 「印刷範囲1」 Caption 「(空白)」 | オブジェクト名 「印刷範囲2」 Caption 「(空白)」 |
①コマンドボタン「宛名リスト表示」 | ④コマンドボタン「始点入力」 | ⑤コマンドボタン「始点クリア」 |
オブジェクト名 「宛名リスト表示」 Caption 「宛名リスト表示」 | オブジェクト名 「始点入力」 Caption 「始点入力」 | オブジェクト名 「始点クリア」 Caption 「クリア」 |
⑦コマンドボタン「終点入力」 | ⑧コマンドボタン「終点クリア」 | ⑨コマンドボタン「印刷範囲確認」 |
オブジェクト名 「終点入力」 Caption 「終点入力」 | オブジェクト名 「終点クリア」 Caption 「クリア」 | オブジェクト名 「印刷範囲確認」 Caption 「印刷範囲プレビュー」 |
⑪コマンドボタン「連続印刷」 |
オブジェクト名 「連続印刷」 Caption 「印刷開始」 |
フォームモジュールへVBAコードを記述
接続しているプリンター名を表示するようにします。
Private Sub アクティブプリンター_Click()
宛名印刷設定.アクティブプリンター.Caption = _
Application.ActivePrinter
End Sub
印刷の範囲を指定するために表示させます。
Private Sub 宛名リスト表示_Click()
Worksheets("宛名リスト").Select
End Sub
Module4の「宛名始点選択」モジュールを呼び出します。
部品化プロシージャーでCallステートメントは必須Private Sub 始点入力_Click()
Call Module4.宛名始点選択
End Sub
Private Sub 始点クリア_Click()
宛名印刷設定.宛名始点A.Caption = ""
宛名印刷設定.宛名始点A.BackColor = &H8000000F
shiR = 0
End Sub
Module4の「宛名終点選択」モジュールを呼び出します。
Private Sub 終点入力_Click()
Call Module4.宛名終点選択
End Sub
Private Sub 終点クリア_Click()
宛名印刷設定.宛名終点A.Caption = ""
宛名印刷設定.宛名終点A.BackColor = &H8000000F
shuR = 0
End Sub
ラベル「宛名始点A」、「宛名終点A」、「印刷範囲1」、「印刷範囲2」のCaptionを操作します。
Module4の「連続印刷PV」モジュールを呼び出します。
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の「連続印刷開始」モジュールを呼び出します。
Private Sub 連続印刷_Click()
Call Module4.連続印刷開始
End Sub
コントロール関連のVBAコードをModule4へ記述
モジュール内で共通の変数の宣言を先頭に記述します。
Option Explicit
Public STY As Variant
Public shiR, shuR As Long
Dim SOrder, EXT As Long
「宛名始点選択」プロシージャー
アクティブになっているセルの行番号を取得します。
この行番号を始点として設定します。
Sub 宛名始点選択()
Worksheets("宛名リスト").Select
宛名印刷設定.宛名始点A.Caption = Range("B" & ActiveCell.Row)
宛名印刷設定.宛名始点A.BackColor = &HFFFFC0
shiR = ActiveCell.Row
End Sub
「宛名終点選択」プロシージャー
アクティブになっているセルの行番号を取得します。
この行番号を終点として設定します。
Sub 宛名終点選択()
Worksheets("宛名リスト").Select
宛名印刷設定.宛名終点A.Caption = Range("B" & ActiveCell.Row)
宛名印刷設定.宛名終点A.BackColor = &HFFFFC0
shuR = ActiveCell.Row
End Sub
「連続印刷PV」プロシージャー
連続印刷は、印刷部分のコードをModule1の単独印刷モジュールの呼び出しで行います。
変数「shiR」と変数「shuR」を比較することで、
リストの昇順と降順の両方に対応させています。
昇順の場合と降順の場合では印刷の順番が逆になりますが、宛先1つ1つについての実行コードは同じです。
なので、今回は部品プロシージャーとして、「連続印刷PVコア」プロシージャーを作成しています。
連続印刷を選択時のプレビュー画面は、シンプルにコード設計すると連続印刷範囲のすべての宛名について実行されることになります。
なので、
ユーザーからのアクセスで、スキップや途中終了などが出来るようにする必要があります。
ここでは、メッセージボックスで操作の選択が出来るようにしています。
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
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件印刷ごとにメッセージボックスを表示させて途中中止できるステップを設定しておきます。(これでは連続印刷にはなりませんが・・・)
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
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
封筒宛名印刷の「連続印刷機能」のまとめ
連続印刷とは、単独印刷を連続して行うことという考え方で、
実際にコード組み立ての中でModule1の「単独印刷」プロシージャーを呼び出して利用することにしました。
この連続印刷のコード組み立ての中で、今回の注目コードの1つは「印刷の範囲設定」の部分になります。
普通なら範囲指定には、「テキストボックス」かまたは「InputBox」を使いたくなるところです。
が、今回は敢えて簡便に住所録「宛名リスト」で直接セル指定で「開始位置」と「終了位置」を指定できるようにしました。
その分、指定するための入力作業やその処理コードも要らなくなり、効果もメリットも大きかったと思います。
もう1つは、連続のプレビューと印刷での途中停止や終了を行なえるようにする設計です。
” あっ!ボタン押しちゃった ” による失望感を和らげるためにも「エスケイプ」機能を設置しておきましょう。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。