Wordを使わずにExcelだけで差し込み印刷(メールマージ)を行う2つの実践的な方法
Wordを使わずにExcelで差し込み印刷(メールマージ)を実現する方法をお探しですか?この記事はまさにそのためのものです。何らかの理由でMicrosoft Wordが使えない環境では、差し込み印刷の作業が難しく感じられるかもしれません。しかし、決して不可能ではありません。差し込み印刷の操作にはWordは必須ではないのです。この記事では、Excelのみで差し込み印刷を行うための2つのVBAマクロをご紹介します。
差し込み印刷(メールマージ)とは?
個人や企業が、宛名やメールアドレスなど一部の内容だけを変えた大量のメールを送りたい場合があります。そのようなとき、ひな形(テンプレート)を作成し、編集可能なフィールドを設けることで作業効率化を図れます。この仕組みが差し込み印刷(メールマージ)と呼ばれるものです。
これは時間を大幅に節約できる機能です。通常、この作業はワープロソフト(Microsoft WordやGoogleドキュメントなど)で行われるのが一般的ですが、この便利な機能を最初に導入したのは1980年代初頭のWordStarであり、その後他のソフトウェアも次々と採用してきました。
一般的に、差し込み印刷の操作には以下の5つの主要ステップが必要です。
- 元になる文書(テンプレート)の作成
- データソース(差し込みデータ)の準備
- 挿入するフィールドの設定
- 元文書との結合(マージ)
- メールの保存または送信
Wordを使わずにExcelで差し込み印刷を行う2つの方法
Microsoft Wordは最も代表的なワープロソフトであるため、「差し込み印刷」という言葉を聞くと多くの人はWordを思い浮かべます。しかし、ここではあえて別のアプローチを取り、Microsoft Excelだけで差し込み印刷を実行します。詳しく知りたい方は、ぜひ最後までお読みください。
さらに、この記事では2つのデータセットを使ってマクロをデモンストレーションします。1つ目のデータセットは「氏名(Name)」「メールアドレス(Email Address)」「都市(City)」「番地(Street Address)」の列で構成されています。2つ目のデータセットは記事後半の2つ目の方法で登場します。また、プライバシー保護のため、データセット内の3件のメールアドレスは架空のものであり、最後の1件は筆者自身のアドレスで、問題なくメールを送信できることを確認するために使用しています。

方法1: Excelでメールを自動送信する差し込み印刷
1つ目の方法では、ワークシート名を「VBA1」としています。単一のモジュールに2つのSubプロシージャを含むVBAコードを挿入し、WordなしでExcel上の差し込み印刷を実現します。その後、このコードを実行すると、事前に定義したテンプレートに基づいて、リストされた顧客へ自動的にメールが送信されます。その前に、まずモジュールウィンドウを開いてVBAコードを入力する方法を見ていきましょう。

手順:
- まず、[開発]タブ >>> [Visual Basic] を選択します。
- または、Alt + F11キーを押すことでVBAウィンドウを表示することもできます。

- 次に、[挿入] >>> [標準モジュール] を選択します。

- これでモジュールウィンドウが表示され、ここにVBAコードを入力します。
- 続けて、以下のコードをモジュールウィンドウに入力してください。
Option Explicit
Sub Mail_Merge_Only_Excel()
Dim xSheet As Worksheet
Dim mAddress As String, mSubject As String, eName As String, _
eLocation As String, eCity As String
Dim eRow As Long, x As Long
Set xSheet = ThisWorkbook.Sheets("VBA1") 'WorkSheet Name
With xSheet
eRow = .Cells(.Rows.Count, 5).End(xlUp).Row
For x = 5 To eRow 'Specific Row to Row to Last Row
mAddress = .Cells(x, 3)
mSubject = "Thank You for Your Loyalty"
eName = .Cells(x, 2)
eCity = .Cells(x, 4)
eLocation = .Cells(x, 5)
Call Mail_Merge_Only_Excel_Send_Mail(mAddress, mSubject, _
eName, eLocation, eCity)
Next x
End With
End Sub
Sub Mail_Merge_Only_Excel_Send_Mail(mAddress As String, mSubject As String, _
eName As String, eLocation As String, eCity As String)
Dim pApp As Object
Dim pMail As Object
Set pApp = CreateObject("Outlook.Application")
Set pMail = pApp.CreateItem(0)
With pMail
.To = mAddress
.CC = ""
.BCC = ""
.Subject = mSubject
.Body = "Mr./Mrs. " & eName & vbNewLine & eCity & vbNewLine & eLocation & _
vbNewLine & vbNewLine & "Hello! " _
& "You are one of the most precious customers to us for the last quarter. " _
& "As a token of appreciation, we are sending you 20$ coupon code for your " _
& "next purchase at ExcelDemy. " _
& "Use the coupon code 'ExcelDemy20' to avail of this discount." _
& vbNewLine & "From," & vbNewLine & "ExcelDemy Team"
.Send
End With
Set pMail = Nothing
Set pApp = Nothing
End Sub

VBAコードの解説
- まず、最初のSubプロシージャ「Mail_Merge_Only_Excel」を呼び出しています。
- 次に、変数の型を宣言し、「VBA1」を作業対象のワークシートとして設定します。
- そして、最終行の行番号を取得します。値は5行目から始まるため、コードでは5行目から最終行までの範囲を指定しています。
- その後、2つ目のSubプロシージャ「Mail_Merge_Only_Excel_Send_Mail」を呼び出します。
- 次に、Outlookをメールアプリケーションとして選択しています。
- そして、コード内でメール本文を設定します。さらに、vbNewLineを使用してメール本文中に改行を挿入しています。
- 最後に、「.Send」を使用してメールを送信します。これにより、手動で「送信」ボタンを押す必要がありません。なお、「.Display」に置き換えると、送信せずにメールを表示することもできます。
- その後、モジュールを保存します。
- 次に、カーソルを最初のSubプロシージャ内に置き、[実行(Run)]を押します。
- もしOutlookアプリにログインしていなければ、ログイン情報の入力を求められます。すでにログイン済みの場合は、追加の手順なくメールが送信されます。

- 最後に、下のスクリーンショットのように、差し込み印刷が意図どおりに動作し、Wordを使わずにExcelのみで実行できることが確認できます。

関連記事: ExcelからOutlookへの差し込み印刷の簡単な手順
方法2: 選択範囲を指定してWordなしで差し込み印刷する
最後の方法では、データセットを少し変更しました。「氏名(Name)」「メールアドレス(Email Address)」「本文(Text)」の3列で構成されています。今回は別のVBAコードを使って、Excelのみで差し込み印刷を実行します。今回のポイントは、InputBoxメソッドを使って送信先のメールアドレスと本文を選択できる点です。さらに、Outlookアプリケーション上で差し込み印刷の結果を表示し、ボタンをクリックして手動で送信します。メール本文は全顧客共通です。それでは、手順を見ていきましょう。

手順:
- まず、方法1と同様の手順でモジュールウィンドウを開き、以下のコードを入力します。
Public Sub Mail_Merge_Without_Word_Input_Box()
'Declare the variables
Dim XRcptsEmail As Range
Dim xMailContent As Range
Dim xRngDn As Range
Dim xCrtOut As Object
Dim xValSendRng As String
Dim k As Long
Dim xMailSections As Object
Dim xFinalRw As Long
Dim CrVbLf As String
Dim xMsg As String
On Error Resume Next
'Insert a input box for selecting the recipients
Set XRcptsEmail = Application.InputBox("Choose the column for the email" _
& "addresses of the recipients:", "ExcelDemy", , , , , , 8)
If XRcptsEmail Is Nothing Then Exit Sub
'To enter the text mail, insert a input box
Set xMailContent = Application.InputBox("In your email," _
& "choose the column with the text:", "ExcelDemy", , , , , , 8)
If xMailContent Is Nothing Then Exit Sub
'Count rows for the recipient email
xFinalRw = XRcptsEmail.Rows.Count
Set XRcptsEmail = XRcptsEmail(1)
Set xMailContent = xMailContent(1)
'Set command to open MS Outlook Application
Set xCrtOut = CreateObject("Outlook.Application")
'Apply For loop to conduct the operation in each row one by one
For k = 1 To xFinalRw
xValSendRng = Cells(XRcptsEmail.Offset(k - 1).Row, _
XRcptsEmail.Offset(k - 1).Column - 1)
'Create the subject, body and text contents with the required variables
CrVbLf = "<br><br>"
xMsg = "<HTML><BODY>"
xMsg = xMsg & "Dear " & xValSendRng & CrVbLf
xMsg = xMsg & "" & xMailContent.Value & CrVbLf
xMsg = xMsg & "</BODY></HTML>"
'Create the email
Set xMailSections = xCrtOut.CreateItem(0)
'Define the position to place the Subject, Body and Recipients Address
With xMailSections
.Subject = "Congratulations!!!"
xValSendRng = Cells(XRcptsEmail.Offset(k - 1).Row, _
XRcptsEmail.Offset(k - 1).Column)
.To = xValSendRng
.HTMLBody = xMsg
.Display
End With
Set xMailSections = Nothing
Next
Set xCrtOut = Nothing
End Sub

VBAコードの解説
- まず、Subプロシージャ「Mail_Merge_Without_Word_Input_Box」を呼び出しています。
- 次に、変数の型を宣言します。
- その後、2つのInputBoxを使用して、宛先メールアドレスとメール本文の内容を取得します。
- 続けて、行数をカウントします。
- 次に、For Nextループを使ってすべての行を順番に処理し、VBAのOffsetプロパティを利用して、1列左から顧客名を抽出します。
- 最後に、Displayメソッドでメールをプレビュー表示します。代わりにSendメソッドを使えば、メールを直接送信することも可能です。
- その後、モジュールを保存します。
- 次に、カーソルを最初のSubプロシージャ内に置き、[実行(Run)]を押します。

- するとコードが実行され、宛先メールアドレスとメール本文を選択するよう求められます。
- 次に、メールアドレスのセル範囲C5:C8を選択して[OK]を押します。

- 続けて、メール本文が入力されているセルD5を選択して[OK]を押します。

- すると、Outlookアプリケーションのウィンドウが4つ表示されます。

- 最後に、[送信(Send)]を押せばメールを送信できます。

- こちらが、このVBAコードによる差し込み印刷の成功時の出力結果です。

関連記事: 添付ファイル付きでExcelからOutlookへ差し込み印刷する方法(2つの例)
練習セクション
各手法ごとの練習用データセットをExcelファイルに収録しています。そのため、読者の皆様も本記事の手順に沿って簡単に練習することができます。

まとめ
この記事では、WordなしでExcel上の差し込み印刷を実現する2つのVBAマクロをご紹介しました。これらの方法について不明な点がある場合や、フィードバックがありましたら、ぜひ下のコメント欄でお知らせください。また、当サイトExcelDemyでは、その他のExcel関連記事も多数掲載しております。お読みいただきありがとうございました。それでは、快適なExcelライフを!
関連記事
- Excelから差し込み印刷文書にデータを入力するマクロ
- Excelの差し込み印刷で日付形式を変更する方法(クイック手順付き)
- Excelファイルを宛名ラベルに差し込む方法(簡単な手順付き)
- ExcelからWordの封筒への差し込み印刷(2つの簡単な方法)
- ExcelからWordへ画像を差し込み印刷する方法(2つの簡単な方法)
-
ExcelでXMLを列に変換する4つの方法|初心者でもできる完全ガイド
このチュートリアルでは、ExcelでXMLデータを列に変換する4つの実用的な方法をご紹介します。いずれの方法も大規模なデータセットに対応しており、XMLデータから必要な値を効率よく抽出できます。さらに、本記事で解説するツールやテクニックは、その他のExcel作業全般にも役立つ内容となっています。 練習用ワークブックはこちらからダウンロードできます。 ExcelでXMLを列に変換する4つの方法 手順を分かりやすく説明するため、比較的シンプルなXMLデータセットを使用します。データセットは約7行×2列で構成され、すべてのセルは初期状態で「標準」形式に設定されています。列は「サイトURL」と「日付」
-
ExcelでCSVファイルを結合する2つの簡単な方法【コマンドプロンプト・Power Query】
CSVファイル(カンマ区切り値ファイル)は、表形式のデータを保存できるテキスト形式のファイルです。メモ帳などのテキストエディタや、Microsoft Excelのような表計算ソフトで開くことができます。CSVファイルは、異なるソフトウェア間でデータをやり取りする際によく利用されています。複数のCSVファイルを結合(マージ)することで、1つにまとめることも可能です。この記事では、ExcelでCSVファイルを結合する2つの簡単な方法をわかりやすく解説します。シンプルかつ手軽にCSVファイルをまとめたい方にとって、きっと役立つ内容となっています。 説明を分かりやすくするため、T20ワールドカップに出