はじめに
今回ご紹介するのはメールを自動で作成する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行ずつステップ実行しながら解説してます。
手作業で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をお使いの方はこちらをご参照ください!
コンピューターが得意な繰り返し作業はコンピューターに任せて、自分にしかできない仕事をしてほしい。
もしくは残業時間を減らして、自分にとって有意義なことに時間を使ってほしい!
そんな思いがあるので、この記事が少しでもどなたかのお役に立てると嬉しいです。
コメント
助かりました!ありがとうございます。
お役に立てたようで幸いです(^^)
コメントいただきありがとうございます!
励みになるのでとても嬉しいです。
はじめまして。
部分的に日本語で書かれていて、素人の私にも、とてもわかりやすく感じます。
業務に必要で、こちらのツールを使わせていただきたいのですが、
複数持っている差出人アカウントのうち、どれか一つを指定する方法と、全員に同じ添付ファイルを送る場合の記述をご教示いただけませんでしょうか。
宜しくお願い申し上げます。
おこたんさん、コメントありがとうございます。
調べてみたところ、アカウントを指定するコードがあるようです。
「’Toを設定」の行の上に下記のコードを追加してみてください。
———————
‘アカウントを指定
.SendUsingAccount = Session.Accounts(“使いたいメールアドレス”)
———————
私が複数アカウントを使っていないので切り替えができるかを試せなかったのですが、使っているメールアドレスを入れて試してみたところエラーにはならなかったので大丈夫かと思います。
うわぁぁ
早速、ご教示いただきまして、どうもありがとうございます!!
試してみます!!
全員に同じ添付ファイルを送る場合のコードについては、記事内に追記しましたのでご参照ください。
ご参考になれば幸いです(^^)
こちらも、深謝です!!!!
マクロを実行してみてから、改めてご報告させていただきます!!
差出人アカウント指定と、全員に同じ添付ファイルを送るマクロ、どちらも成功しました。
素晴らしいです!! 感動です!! 本当にどうもありがとうございました!!!!
お役に立てたようで良かったです!
ご報告ありがとうございます(^^)