【エクセルVBA】メール自動作成ツール

VBA

※本サイトはアフィリエイト広告を利用しています。

はじめに

今回ご紹介するのはメールを自動で作成するVBAです。

これを作ったときのクライアントさんの依頼としては
「社員宛てに個人の毎月の売り上げやら点数やらの個人の成績をメールしなければいけなくて、エクセルに個人の成績のデータ一覧はあるけどそれを毎月手作業でコピー&ペーストしてメール作るの大変なんです。」
とのことでした。

そりゃぁ大変だわ((((;゚Д゚))))

何人いらっしゃる会社なのかはお伺いしませんでしたが、100人とか居たらそうとう面倒そう。。。
それがボタン一つでサクッとできちゃうのがプログラムの強みです!
別の人のデータを貼り付け間違えて送っちゃったりもしないですしね。
人間はミスをする生き物なので。

話がそれますが、人間がミスをするのは仕方がないことです。人間ですから。
大事なのはミスをした人を責めることではなく、再発防止をすることなんですよね。
再発防止の方法としては
・ミスが発生しづらい仕組みを作る
・ミスを発見できる工程を入れる
の2通りの方法があります。
今回は、プログラムを利用して人間のミスが介在しないようにするので前者ですね^^

コードの紹介

それでは、メールの自動作成のコードを紹介していきます。
一気に送信までしてしまうと危険なので、一旦下書きを作成してから目視で確認してから送信ボタンを押してもらう、という方法になっています。

Public Const 宛先 As Long = 1
Public Const 氏名 As Long = 2
Public Const 点数 As Long = 3
Public Const 売上 As Long = 4
Public Const 添付キーワード As Long = 2

Sub Outlookメール一括作成()

   '***************変数の宣言***************
   Dim i As Long
   Dim LastRowNum As Long
   Dim mailBody As String
   
   
   'Outlookオブジェクトの作成
   Dim OutlookObj As Outlook.Application
   Set OutlookObj = CreateObject("Outlook.Application")
   
   
   LastRowNum = Cells(1, 1).End(xlDown).Row
   
   For i = 2 To LastRowNum
   
      'メール本文作成
      mailBody = CreateMailBody(i)
   
      'メールアイテムオブジェクト作成
      Dim mailItemObj As Outlook.MailItem
      Set mailItemObj = OutlookObj.CreateItem(olMailItem)
      
      'メール作成
      With mailItemObj
         'Toを設定
         .To = Cells(i, 宛先).Value
         '件名を設定
         .Subject = Range("J1").Value
         '本文を設定
         .Body = mailBody
      End With
      
      Dim keyword As String
      keyword = Cells(i, 添付キーワード)
      
      '添付ファイルオブジェクトの生成
      Dim attachObj As Outlook.Attachments
      Set attachObj = mailItemObj.Attachments
      
      'ファイルを添付する
      Call FileAttach(attachObj, keyword)
      
      '下書きを表示
      mailItemObj.Display
      'mailItemObj.Send  '送信
      
      Set mailItemObj = Nothing
   
   Next i

End Sub
 
Function CreateMailBody(i As Long) As String
 
   Dim Name As String, Point As String, Price As Long
   Dim Body As String
   
   'リストの値を取得
   Name = Cells(i, 氏名).Value
   Point = Cells(i, 点数).Value
   Price = Cells(i, 売上).Value
       
   'メール本文
   Body = Range("J2").Value '初期値を設定
   Body = Replace(Body, "(氏名)", Name)
   Body = Replace(Body, "(点数)", Point)
   Body = Replace(Body, "(売上)", Price)
   
   CreateMailBody = Body
 
End Function

Function FileAttach(attachObj As Object, keyword As String)
    
    Dim FilePath As String
    Dim FileName As String
    
    'ファイルが置いてあるフォルダのパスを取得
    FilePath = Range("I14")
    FileName = Dir(FilePath & "\" & "*")
    
    'フォルダ内の全ファイルに対して検索
    Do While FileName <> ""
        
        'キーワードを含むファイルが見つかったら、下書きアイテムに添付する
        If InStr(FileName, keyword) > 0 Then
            attachObj.Add FilePath & "\" & FileName
        End If
        
        FileName = Dir()
    Loop
    
    Set attachObj = Nothing
 
End Function

YouTubeでは1行ずつステップ実行しながら解説してます。

【エクセルVBA】メールの自動作成

手作業で1通ずつメールを作成して送るのに比べて、大幅に時間短縮になると思います。

フォントの変更

YouTubeの方のコメントで、文字のサイズや色の変更の仕方を知りたいというご質問をいただきましたので、フォントの変更の仕方の記事も作成しました。
よろしければこちらも併せてご覧ください!

ハイパーリンクを入れる方法

ハイパーリンクをメールに入れたいというご質問もいただきましたので、そちらもブログを書いてみました。

もう一件ご質問がありましたのでコードを紹介します。
全員に対して同じ添付ファイルを添付したいとのご質問です。

Sub Outlookメール一括作成()

   '***************変数の宣言***************
   Dim i As Long
   Dim LastRowNum As Long
   Dim mailBody As String
   
   
   'Outlookオブジェクトの作成
   Dim OutlookObj As Outlook.Application
   Set OutlookObj = CreateObject("Outlook.Application")
   
   
   LastRowNum = Cells(1, 1).End(xlDown).Row
   
   For i = 2 To LastRowNum
   
      'メール本文作成
      mailBody = CreateMailBody(i)
   
      'メールアイテムオブジェクト作成
      Dim mailItemObj As Outlook.MailItem
      Set mailItemObj = OutlookObj.CreateItem(olMailItem)
      
      'メール作成
      With mailItemObj
         'Toを設定
         .To = Cells(i, 宛先).Value
         '件名を設定
         .Subject = Range("J1").Value
         '本文を設定
         .Body = mailBody
      End With
      
      '添付ファイルオブジェクトの生成
      Dim attachObj As Outlook.Attachments
      Set attachObj = mailItemObj.Attachments
      
      'ファイルを添付する
      Dim FilePath As String
      FilePath = Range("I14")
      attachObj.Add FilePath
      
      '下書きを表示
      mailItemObj.Display
      'mailItemObj.Send  '送信
      
      Set mailItemObj = Nothing
   
   Next i

End Sub

‘ファイルを添付するの部分が変わっています。
I14セルに添付したいファイルのパスを入力しておいて、Range(“I14”)で添付したいファイルのパスを直接指定するという形になります。
ご参考になれば嬉しいです(^^)

Thunderbirdでのメールの作成方法

今回はOutlookを使ったメールの作成方法でしたが、Thunderbirdでもメールを作成することができます。
そちらの解説ブログも書きましたので、Thunderbirdをお使いの方はこちらをご参照ください!

コンピューターが得意な繰り返し作業はコンピューターに任せて、自分にしかできない仕事をしてほしい。
もしくは残業時間を減らして、自分にとって有意義なことに時間を使ってほしい!
そんな思いがあるので、この記事が少しでもどなたかのお役に立てると嬉しいです。

お問い合わせ、お仕事のご依頼などがありましたら下記のお問い合わせフォームからご連絡ください。
お問い合わせフォーム
VBAの作成であれば50,000円ほどから、自分で使うVBAの書き方で詰まっている方のお手伝いであれば10,000円ほどから承ります。

VBA
スポンサーリンク
スポンサーリンク
りこをフォローする
エクセルVBAの寺子屋

コメント

  1. misaki より:

    助かりました!ありがとうございます。

    • りこ より:

      お役に立てたようで幸いです(^^)
      コメントいただきありがとうございます!
      励みになるのでとても嬉しいです。

  2. おこたん より:

    はじめまして。
    部分的に日本語で書かれていて、素人の私にも、とてもわかりやすく感じます。
    業務に必要で、こちらのツールを使わせていただきたいのですが、
    複数持っている差出人アカウントのうち、どれか一つを指定する方法と、全員に同じ添付ファイルを送る場合の記述をご教示いただけませんでしょうか。
    宜しくお願い申し上げます。

    • りこ より:

      おこたんさん、コメントありがとうございます。
      調べてみたところ、アカウントを指定するコードがあるようです。
      「’Toを設定」の行の上に下記のコードを追加してみてください。
      ———————
      ‘アカウントを指定
      .SendUsingAccount = Session.Accounts(“使いたいメールアドレス”)
      ———————
      私が複数アカウントを使っていないので切り替えができるかを試せなかったのですが、使っているメールアドレスを入れて試してみたところエラーにはならなかったので大丈夫かと思います。

      • おこたん より:

        うわぁぁ
        早速、ご教示いただきまして、どうもありがとうございます!!
        試してみます!!

    • りこ より:

      全員に同じ添付ファイルを送る場合のコードについては、記事内に追記しましたのでご参照ください。
      ご参考になれば幸いです(^^)

      • おこたん より:

        こちらも、深謝です!!!!
        マクロを実行してみてから、改めてご報告させていただきます!!

      • おこたん より:

        差出人アカウント指定と、全員に同じ添付ファイルを送るマクロ、どちらも成功しました。
        素晴らしいです!! 感動です!! 本当にどうもありがとうございました!!!!

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