【Excel】メルマガを自動作成する

複数宛先への個別メールを自動作成するExcelファイルを作成してみました。
画像添付にも対応しています。

このエクセルファイルの作り方

①マクロを使えるようにする
マクロを使えるようにする」を参照

②ボタンを配置する
 ※ ボタンの配置方法は「表を複数の条件で絞り込む②」を参照

③ボタン配置時の以下の画面で「マクロ名」を「CreateEmail」として「新規作成」を押す

④ 「Microsoft Visual Basic for Applications」にて以下のコードを記載

Sub CreateEmail()

    Dim oApp       As Object
    Dim objMAIL    As Object
    
    Dim subjectBodyWorksheet As Object: Set subjectBodyWorksheet = ThisWorkbook.Worksheets("件名・本文")
    Dim subject As String: subject = subjectBodyWorksheet.Cells(1, 2).Value
    Dim body As String: body = subjectBodyWorksheet.Cells(2, 2).Value
    Dim mailMagazinePath As String: mailMagazinePath = subjectBodyWorksheet.Cells(3, 2).Value
    
    Dim firstRow As Long: firstRow = 2
    Dim lastRow As Long: lastRow = ThisWorkbook.Worksheets("宛先リスト").Cells(Rows.Count, 1).End(xlUp).Row
    Dim nameRow As Integer: nameRow = 1
    Dim mailAddressRow As Integer: mailAddressRow = 2
    
    '画像コピー
    Dim picture As shape: Set picture = CopyPicture(mailMagazinePath)
    
    '宛先分繰り返し
    For y = firstRow To lastRow
        Dim addressListWorksheet As Object: Set addressListWorksheet = ThisWorkbook.Worksheets("宛先リスト")
        
        '氏名とメールアドレス取得
        Dim name As String: name = addressListWorksheet.Cells(y, nameRow).Value
        Dim mailAddress As String: mailAddress = addressListWorksheet.Cells(y, mailAddressRow).Value
        
        'メールアドレス列がからの場合は飛ばす
        If mailAddress = "" Then
           GoTo Continue
        End If
        
        'メールオブジェクト生成
        On Error Resume Next
        Set oApp = GetObject(, "Outlook.Application")
        On Error GoTo 0
        If oApp Is Nothing Then
           Set oApp = CreateObject("Outlook.Application")
           oApp.GetNamespace("MAPI").GetDefaultFolder(6).display
        End If
        Set objMAIL = oApp.CreateItem(0)
        
        '変数の置換
        Dim adjustBody As String: adjustBody = body
        adjustBody = Replace(adjustBody, "&Name", name)
        
        '各メールの要素をセットして表示
        With objMAIL
           .To = mailAddress
           .subject = subject
           .body = adjustBody
           .BodyFormat = 3
           .display
        End With
        
        '最終位置を取得して画像を貼り付け
        If Not (picture Is Nothing) Then
            Dim endPosition As Integer: endPosition = objMAIL.GetInspector.WordEditor.Characters.Count - 1
            oApp.ActiveInspector.WordEditor.Range(endPosition, endPosition).Paste
            Application.CutCopyMode = True
        End If
        
        '★自動で送信したい場合は↓の「'」を外してください★
        'objMail.Send
     
Continue:
    Next y
    
    '画像シートの画像を削除
    If Not (picture Is Nothing) Then
        picture.Delete
    End If
     
    Set objMAIL = Nothing
    Set oApp = Nothing
End Sub

Function CopyPicture(ByVal mailMagazinePath As String) As shape

    
    If mailMagazinePath = "" Then
       Exit Function
    End If
    

     '画像を画像シートに配置
    Dim picture As shape: Set picture = ThisWorkbook.Worksheets("画像").Shapes.AddPicture(Filename:=mailMagazinePath, _
                                                                    LinkToFile:=True, _
                                                                    SaveWithDocument:=False, _
                                                                    Left:=Selection.Left, _
                                                                    Top:=Selection.Top, _
                                                                    Width:=0, _
                                                                    Height:=0)
                                                                    
    '画像を元のサイズにしてコピー
    With picture
        .ScaleHeight 1, msoTrue
        .ScaleWidth 1, msoTrue
        .Copy
    End With
    
    Set CopyPicture = picture

End Function