エクセルマクロを使って送付状を作成する方法【サンプルコード付き】
請求書や領収書を送付するときに添付する「送付状」の作成を自動化したい!
こんな要望にお応えします。
この記事では、送付状の作成から印刷を自動化するマクロの作り方を解説しています。
送付状の作成は一度しっかり雛形を作成してしまえば、「氏名」「宛先」「日付」などを編集するだけの単純作業になりがちです。
単純作業なのに作成件数が多くて時間がかかると悩んでいる方が多いのではないでしょうか。
私が勤めていた会社では、
送付状の作成は単純なルーティーン作業だから若手の仕事
とされていました。
ベテランがやろうが若手がやろうが作業量が変わるわけではないので時間のかかる仕事に変わりありません。
送付状自動印刷マクロを導入すれば、誰でも一瞬で大量の送付状を作成できるようになります。
送付状作成業務の効率をアップさせたい!という方は是非チェックしてみてください。
目次
送付状とは
送付状とは、郵送物に添付する一枚の書類のことです。
送付状には、郵送物の情報や目的を簡潔に記載します。
- 自分の会社情報
- 相手先の会社情報
- あいさつ文
- 郵送物の内容
送付状を見ただけで郵送物の内容と目的がすぐに理解できるよう作成することが重要です。
請求書を郵送するときに実際に使っている送付状がこちら
同封する書類が請求書や領収書の場合、送付状を添付する必要ない!という方がいらっしゃいますが、ビジネスマナーとして私はどんなときも必ず送付状を添付しています。
「〇〇の件に関する請求書です。」と一文添えるだけで相手への親切感が全然違います。
今まで送付状を添付したことがない!送付状を添付していなくても相手から指摘されたことがない!
こんな理由で送付状を添付していない方は相手先に好印象を与えるチャンスを逃している可能性があります。

疲れ果てた人
次回の書類を郵送することがあったら送付状の添付にチャレンジしてみてください。
送付状自動印刷マクロとは
送付状自動印刷マクロは、
「氏名」「住所」「会社名」などの項目を編集し印刷する
この処理を自動で行います。
「宛先一覧」シートの情報を「送付状」シートに転記、
転記処理が完了するとすぐに印刷処理されます。
「送信日」や「No」情報から印刷件数を指定することができます。
宛先の異なる送付状をまとめて印刷することが可能です。

ガッツポーズの人
いろんな取引先に請求書や領収書を送付することがあって、大量の送付状が必要になる方におすすめです。
今回、サンプル事例として紹介している送付状は、「宛先」「送付資料」「記載事項」の編集を行う設定ですが、
「挨拶文」の内容を宛先によって変化させることも可能です。
業務内容に合わせた書類印刷作業の効率をアップさせるマクロを作ってほしい!という方は是非マメBlogにご相談ください。
>>> マメBlogへの問い合わせはこちら
送付状自動印刷マクロを使って非効率的な書類作成業務の効率をアップさせてみてください。
送付状自動印刷マクロの使い方
①送付状に必要な基本情報の入力
一番下の空白行に基本情報をどんどん追記していくだけで入力作業は完了です。
②印刷する送付状の指定

ガッツポーズの人
時間のかかる手順は、基本情報の入力作業です。
基本情報の入力作業も一旦入力してしまえば次回の入力はコピペで完了させることができます。
送付状自動印刷マクロのサンプルコード
下記のサンプルコードは、実際に導入している送付状自動印刷マクロに設定しているものと全く同じコードなのでコピペして使うことが可能です。
Sub 印刷マクロ()
'''Sheetの設定'''
Dim Ash As Worksheet
Dim Bsh As Worksheet
Set Ash = ThisWorkbook.Worksheets("宛先一覧")
Set Bsh = ThisWorkbook.Worksheets("送付状")
Dim Num1, Num2 As Long
Num1 = Ash.Cells(5, 17)
Num2 = Ash.Cells(5, 19)
''''''''''''''''転記番号を入力'''''''''''''''''''''''
For j = Num1 + 2 To Num2 + 2
''''''''''''''''印刷番号が入力されているときに実行'''''''''''''''''''''''
If Num1 <> 0 And Num2 <> 0 And Ash.Cells(j, 9) = "" Then
Bsh.Range(Bsh.Cells(2, 4), Bsh.Cells(7, 5)).ClearContents
Bsh.Range(Bsh.Cells(22, 3), Bsh.Cells(24, 4)).ClearContents
Bsh.Range(Bsh.Cells(28, 3), Bsh.Cells(30, 4)).ClearContents
'''''日付を転記'''''
Bsh.Cells(1, 8) = Ash.Cells(3, 17)
'''''郵便番号を転記'''''
Bsh.Cells(2, 4) = Ash.Cells(j, 7)
Bsh.Cells(2, 4).HorizontalAlignment = xlLeft
'''''住所を転記'''''
Bsh.Cells(3, 4) = Ash.Cells(j, 8)
Bsh.Cells(3, 4).HorizontalAlignment = xlLeft
'''''会社名を転記'''''
Bsh.Cells(4, 4) = Ash.Cells(j, 4)
Bsh.Cells(4, 4).HorizontalAlignment = xlLeft
'''''部署を転記'''''
Bsh.Cells(5, 4) = Ash.Cells(j, 5)
Bsh.Cells(5, 4).HorizontalAlignment = xlLeft
'''''氏名を転記'''''
Bsh.Cells(6, 4) = Ash.Cells(j, 6)
Bsh.Cells(6, 4).HorizontalAlignment = xlLeft
Bsh.Cells(6, 5) = "様"
'''''「宛先一覧」シートの送付資料①を転記'''''
If Ash.Cells(j, 10) <> "" Then
Bsh.Cells(22, 3) = "1)"
Bsh.Cells(22, 4) = Ash.Cells(j, 10)
Bsh.Cells(22, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートの送付資料②を転記'''''
If Ash.Cells(j, 11) <> "" Then
Bsh.Cells(23, 3) = "2)"
Bsh.Cells(23, 4) = Ash.Cells(j, 11)
Bsh.Cells(23, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートの送付資料③を転記'''''
If Ash.Cells(j, 12) <> "" Then
Bsh.Cells(24, 3) = "3)"
Bsh.Cells(24, 4) = Ash.Cells(j, 12)
Bsh.Cells(24, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートのその他お知らせ①を転記'''''
If Ash.Cells(j, 13) <> "" Then
Bsh.Cells(28, 3) = "1)"
Bsh.Cells(28, 4) = Ash.Cells(j, 13)
Bsh.Cells(28, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートのその他お知らせ②を転記'''''
If Ash.Cells(j, 14) <> "" Then
Bsh.Cells(29, 3) = "2)"
Bsh.Cells(29, 4) = Ash.Cells(j, 14)
Bsh.Cells(29, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートのその他お知らせ③を転記'''''
If Ash.Cells(j, 15) <> "" Then
Bsh.Cells(30, 3) = "3)"
Bsh.Cells(30, 4) = Ash.Cells(j, 15)
Bsh.Cells(30, 4).HorizontalAlignment = xlLeft
Else
End If
'''''''''「送付状」シートを選択
Bsh.Select
'''''''''印刷範囲を選択
ActiveSheet.PageSetup.PrintArea = ("A1:I40")
ActiveSheet.PrintPreview
'ActiveSheet.PrintOut
ElseIf Num1 <> 0 And Num2 <> 0 And Ash.Cells(j, 9) <> "" Then
Bsh.Range(Bsh.Cells(2, 4), Bsh.Cells(7, 5)).ClearContents
Bsh.Range(Bsh.Cells(22, 3), Bsh.Cells(24, 4)).ClearContents
Bsh.Range(Bsh.Cells(28, 3), Bsh.Cells(30, 4)).ClearContents
'''''日付を転記'''''
Bsh.Cells(1, 8) = Ash.Cells(3, 17)
'''''郵便番号を転記'''''
Bsh.Cells(2, 4) = Ash.Cells(j, 7)
Bsh.Cells(2, 4).HorizontalAlignment = xlLeft
'''''住所1を転記'''''
Bsh.Cells(3, 4) = Ash.Cells(j, 8)
Bsh.Cells(3, 4).HorizontalAlignment = xlLeft
'''''住所2を転記'''''
Bsh.Cells(4, 4) = Ash.Cells(j, 9)
Bsh.Cells(4, 4).HorizontalAlignment = xlLeft
'''''会社を転記'''''
Bsh.Cells(5, 4) = Ash.Cells(j, 4)
Bsh.Cells(5, 4).HorizontalAlignment = xlLeft
'''''部署を転記'''''
Bsh.Cells(6, 4) = Ash.Cells(j, 5)
Bsh.Cells(6, 4).HorizontalAlignment = xlLeft
'''''氏名を転記'''''
Bsh.Cells(7, 4) = Ash.Cells(j, 6)
Bsh.Cells(7, 4).HorizontalAlignment = xlLeft
Bsh.Cells(7, 5) = "様"
'''''「宛先一覧」シートの送付資料①を転記'''''
If Ash.Cells(j, 10) <> "" Then
Bsh.Cells(22, 3) = "1)"
Bsh.Cells(22, 4) = Ash.Cells(j, 10)
Bsh.Cells(22, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートの送付資料②を転記'''''
If Ash.Cells(j, 11) <> "" Then
Bsh.Cells(23, 3) = "2)"
Bsh.Cells(23, 4) = Ash.Cells(j, 11)
Bsh.Cells(23, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートの送付資料③を転記'''''
If Ash.Cells(j, 12) <> "" Then
Bsh.Cells(24, 3) = "3)"
Bsh.Cells(24, 4) = Ash.Cells(j, 12)
Bsh.Cells(24, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートのその他お知らせ①を転記'''''
If Ash.Cells(j, 13) <> "" Then
Bsh.Cells(28, 3) = "1)"
Bsh.Cells(28, 4) = Ash.Cells(j, 13)
Bsh.Cells(28, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートのその他お知らせ②を転記'''''
If Ash.Cells(j, 14) <> "" Then
Bsh.Cells(29, 3) = "2)"
Bsh.Cells(29, 4) = Ash.Cells(j, 14)
Bsh.Cells(29, 4).HorizontalAlignment = xlLeft
Else
End If
'''''「宛先一覧」シートのその他お知らせ③を転記'''''
If Ash.Cells(j, 15) <> "" Then
Bsh.Cells(30, 3) = "3)"
Bsh.Cells(30, 4) = Ash.Cells(j, 15)
Bsh.Cells(30, 4).HorizontalAlignment = xlLeft
Else
End If
'''''''''「送付状」シートを選択
Bsh.Select
'''''''''印刷範囲を選択
ActiveSheet.PageSetup.PrintArea = ("A1:I40")
ActiveSheet.PrintPreview
'ActiveSheet.PrintOut
End If
Next
End Sub
長いコードになっていますが、
「宛先一覧」シートの情報を転記する → 印刷する
というシンプルな処理を表現しているだけになります。
82行目と155行目のPrintOut処理にマスクをかけている理由は、
マスクをかけなければ印刷命令が実行され紙が出力されてしまいます。

指示する人
マクロの設定方法
①VBAを開く
②標準モジュールを作成
③Module1にコードを記載
④ボタンの作成
⑤ボタンにマクロを登録
以上でマクロの設定は完了です。
ボタンにマクロを登録する方法は、最もシンプルなマクロの実行方法なので自由に扱えるようマスターしてみてください。
ほかにも、「セルのクリックでマクロを実行する方法」や「ユーザーフォームでマクロを実行する方法」などがあります。
ボタンにマクロを登録する方法より難易度は高めですが、仕事に応用しやすい方法です。
下記の記事では、「セルのクリックでマクロを実行する方法」を解説しています。
>>>「セルのクリックでマクロを実行する方法」の解説はこちら
是非いろんな「マクロの実行方法」を試してみてください。
送付状自動印刷マクロを導入して変わったこと
送付状作成マクロを導入してから以下のような環境の変化がありました。
- 資料作成のスピードが2倍以上早くなった
- 作業ミスがなくなったため無駄なミスプリントが減った
- 送付状作成以外の業務にもマクロを導入するようになった

ガッツポーズの人
作業量が多ければ多いほどマクロは効果を発揮します。
送付状自動印刷マクロの導入をきっかけに、職場内でいろんなエクセル業務にマクロを導入する雰囲気になりました。
その結果、デスクワーク全体の効率化が格段にアップすることに。
「書類を印刷する」「データ分析をする」といった内容で残業をする方がほぼいなくなりました。
デスクワークでの残業が多い方はマクロの導入を検討してみてはいかがでしょうか。
VBA初心者が効率化マクロを導入する方法
VBAなんて扱ったことないけどエクセル作業を自動化するマクロを導入したい!
このような問題を抱えながら日々のエクセル業務をこなしている方がおおくいらっしゃるのではないでしょうか。
こんな問題を解決する方法がこちら
- マクロの開発を外注に依頼する
- マクロが設定されたエクセルファイルをダウンロードする
- 参考書やネットでVBAスキルを身に付ける
VBAの勉強を始める前は上記の方法で効率化マクロを導入していました。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
毎日のルーティーン作業にうんざりしている、だれでもできる単純作業に時間を費やしている、という方はあなたに合った方法でVBAを導入しちゃいましょう。
マクロの開発を外注に依頼する
マクロの開発を外注に依頼する導入方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんなエクセル作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」
こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。

ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。

疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』ですぐにエクセル作業を自動化することができます。
たとえば、
A4用紙に写真を貼り付けてコメントを入力する作業を自動化したい!という場合、
『写真を貼り付けるマクロ』が設定されたエクセルファイルをダウンロードすれば問題解決です。
実際に、『写真を貼り付けるマクロ』をダウンロードして使っている様子がこちら

ガッツポーズの人
『マクロが設定されたエクセルファイルをダウンロード』する導入方法は、
VBA初心者でもマクロを導入できる、費用が安い、
というメリットがあります。
しかし
VBAに関する情報が多く公開されているとはいえ、ネット上で想定するマクロは見つけることが難しい
というデメリットもあります。

ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『写真を貼り付けるマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】』を読んでみてください。
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。

ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい処理を実現するコードを書くだけ
です。
【VBA 写真を貼る】、【VBA PDF出力】、のようにネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。
ディスカッション
コメント一覧
まだ、コメントがありません