値を変更しながらの連続印刷マクロ印刷 2010.06.09 更新:2024.10.18
指定したセルに、数値を順番に自動設定し、まとめて連続印刷したいことはないでしょうか。
このページで紹介するのは、数値を順に変更しながら連続印刷するマクロです。
あるセルに出席番号を入力したら、その生徒データを表示するシートを作成したが、40人の出席番号を順に入力して、その都度印刷ボタンを押すのは面倒。そのような時に使用します。
[値を変更しながら連続PDF出力]はこちら
[値を変更しながら連続シート出力]はこちら
セルA1に出席番号を入力すると、データが自動変更されるシートイメージ
※マクロ実行前に「印刷範囲」や「プリンタ」の設定等を行っておいてください
サンプルファイル
●サンプルファイル ダウンロード INDEX関数を用いた名簿とマクロのサンプルです
ご要望が多くあるため、サンプルファイルに次のマクロも追加しました 2022.02.04
・開始番号・終了番号をインプットボックスで指定しての印刷
・名簿のデータ数にあわせた全印刷
Excelマクロ管理ツール
アクティブシートを連続印刷する
まずアクティブシートの任意のセルに数値を設定しながら、連続で印刷するサンプルコードの紹介です。
コードの貼り付け場所 VBAコードをカラーで印刷・Web掲載するためのツールはこちら
'---------------------------------------------------- ' アクティブシートをプリントアウトするマクロ1 '---------------------------------------------------- ' コード内の定数に開始番号や終了番号を設定します ' ' 作成日:2010.06.09 更新日:2024.03.01 '---------------------------------------------------- Sub printoutActivesheet_1() '------------------------------- ' 定数 '------------------------------- ' 予め定めておく値を設定 Const L_TARGET_CELL_ADDRESS As String = "A1" ' 値設定対象のセル Const L_STARTING_NUMBER As Long = 1 ' 開始番号 Const L_ENDING_NUMBER As Long = 40 ' 終了番号 Const L_STEP As Long = 1 ' 番号の増分値 ' 1の場合:番号は1ずつ増加する ' 2の場合:番号は2ずつ増加する '------------------------------- ' プリントアウト処理 '------------------------------- Dim i As Long ' 変数 i には開始番号から終了番号までの数値が順に設定される For i = L_STARTING_NUMBER To L_ENDING_NUMBER Step L_STEP ActiveSheet.Range(L_TARGET_CELL_ADDRESS).Value = i ' 値設定セルに変数 i の数値を設定する ActiveSheet.PrintOut ' アクティブシートをプリントアウトする Next End Sub
コードの前半に定数を設定する箇所があります。定数とは固定化されて変化しない値のことです。
このコードでは「値を設定するセル」「開始番号」「終了番号」「値の増分値」を、定数の設定によって変更するようにしています。
・「値設定対象のセル」 値を設定するセルのアドレスです。セルアドレスは文字列として指定します。【例】セルB3:"B3"
・「開始番号」 セルに設定する値の開始番号です。1~40番まで設定する場合の1番を指します。
・「終了番号」 セルに設定する値の終了番号です。1~40番まで設定する場合の40番を指します。
・「番号の増分値」 番号の増分値です。「1」の場合1ずつ番号が増えます。「2」にすると2ずつ番号が増えます。
定数の値は「=」の後に記述するため、値を変更したい場合は「=」の後の値を変更してください。
書籍紹介本を執筆しました
好評販売中!
「教師のExcel ~校務(個人業務+チーム業務)カイゼンのためのデジタルリテラシー~」
基本の学びなおしから校務をサポートするシステム作りまで(技術評論社)
教員みんなができる「チーム業務」のポイントを丁寧にわかりやすく解説しています。また「個人業務」を更に効率化するための学び直しと応用テクニックを解説しています。
この書籍の活用してもらうことで、先生方が児童・生徒に向き合う時間を、更に確保できることを願っています!
■ 詳細(技術評論社) ■ 内容紹介:note ■ 購入:amazon
開始番号と終了番号にセルの値を指定する
開始番号と終了番号に、セルの入力されている数値を利用したいこともあるでしょう。
そのような場合のコードをご紹介します。
次のサンプルコードは、セルC1を開始番号入力セル、セルD1を終了番号入力セルとしています。
セルC1に「1」を入力し、セルD1に「5」を入力すると、セルA1に1~5の数値が順に設定され、数値が設定されるごとに印刷を実行します。
'---------------------------------------------------- ' アクティブシートをプリントアウトするマクロ2 '---------------------------------------------------- ' 任意のセルに入力された数値を開始・終了番号にします ' ' 作成日:2010.06.09 更新日:2024.03.02 '---------------------------------------------------- Sub printoutActivesheet_2() '------------------------------- ' 定数 '------------------------------- ' 予め定めておく値を設定 Const L_TARGET_CELL_ADDRESS As String = "A1" ' 値設定対象のセル Const L_STARTING_CELL_ADDRESS As String = "C1" ' 開始番号設定のセル Const L_ENDING_CELL_ADDRESS As String = "D1" ' 終了番号設定のセル Const L_STEP As Long = 1 ' 番号の増分値 ' 1の場合:番号は1ずつ増加する ' 2の場合:番号は2ずつ増加する '------------------------------- ' 開始・終了番号のセル値確認 '------------------------------- ' 開始番号・終了番号の設定セルが数値でない場合は処理を終了する If WorksheetFunction.IsNumber(ActiveSheet.Range(L_STARTING_CELL_ADDRESS).Value) = False Or _ WorksheetFunction.IsNumber(ActiveSheet.Range(L_ENDING_CELL_ADDRESS).Value) = False Then MsgBox "開始番号・終了番号のセルに数値を入力してください", vbExclamation, "終了します" Exit Sub End If '------------------------------- ' 開始・終了番号をセルから取得 '------------------------------- Dim lngStartingNumber As Long Dim lngEndingNumber As Long lngStartingNumber = CLng(ActiveSheet.Range(L_STARTING_CELL_ADDRESS).Value) lngEndingNumber = CLng(ActiveSheet.Range(L_ENDING_CELL_ADDRESS).Value) '------------------------------- ' プリントアウト処理 '------------------------------- Dim i As Long ' 変数 i には開始番号から終了番号までの値が順に設定される For i = lngStartingNumber To lngEndingNumber Step L_STEP ActiveSheet.Range(L_TARGET_CELL_ADDRESS).Value = i ' 値設定セルに変数 i の数値を設定する ActiveSheet.PrintOut ' アクティブシートをプリントアウトする Next End Sub
最初に紹介したサンプルコードと同じように、定数によって設定を変えるようにしています。
・「値設定対象のセル」 値を設定する対象セルのアドレスです。
・「開始番号の設定セル」 開始する番号を入力するセルアドレスです。
・「終了番号の設定セル」 終了する番号が入力されているセルアドレスです。
・「番号の増分値」 番号の増分値です。「1」の場合1ずつ番号が増えます。「2」にすると2ずつ番号が増えます。
コード途中の「WorksheetFunction.IsNumber」は、ワークシート関数のISNUMBER関数です。
この関数を利用して開始番号と終了番号の設定セルが数値かを判定しています。
開始番号・終了番号を設定するセルが、空欄や文字列の場合には処理を終了します。
書籍紹介
知りたいがすぐわかる! やりたいがすぐできる!
「Excel VBA 逆引きで学ぶ ユーザーフォーム&コントロール」(Kindle版)
ユーザーフォームを扱えると、VBAでできることが大きく広がります!
本書では、知りたいこと、やりたいことから、逆引きで学びを深められます。
※ 第1章~5章まで公開しています
■ 詳細 ■ 購入:amazon
値の設定と印刷の間に待機時間をもうける
ワークシート上に多くの数式を使用していると、数式の計算に時間がかかり、想定通りの印刷結果にならない場合があります。
そのような時には、処理の途中に待機時間をつくるとよいでしょう。
次は、処理の中に待機時間をつくるをサンプルコードを紹介します。
'---------------------------------------------------- ' 宣言セクション (モジュールの先頭) '---------------------------------------------------- ' 対応バージョン:Excel2010以上 Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'---------------------------------------------------- ' アクティブシートをプリントアウトするマクロ3 '---------------------------------------------------- ' コード内の定数に開始番号や終了番号を設定します ' 値の設定とプリントアウトの間に待機時間をもうけます ' ' 作成日:2010.06.09 更新日:2024.03.01 '---------------------------------------------------- Sub printoutActivesheet_3() '------------------------------- ' 定数 '------------------------------- ' 予め定めておく値を設定 Const L_TARGET_CELL_ADDRESS As String = "A1" ' 値設定対象のセル Const L_STARTING_NUMBER As Long = 1 ' 開始番号 Const L_ENDING_NUMBER As Long = 10 ' 終了番号 Const L_STEP As Long = 1 ' 番号の増分値 Const L_WAITING_TIME As Long = 500 ' 待機時間(ミリ秒)1秒:1000 '------------------------------- ' プリントアウト処理 '------------------------------- Dim i As Long ' 変数 i には開始番号から終了番号までの数値が順に設定される For i = L_STARTING_NUMBER To L_ENDING_NUMBER Step L_STEP ActiveSheet.Range(L_TARGET_CELL_ADDRESS).Value = i ' 値設定セルに変数 i の数値を設定する Call Sleep(L_WAITING_TIME) ' 0.5秒待機する ActiveSheet.PrintOut ' アクティブシートをプリントアウトする Next End Sub
このコードの上部に「Declare PtrSafe Sub ~」とありますが、これはWindowsの関数を呼び出すための記述になります。
このようなWindowsの関数を呼び出す記述は、モジュールの先頭の「宣言セクション」にしなければなりませんので、気をつけてください。
紹介したコードでは、WindowsのSleep関数を利用しています。
Sleep関数は指定した数値の時間処理を待機させます。この数値はミリ秒での指定になります(1秒=1000ミリ秒)。
また、これまでのコードと同じく定数で設定を変えられるようにしています。
・「値設定対象のセル」 値を設定するセルのアドレスです。
・「開始番号」 セルに設定する値の開始番号です。1~40番まで設定する場合の1番を指します。
・「終了番号」 セルに設定する値の終了番号です。1~40番まで設定する場合の40番を指します。
・「番号の増分値」 番号の増分値です。「1」の場合1ずつ番号が増えます。「2」にすると2ずつ番号が増えます。
・「待機時間」 待機時間の値です。待機時間はミリ秒(1秒:1000ミリ秒)で指定します。
任意のシート指定して連続印刷する
これまで紹介したコードは、アクティブシートを印刷するものでした。
しかしアクティブシートではなく、任意の指定したシートを印刷したいこともあるでしょう。
任意のシート1枚を印刷したい場合、これまでのコード内にある「Activesheet」を「Worksheets("(シート名)")」とすれば良いのですが、複数のシートでそれぞれ連続印刷できたり、シート毎に設定を簡単に変更できると利便性が高まります。
次は、任意のシートを指定して連続印刷するサンプルコードの紹介です。
このコードはこれまでのものと異なり、連続印刷するためのプロシージャを利用する形にしています。
また、これまで紹介したコードは、定数によって設定を変更していましたが、このコードではプロシージャの引数によって設定を変更するようにしています。
Sub アクティブシートを連続印刷する() ' アクティブシートのセルA1に1~6まで順に設定して印刷する Call printoutTargetSheet(ActiveSheet, "A1", 1, 6, 1, False) End Sub
Sub 名簿シートを連続印刷する() ' 「名簿」シートのセルB3に101~106まで順に設定して印刷する(プレビューする) Call printoutTargetSheet(Worksheets("名簿"), "B3", 101, 106, 1, True) End Sub
Sub ○○シートを連続印刷する() ' 「○○」シートのセルF20に1,3,5,7,9の順に設定して印刷する Call printoutTargetSheet(Worksheets("○○"), "F20", 1, 9, 2, False) End Sub
'---------------------------------------------------- ' 任意のシートをプリントアウトするプロシージャ '---------------------------------------------------- '[引数] ' shtTarget :対象ワークシートオブジェクト ' TargetCellAddress:値設定対象のセルアドレス ' StartingNumber :開始番号 ' EndingNumber :終了番号 ' StepNumber :増分値(既定:1) ' Preview :プレビューフラグ ' プレビューする :True ' プレビューしない(既定):False '[作成日]2024.03.02 '---------------------------------------------------- Sub printoutTargetSheet(ByRef shtTarget As Worksheet, _ ByVal TargetCellAddress As String, _ ByVal StartingNumber As Long, _ ByVal EndingNumber As Long, _ Optional ByVal StepNumber As Long = 1, _ Optional ByVal Preview As Boolean = False) Dim i As Long For i = StartingNumber To EndingNumber Step StepNumber shtTarget.Range(TargetCellAddress).Value = i shtTarget.PrintOut Preview:=Preview ' プリントアウト Next End Sub
ラベル等 印刷のヒント1ページに複数ラベル等を連番で表示
あるセルが「1」になったら、ラベル等が 1~6 まで表示され、「2」になったら 7~12 まで表示されるようにしたい。といったような要望を時々いただきます。
そのような場合のセルの数式例を紹介します。
最初の数値を表示させるセルに次の数式を入力します。
=IF($A$1="","",($A$1-1)*6+1)
数式内の「$A$1」は数値を入力するセルになります。
赤字の部分は、一度に表示させたいラベル等の数によって変更します。
次の数値を表示させるセルに、次の数式を入力します。
=IF($C$3="","",$C$3+1)
この「$C$3」は最初の数値が表示されるセルです。
+1 の部分は最初の数値からプラスしたい数です。
他の連続番号を表示したいセルにも、同様の数式を入力します。
このように数式を設定すると、入力するセルの数値が変わるごとに、連続番号をまとめて表示させることができます。