見出し画像

Excelで差し込み印刷

Excelで差し込み印刷するのって意外と簡単

Wordの専売特許的な差し込み印刷ですが(outlookでも差し込みでメールできるらしい※妻曰く)ExcelでもVBA使えば気軽にできますよっていう話です。ものすごく簡単に書いちゃっているのですがクレームは受け付けません。

Sub MailMergeScript()
   Dim Ans As String: Ans = MsgBox("処理を行いますか?", vbYesNo + vbQuestion, "確認")
   If Ans = vbNo Then Exit Sub
  
   ''差し込み印刷用の元データを入れるシートの名前は「元データ」にするかコードを書き換えてください。
   ''差し込み印刷用元データは1行目が見だしの想定。そうじゃない場合は別の書き方なるから注意してくださいね
   ''差し込み印刷を実施する上でファイルに差し込み印刷元用のシートと書式が必要です
  
   Dim dataRegion As Variant: dataRegion = ThisWorkbook.Sheets("元データ").Range("A1").CurrentRegion '差し込み印刷用の元データ
   If UBound(dataRegion, 1) <= 1 Then Exit Sub 'データがそもそもないときはやりません
  
   'このコードにおける元データの想定 1列目:ID 2列目:氏名 3列目:住所とか
   With Application
       .ScreenUpdating = False
       .EnableEvents = False
   End With
   Dim wc As Integer: wc = ThisWorkbook.Worksheets.Count
   Dim i As Integer
   Dim WSheet As Worksheet '「書式」という名前のシートがある前提ですよ
   Set WSheet = ThisWorkbook.Sheets("書式")
   
   For i = LBound(dataRegion, 1) + 1 To UBound(dataRegion, 1)
       With ThisWorkbook
           WSheet.Copy after:=.Sheets(wc)
           wc = wc + 1
           With .Sheets(wc)
               .Range("B1") = dataRegion(i, 1) 'ID
               .Range("B2") = dataRegion(i, 2) '氏名
               .Range("B3") = dataRegion(i, 3) '住所とか
               .Name = dataRegion(i, 1) 'シート名はIDととりあえず設定しています
           End With
       End With
   Next i
   ThisWorkbook.Sheets(1).Select
   Set WSheet = Nothing
   With Application
       .ScreenUpdating = True
       .EnableEvents = True
   End With
End Sub

(注意)いうまでもなくこのままでは使えません!

エクセルファイルに「元データ」っていう差し込み印刷用のシートと差し込む書式ファイル「書式」がある前提です。

           With .Sheets(wc)
               .Range("B1") = dataRegion(i, 1) 'ID
               .Range("B2") = dataRegion(i, 2) '氏名
               .Range("B3") = dataRegion(i, 3) '住所とか
               .Name = dataRegion(i, 1) 'シート名はIDととりあえず設定しています
           End With

ここが差し込む場所を指してます。とりあえず3か所ですが表の列数によって差し込む場所は増やせるし、変えられますからね。

上手くいじって使ってもらう前提なので重々注意してくださいね。あとこれエラー対策全然してません。

「こいつすかしてんなー」ポイント

慣れないうちはSheet「元データ」の参照もCells(i,~)みたいな直接的な指定をしたほうが書きやすいです。というよりも可読性はそちらのほうがいいでしょう。

でもね、でもね・・・

配列のほうが速いし、なんかカッコいいの!!!

私は配列を5年間くらい毛嫌いし続けてきたけどでも配列でやれると話が別世界なんです。
これからVBAやるひとは最初から配列に慣れてほしい・・・。
あと配列使い慣れないと他の言語で応用が利きづらいのです。GASとかは処理が追っつかないのです。

コンピューターさんは一気に何でも覚えるのが得意です

PCさんって頗る頭がいいんですよ。なんでも一行で覚えるのです。

dataRegion = ThisWorkbook.Sheets("元データ").Range("A1").CurrentRegion '差し込み印刷用の元データ

この一文でA1セルを含むデータの表全部覚えてるんですからね。もう記憶力が段違い。いちいち調べに行かせることが無駄って話なのよ。

でもこれはカッコつけですので別ver要請はお気軽に

事務方でExcelで差し込み印刷できたらなーは割とあるあるじゃないですか?
VBA入門としても取っ付きやすいチャレンジなので是非トライしてみてください♪

この記事が気に入ったらサポートをしてみませんか?