銀河鉄道

【VBA】Excelでメール内容を作成してOutlookを起動する

サムネイル
Excelでメール作成とOutlook起動
毎回同じメール
ラクに
送りたい

クラスモジュールの作成

MailOpenクラスを作る

固定部分をクラスモジュールに記述します

Option Explicit
Private objOutlook As Object
Private objMail As Object
Private Sub Class_Initialize()
    Set objOutlook = CreateObject("Outlook.Application")
    Set objMail = objOutlook.createitem(0)
End Sub
Public Sub Go( _
                                ByVal vTO As String, _
                                ByVal vCC As String, _
                                ByVal vSubject As String, _
                                ByVal vBody As String)
                                
    With objMail
        .To = vTO
        .cc = vCC
        .Subject = vSubject
        .body = vBody
        .display
    End With
End Sub

送信まですると危険なので、.displayで表示までにする

Excelシート3つにテーブルを作成する

次のテーブル名でテーブル作成

  1. tbl_body
    • ボディテーブル
    • 必要な行は、to, cc, subject, bodyFirst, bodyMain, bodyLast
    • 定型文はここに入力しておく
  2. tbl_input
    • 入力テーブル
    • ボディテーブルの中で、内容を書き換えたい部分の入力用
  3. tbl_history
    • 履歴テーブル
    • メール作成するたびに履歴を残す

ボディテーブル

入力テーブル

履歴テーブル

テーブルにすると、呼び出しや値の取得がラクになるから

標準モジュールの作成

Option Explicit
Option Private Module

'bodyテーブルの行列番号
Private Enum b
    rTO = 1
    rCC
    rSub
    rBody1
    rBody2
    rBody3
    col = 2
End Enum

'入力テーブルの行列番号
Private Enum i
    rSub1 = 1
    rSub2
    rName
    rText
    col = 2
End Enum

'履歴テーブルの行列番号
Private Enum h
    cDay = 1
    cTO
    cSub
    cTxt
End Enum

Private sub1 As String
Private sub2 As String
Private name As String
Private text As String

Private myTO As String
Private myCC As String
Private mySubject As String
Private myBody As String
Public Sub CreateEmail()
    '入力項目の取得
    GetInputItem
    
    '本文作成
    MakeBody
    
    'メールオープン
    Dim MailOpen As MailOpen: Set MailOpen = New MailOpen
    MailOpen.Go myTO, myCC, mySubject, myBody
    
    '履歴作成
    MakeHistory
End Sub
Private Sub GetInputItem()
    With Range("tbl_input")
        sub1 = .Cells(i.rSub1, i.col).Value
        sub2 = .Cells(i.rSub2, i.col).Value
        name = .Cells(i.rName, i.col).Value
        text = .Cells(i.rText, i.col).Value
    End With
End Sub
Private Sub MakeBody()
    Dim bodyFirst As String
    Dim bodyMain As String
    Dim bodyLast As String
    
    With Range("tbl_body")
        myTO = .Cells(b.rTO, b.col)
        myCC = .Cells(b.rCC, b.col)
        mySubject = .Cells(b.rSub, b.col)
        bodyFirst = .Cells(b.rBody1, b.col)
        bodyMain = .Cells(b.rBody2, b.col)
        bodyLast = .Cells(b.rBody3, b.col)
    End With
    
    '置き換え
    mySubject = Replace(mySubject, "★", sub1)
    mySubject = Replace(mySubject, "☆", sub2)
    bodyFirst = Replace(bodyFirst, "★", name)
    bodyMain = Replace(bodyMain, "★", text)
    
    '※bodyMainに定型文がない(置き換えしない)場合
    'bodyMain = text
    
    'きれいな改行にするために、いったんvblf → 最後にvbcrlfに置き換える
    myBody = bodyFirst & vbLf & vbLf & bodyMain & vbLf & vbLf & bodyLast
    myBody = Replace(myBody, vbLf, vbCrLf)
End Sub
Private Sub MakeHistory()
    With Range("tbl_hitstory")
        .Cells(.Rows.Count + 1, h.cDay).Value = Date
        .Cells(.Rows.Count + 1, h.cTO).Value = myTO
        .Cells(.Rows.Count + 1, h.cSub).Value = mySubject
        .Cells(.Rows.Count + 1, h.cTxt).Value = text
    End With
End Sub

【宛先のメールアドレスを毎回変更する場合】

  1. アドレス一覧テーブルを作成する
  2. 何らかの方法で一覧からアドレスを取得する
    • to欄にフィルタで選べるようにする
    • コードでループさせる
    • ユーザーフォームで選ぶ など

宛先ごとに別ファイルにして、宛先は固定にしてもいいかも

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧