【応用編】エクセルVBAでメール自動作成!複数添付のやり方を徹底解説!

コピペで使えるコード集

これまで、エクセルVBAを使ったOutlookのメールを自動作成する方法と、応用編として添付ファイル付きのメール作成の方法を紹介してきました。

読者の方からコメント頂いたので、今回はさらに応用編として、複数の添付ファイル付きのメール作成する方法を紹介します!

今回はVBAを変更して対応する方法はもちろんですが、マクロを変更せずに対応する方法も併せて紹介します。VBAを使わずとも、工夫によって業務が効率化できることもとても多いです。色々なパターンを考えるきっかけとして、ぜひともこの記事を参考にしてみてください。

【結論】複数ファイルの添付を行う2つの方法

①VBAコードを修正する

まず紹介するのは、複数添付に対応したVBAコードです。

前回作成したVBAを修正し、複数の添付ファイルに対応させています。8列目以降に記載された複数のファイルパスを読み込み、それぞれを添付ファイルとして追加しています。

Sub SendEmail_Attachment()
    Dim olApp As Outlook.Application
    Dim olMail As Outlook.MailItem
    Dim ws As Worksheet
    Dim lRow As Long, i As Long, j As Long
    Dim strTo As String, strCC As String, strSub As String, strBody As String
    Dim strAttachment As String

    ' Outlookのインスタンス取得(すでに起動していればそれを使う)
    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")
    If olApp Is Nothing Then
        Set olApp = New Outlook.Application
    End If
    On Error GoTo 0

    ' メール送信リストが記載されたシートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1")

    ' 最終行を取得
    lRow = ws.Cells(Rows.Count, 1).End(xlUp).Row

    ' 1行ずつデータを取得し、メールを送信
    For i = 2 To lRow
        ' 宛先・CC・件名・本文を取得
        strTo = ws.Cells(i, 1).Value
        strCC = ws.Cells(i, 2).Value
        strSub = ws.Cells(i, 3).Value
        strBody = ws.Cells(i, 4).Value & vbCrLf _
                  & ws.Cells(i, 5).Value & vbCrLf _
                  & ws.Cells(i, 6).Value & vbCrLf _
                  & ws.Cells(i, 7).Value

        ' メール作成
        Set olMail = olApp.CreateItem(olMailItem)
        With olMail
            .To = strTo
            .CC = strCC
            .Subject = strSub
            .Body = strBody

            ' 添付ファイル ※前回からの変更点
            For j = 8 To ws.Cells(i, Columns.Count).End(xlToLeft).Column
                strAttachment = ws.Cells(i, j).Value
                If strAttachment <> "" And Dir(strAttachment) <> "" Then
                    .Attachments.Add strAttachment
                End If
            Next j

            .Display ' メールを表示(自動送信する場合は .Send に変更)
            '.Send
        End With

        ' メモリ解放
        Set olMail = Nothing
    Next i

Cleanup:
    Set olApp = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbExclamation
    Resume Cleanup
End Sub

「 ‘ 添付ファイル ※前回からの変更点」とコメントしている部分が、前回から変更になっている点になります。

使い方については、この後詳しく説明します。

【番外】そのまま使えるエクセルファイル

今回もVBAが分からないという方向けに、VBAが入ったエクセルファイルを用意しました。ここに内容を書き込むだけで、簡単にメールが自動作成できます。

PCによっては「参照設定の追加」が必要となることがあります。エラーが出る場合は、この記事で紹介している「参照設定の追加」を試してください。

※ウイルスではもちろんありませんが、マクロ付きのため、自己責任でお願いします。

②マクロをいじらずに複数添付

VBAコードを一切いじらずに複数ファイルを一括送信する方法として、1つのフォルダにまとめてzipファイル化するというやり方もあります。具体的には、以下の手順です。

ステップ1:フォルダにファイルをまとめる

新しくフォルダを作成し、そこに添付したい複数のファイルをまとめます。

ステップ2:右クリック → zipで圧縮

作ったファイルをzip形式で圧縮します。

作ったフォルダを右クリック→「圧縮先」→「zipファイル」でzip形式で圧縮することができます。

ステップ3:zipファイルのパスを入力する

あとは前回と同様、添付ファイル欄にzipファイルのパスを張り付ければ、添付ファイル付きメールが作成できます。

この方法なら、既存のVBAコードでそのまま送信が可能です。

相手先のセキュリティの問題や、様々な事情で直接貼り付ける必要がある場合もあると思います。ですが、工夫によってコードを変えなくていいこともあります。こういった工夫も、作業の前に一度立ち止まって考えてもらえればと思います。

メール自動作成VBAの動作

ここからは複数添付に対応したVBAコードの紹介を行います。

コードを実行すると、前回同様リストをもとにOutlookのメールが自動作成されます。

今回のコードでは添付の数が違っていても、書かれているファイルが添付されるコードになっています。添付なしでも問題はありません。なお、フォーマットの添付は5つだけですが、それ以上でも動作します。

メール自動送信VBAの使い方

ここからはVBAのコピペ方法を含めて、使い方を紹介します。ここでは前回との変化点である、エクセルフォーマットの内容のみを紹介します。

それ以外のコードの埋め込みやトラブルシューティングなどに関しては、前回の記事を参照してください。

エクセルの準備(項目設定・to/cc/本文/添付の入力)

エクセルのシートのタイトルは以下の形で入力してください

・A列:宛先(To)
・B列:CC
・C列:件名
・D列:会社名
・E列:担当者
・F列:本文
・G列:署名

H列~I列:添付①~添付⑤

直接この名前をVBAで認識はしていません。ただ、リスト入力の間違い防止になるため、この内容で入力してください。

【応用編】前回コードとの変化点について

前回紹介した添付が一つの時のコードからの変化点について解説します。

まずこちらが前回のコードです。

' 添付ファイルパス(8列目に記載されている場合)
strAttachment = ws.Cells(i, 8).Value

……

' 添付ファイルがある場合に追加
If strAttachment <> "" And Dir(strAttachment) <> "" Then 
 .Attachments.Add strAttachment 
End If

このコードでは、エクセルの8列だけを見て、文字があれば添付ファイル付きのメールを作っています

具体的にはまず、strAttachmentという変数に、8列目の文字列を入れています。そして、その変数の中が空(8列目が空欄)の場合は、「.Attachments.Add str Attachment」という動作をスキップする。空欄でなければ動作を行うという分岐を行っています。

これをしないと何も添付するものがないのに、vbaは添付メールを作ろうとしてしまい、エラーとなってしまいます。

このように前回は、このように8列目だけを確認していました。ただ今回は8列目以降もアドレスが入るので、ループ処理を使って複数添付できるように変更しています。

' 添付ファイル ※前回からの変更点
For j = 8 To ws.Cells(i, Columns.Count).End(xlToLeft).Column
   strAttachment = ws.Cells(i, j).Value
   If strAttachment <> "" And Dir(strAttachment) <> "" Then
     .Attachments.Add strAttachment
   End If
Next j

これにより、8列目が空欄の場合添付なし、8列名以降に文字があれば書かれている数分添付を行うようになりました。

なお、変数・ループ処理など、用語についても別記事で紹介しています。この解説がわからなかった方は、そちらもぜひ参考にしてみてください!

おわりに

今回は、エクセルVBAを使ってOutlookメールに複数ファイルを添付する方法をご紹介しました。

今回紹介したやり方ですが、zipは受け取る側が手間になってしまいますし、コード編集はコードの書き換えに手間がかかってしまいます。どちらもメリットデメリットがあるやり方ですので、ぜひ両方できるようになって、効率的な方法を試してみてほしいと思います。

今回の記事をきっかけに、vbaでの効率化はもちろんですが、vba以外の方法を考えるきっかけにしてもらえれば幸いです!

このブログでは、ほかにも様々な効率化に関する情報を発信していますので、他の記事も参考にして効率的に業務を行ってほしいと思います!

コメント

タイトルとURLをコピーしました