セルの値によりVBA印刷ページ数・枚数を変更する方法

excel-vba Excel-VBA
スポンサーリンク

エクセルで印刷するには【ファイル】➡【印刷】を選ぶのが一般的ですが、作業効率化の為には少しの手間も省きたいですよね。

そこでVBAを使って、ユーザーフォームに配置したコマンドボタンに印刷コードを書きこんでおけば、ボタン1回押すだけで印刷ができるので効率的です。

印刷するPrintOutメソッド

印刷ページ数と印刷枚数が決まっている時は、このようにVBAコード書いていますよね。

Private Sub CommandButton1_Click()
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=2, Copies:=1, Collate:=True
End Sub
  1. ユーザーフォームに配置したコマンドボタン1をクリックすると
  2. 今開いているシートを印刷する、1ページ目~2ページ目までで、1枚印刷、部単位
  3. マクロ記述終了

表示しているシートを印刷する

ActiveWindow.SelectedSheets.PrintOut

印刷ページ数の設定

ActiveWindow.SelectedSheets.PrintOut From:=1, To:=2

印刷枚数の設定

ActiveWindow.SelectedSheets.PrintOut Copies:=1

部単位で印刷

Collate:=True

波乗りアヒル
波乗りアヒル

人数に応じてページ数や枚数変更して印刷したいことありませんか?

Select Caseを使う方法

ページ数が決まっていて印刷枚数だけ自由に変更したいならば、Select Caseを使うのが簡単です。

ユーザーフォームに配置したテキストボックスに印刷したい枚数を入力させて、コマンドボタンを押せば必要枚数が印刷されるようにします。

さらに、テキストボックスが空欄の時は「印刷枚数を入力してください」と警告メッセージを表示させます。

Private Sub CommandButton1_Click()
If TextBox1.Value = “” Then
MsgBox “印刷枚数を入力してください”
Else
Select Case TextBox1
Case Is = 1
ActiveWindow.SelectedSheets.PrintOut FROM:=1, To:=2, COPIES:=1, COLLATE:=True
Case Is = 2
ActiveWindow.SelectedSheets.PrintOut FROM:=1, To:=2, COPIES:=2, COLLATE:=True
Case Is = 3
ActiveWindow.SelectedSheets.PrintOut FROM:=1, To:=2, COPIES:=3, COLLATE:=True
End If
End Sub
  1. コマンドボタン1をクリックすると
  2. もし、テキストボックス1が空欄だったら
  3. メッセージで「印刷枚数を入力してください」と表示する
  4. そうでなかったら(入力されていたら)
  5. テキストボックス1の入力値が
  6. 1の時は
  7. 表示しているシートを印刷、1ページから2ページ、1枚印刷、部単位
  8. 2の時は
  9. 表示しているシートを印刷、1ページから2ページ、2枚印刷、部単位
  10. 3の時は
  11. 表示しているシートを印刷、1ページから2ページ、3枚印刷、部単位
  12. IFステートメント終了
  13. マクロ記述終了

11行目以降に4枚印刷・・・・と続けてVBAコード記述すれば、何枚でも印刷できるようになります。

この方法で、印刷ページ数も可能なのですが、VBAコード書くのが面倒なのでセルの値を読み込ませるようにVBAコードを書き換えましょう。

ページ数のTO・FROMをセルの値に指定する

果たしてこの方法が正しい方法なのか分かりませんが、ページ数を指定するToとFromを数字ではなくセルを指定してみたら、上手くできたのでこの方法をいつも使っています。

まずは、分かりやすくToとFromを数字からセルを指定したVBAコードを書きます。

シートは「HOME」で開始ページ数を入力しているセルは「BM2」、終了ページ数を入力しているセルは「BM3」とし、印刷枚数は1枚を固定しています。

Private Sub CommandButton1_Click()
Sheets(“R”).Select
ActiveWindow.SelectedSheets.PrintOut FROM:=Sheets(“HOME”).Range(“BM2”).Value, To:=Sheets(“HOME”).Range(“BM3”).Value, COPIES:=1, COLLATE:=True
End Sub
  1. コマンドボタン1をクリックしたら
  2. シート名「R」を選択する
  3. 表示されているシートを印刷で、開始ページ数はシート「HOME」のセル「BM2」の値を開始ページ数にする
  4. 終了ページ数はシート「HOME」のセル「BM3」の値を終了ページ数にして、印刷枚数は1、部単位。
  5. マクロ記述終了

これで、人数など条件が変わるとセルBM2、BM3に変更された数字が計算されて入力されているので、わざわざ、開始ページ・終了ページを設定しなくても自動的に印刷されるようになります。

波乗りアヒル
波乗りアヒル

ちょっと応用をした方法で実際に使っています。

先ほどのVBAコードに付け加えたの次の内容です。

  1. 誤ってボタン押してしまったら印刷されてしまうのを防ぐため「はい」「いいえ」が選択できるメッセージを追加
  2. 「はい」の時は印刷する
  3. 「いいえ」の時は、印刷するシートを閲覧できるようにする
  4. メッセージを表示する
  5. 15秒後に元に戻す
Private Sub CommandButton1_Click()
msg = MsgBox(“レコードシートを印刷しますか?”, Buttons:=vbYesNo + vbQuestion)
If msg = vbYes Then
Application.ScreenUpdating = False
Sheets(“R”).Select
Range(“A1”).Select
ActiveWindow.SelectedSheets.PrintOut FROM:=Sheets(“HOME”).Range(“BM2”).Value, To:=Sheets(“HOME”).Range(“BM3”).Value, COPIES:=1, COLLATE:=True
Sheets(“HOME”).Select
Range(“A1”).Select
Application.ScreenUpdating = True
Else
Unload UserForm5
Sheets(“R”).Select
Range(“A1”).Select
MsgBox “15秒後に自動復帰します”
Application.OnTime Now + TimeValue(“00:00:15”), “RSTIME”
End If
End Sub
  1. コマンドボタン1をクリックしたら
  2. メッセージで「はい」「いいえ」を選択させる
  3. 「はい」を選択したら
  4. 画面のちらつきを防ぎ処理を早くさせる
  5. シート「R」を選択
  6. セル「A1」を選択
  7. 表示されているシートを印刷で、開始ページ数はシート「HOME」のセル「BM2」の値を開始ページ数にする
  8. 終了ページ数はシート「HOME」のセル「BM3」の値を終了ページ数にして、印刷枚数は1、部単位
  9. シート「HOME」を選択
  10. セル「A1」を選択
  11. 画面のちらつき処理終了
  12. 「いいえ」を選択したら
  13. UserForm5を閉じて
  14. シート「R」を選択
  15. セル「A1」を選択
  16. メッセージで「15秒後に自動表示します」と表示
  17. タイマー設定して15秒後に「RSTIME」というプログラムを作動させる
  18. IFステートメント終了
  19. マクロ記述終了

ちょっと長くなりましたが、簡単にいうと、「はい」を選択したら印刷開始、「いいえ」を選択したら、15秒間印刷内容を閲覧出来て、15秒後にRSTIME(元に戻るプログラム)を作動させるという事です。

波乗りアヒル
波乗りアヒル

これをやっておかなかった時は、間違って押したら印刷されてしまい、紙の無駄があったのと、数秒後に元に戻る事ができて、マクロエラーも回避できました。

コメント