EXCEL VBAで一括印刷プログラムシート「かんたん一括印刷クン」を作る（初心者向け）

## 一括印刷プログラムシートとは？
指定のセルに値や文字を代入すると関数が組まれた資料、レポート等を一気に印刷してくれる一括印刷機能のマクロです。
エクセルシートが何百枚でも数クリックで印刷可能に！
私は`「かんたん一括印刷クン」`と名付けています。

## 作成した背景
店舗指導員時代、毎週レポート10数枚を店舗毎に約20名が2台のプリンターで印刷する必要がありました。
そして毎回起こるコピー機渋滞と書類の紛失。
どげんかせんといかんということで週末ベローチェに籠もり、この一括印刷プログラムシートを作成。
作業を短縮化、印刷担当者に作業を集約し、週一のMTG後すぐに巡回に行ける状態にしました。
（資料のDL含め30分/人×20人とすると週600分→10時間の時間創出!）

まとまったものがなかったのと作成時は苦労したので記事を作成しました。
私と同じ業務効率化が趣味の方、ぜひご活用ください！

## 使用イメージ
1. ファイルを開き、リストを読み込みます
![6110c62ce3b2d2d7a5283fd7068342f2-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/200d242d-04f1-f04b-24d8-b57d94bbe839.gif)
2. 代入先のセルとプリンタを選び印刷開始（最初は3枚印刷されます）
![9b9199a461f2f8d9e31ec9c8a6a2517f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/fef12c61-bfce-4998-7f0c-b377294747aa.gif)
3. 印刷されていることが確認できれば残りを印刷！
![05476a7bc6f1f7d823b3825be91e2438.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/37a9299a-d60e-cb90-7441-0ee46fde552f.gif)

## 一括印刷プログラムシートの作成手順
ここからは具体的な作成手順を記載します。
ユーザーフォームを作成するのは少し手間ですが、コードは基本コピペで大丈夫です！
コードは必要に応じでアレンジしてください。

【作成手順】
1. Excelファイルを作成（拡張子は*.xlsm） 
2. 一括印刷ユーザーフォームの作成 
3. 一括印刷機能起動ボタンの作成
（尚、MacのExcelではユーザーフォームが使えないと思うのでWindowsでお願いします…）

### 1. EXCELファイルを作成
マクロ有効ファイルの拡張子（*.xlsm）で作成します。
ファイル名はなんでも大丈夫です！ Ex)一括印刷クンプログラムシート.xlsm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/9757fde3-e714-dcfb-b9f5-60136aae3403.png)

### 2. 一括印刷ユーザーフォームの作成
苦手な方もいらっしゃると思いますが、今後楽をするためにトライしてみましょう！
開発タブ→Visual Basic→VBA project(一括印刷クンプログラムシート.xlsm)→
右クリック→insert(挿入)→UserFormを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/ca269c3c-f93f-3b1b-767f-5f2baacb79a9.png)
そうするとユーザーフォームの雛形ができたと思います。
UserFormの名前は`一括印刷ユーザーフォーム`としてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/7b06176f-361c-11aa-e3d7-cfe521449e42.png)
ここで、ツールボックスを使用してユーザーフォームを整えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/365b5b45-daf7-8273-6c9f-515b7ed478af.png)
以下の画像の様にユーザーフォームを作成します。必要なのは赤枠の部分だけですのでほかは省いててOK！
逆に`ListBox1`、`CommandButton1`、`CommandButton2`は使用するので必ず設置してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/0df7a72b-5b98-1364-de37-0d4e715bbf99.png)

フォームをダブルクリックするとコードが表示されます。
そこに以下のコードを貼り付けてください。

```vb:一括印刷ユーザーフォーム.
Private Sub CommandButton1_Click()

  Dim buttom_cell As Long

  '■ポップアップ画面非表示・画面描写中止
  Application.DisplayAlerts = False
  Application.ScreenUpdating = False

  '■入力場所に空欄があった場合、それを破棄する
  Range("A:A").Select
  On Error Resume Next 'エラー回避
  Selection.SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp '空欄削除
  Range("A1").Select

  buttom_cell = Cells(Rows.Count, 1).End(xlUp).row 'A列の最も下のセルの行の場所を取得
  On Error GoTo error_nodata 'A列に何も入力されていなかった場合、myerrorへ

  '■ポップアップ画面非表示・画面描写中止
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True

  ListBox1.List = Range(Cells(1, 1), Cells(buttom_cell, 1)).Value2
  MsgBox "登録件数は" & ListBox1.ListCount & "件です。" & vbCrLf & vbCrLf _
  & "印刷するシートの代入先のセルを選択し、" & vbCrLf & "「印刷スタート！」のボタンを押してください。"

  Exit Sub

error_nodata:  MsgBox "A列に何も記載がないか、1つのみとなっています。" & vbCrLf & vbCrLf & "A1セルから貼り付け/入力してください"

End Sub

Private Sub CommandButton2_Click()
  Dim msg0 As Integer
  Dim msg1 As Integer
  Dim i As Long
  Dim setting_printer As Boolean
  Dim S As String
  S = ActiveCell.Address

  If ListBox1.ListCount = 0 Then
    MsgBox "リストを読み込んでください。"
  Else
    msg0 = MsgBox("印刷するレポート（シート）は" & vbCrLf & "ファイル名：「" & ActiveWorkbook.Name & "」" _
    & vbCrLf & "シート名：「" & ActiveSheet.Name & "」、" & vbCrLf & "リストの代入先は「" & S & "」" & vbCrLf & "でよろしいですか？", vbYesNo + vbQuestion, "確認")
    If msg0 = vbYes Then
      setting_printer = Application.Dialogs(xlDialogPrinterSetup).Show    '印刷設定画面を開く
    '■印刷設定がキャンセルされた場合
      If setting_printer = False Then
        MsgBox "印刷がキャンセルされました"
        Exit Sub
      End If

      For i = 0 To 2
        ActiveCell.Value = ListBox1.List(i)
        Range(S) = Replace(Range(S), "", "") '数字が更新されない場合に対応。
        Range(S).Activate '指定のセルをアクティブにして、シートのイベントを発生させる。
        ActiveWindow.SelectedSheets.PrintOut 'シートを印刷(印刷ボタンを押す)
        On Error GoTo myerror1
      Next

myerror1:
      msg1 = MsgBox("正しく印刷されていますか？", vbYesNo + vbQuestion, "確認")
      If msg1 = vbYes Then
        For i = 3 To ListBox1.ListCount - 1
          ActiveCell.Value = ListBox1.List(i)
          Range(S) = Replace(Range(S), "", "")
          Range(S).Activate '指定のセルをアクティブにして、シートのイベントを発生させる。
          ActiveWindow.SelectedSheets.PrintOut 'シートを印刷(印刷ボタンを押す)
        Next
        MsgBox "印刷が完了しました！"
      Else
        MsgBox "もう一度設定しなおしてください。"
      End If
    Else
      MsgBox "もう一度セルを選択して下さい。"
    End If
  End If
Exit Sub

myerror2:
MsgBox "「印刷リスト」シートはこのファイルにありません。必要に応じて削除ください。"

End Sub
```

以上でユーザーフォームの設定は終わりです！

### 3. 一括印刷機能起動ボタンの作成
先程ユーザーフォームを作った方法と同じやり方でモジュールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/0ac8170c-dd94-e053-6bee-9bc36594e2a6.png)

作成したモジュールの名前を`一括印刷機能起動`に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/8184d17e-4600-03cc-9360-671bec47a8c8.png)

モジュールをダブルクリックし、コード編集画面を開いて下記コードをコピペします。

```vb:一括印刷機能起動.
Sub 一括印刷クン起動()
    
 Dim ws As Worksheet, flag As Boolean
 一括印刷ユーザーフォーム.Show vbModeless

 For Each ws In Worksheets
  If ws.Name = "印刷リスト" Then flag = True
 Next ws

 If flag = True Then
 
  Sheets("印刷リスト").Visible = True
  Sheets("印刷リスト").Activate
  Columns("A:A").Select
  Range("A1").Select
  MsgBox "「印刷リスト」シートに" & vbCrLf & "必要なリストを貼り付けてください。"
  Exit Sub

 Else

 ActiveWorkbook.Sheets.Add
 On Error Resume Next
 ActiveSheet.Name = "印刷リスト"
 Columns("A:A").Select
 Range("A1").Interior.Color = 65535
 Range("B1") = "←ここから値で貼付け！"
 Range("A1").Select
 MsgBox "「印刷リスト」シートに" & vbCrLf & "必要なリストを貼り付けてください。"

 End If
    
End Sub
```

次にシート上に起動するためのボタンを作成します。シート名はそのままSheet1でも何でもかまいません。
シートに戻り、開発タブ→Insert(挿入)→ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/3b1d7e98-ffa9-72b9-9001-8cbef09c58c3.png)
以下の図のようにボタンを設置し、マクロを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/1a214a02-dec9-e6e0-15a8-ddc4986f3743.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/98637f73-b445-f8f1-c1c6-d9ace914ff15.png)

以上で完成です！
起動ボタンを押して作成したユーザーフォームが出てくれば完成です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224314/97e7c628-4493-8685-7ae7-45d14bc1cd25.png)

## その他
- プログラムシートを開いたまま、別のファイルを印刷できます。
- 印刷範囲の設定は別途実施ください。
- 3枚印刷後、確認画面が現れます。「はい」を選択すると残りが印刷されます。
- リスト読み込み時に空欄があった場合は消去されます。重複の削除は実施されません。
- 「印刷リスト」シートは自動生成されますので削除しても大丈夫です。

## 注意
無限に印刷できますので印刷のしすぎにご注意ください。
人件費は下がりますが、コピー代は上がるかと…w
最初に印刷する場合はWifiをoffにするなどしてコピー機との連動をストップしてもいいかもしれません。

読んでもできなかったり不具合があった場合はコメント欄へお願いします！