【WSH】VBA, VBSでメール送信を自動化！ VBでoutlookを操作する！！

#1：はじめに
VBA、VBSにてメールを自動作成・送信することができます。
VBA, VBSなんてよく分からない、プログラミングなんて難しく感じる等あるとは思いますが、メール作成スクリプトのコードには誰でも使用することができる分かりやすいテンプレートがありますので、それをちょっとイジるだけで誰でも簡単にVBA、VBSを作成することができます。

#2.：概要
##2.1：概要 - VBAを使用してのメールの自動作成・送信
Excel VBAを使用してのメールの自動作成・送信を実現します。
予め『To』『本文』等をExcelシートに記入しておき、それを基にメールを作成してくれるVBAを作ります。

##2.2：概要 - VBSを使用してのメールの自動作成・送信
VBSを使用してのメールの自動作成・送信を実現します。
タスクスケジューラ等に登録しておくことで定期的にメールの自動作成・送信をしてくれます。

#3：VBAを使用してのメールの自動作成・送信
##3.1：事前準備
まずはExcelを起動し、マクロが使えるように<b>［ファイル］</b>-<b>［名前を付けて保存］</b>から拡張子をxlsmに変更します。
その後、<b>『Alt』</b>+<b>『F11』</b>をクリックし、VBエディタを開きます。
VBエディタ左ペイン、<b>［<ワークブック名>］</b>-<b>［標準モジュール］</b>を右クリックし、<b>［挿入］</b>-<b>［標準モジュール］</b>クリック。
<b>『Module1』</b>モジュールが作成されたことを確認します。
##3.2：参照設定
VBエディタにて、[メニュー] - [参照設定]をクリックし、参照設定の画面が表示されたことを確認します。
<b>【Microsoft Outlook XX.X Object Library】</b>にチェックを付けます。
画面右上の[OK]をクリックし、設定を反映させます。
##3.3：テンプレートシートの作成
Excelシートを以下のように編集します。
<b>●『Sheet1』</b>
『To』や『cc』等のメール作成に必要な情報を予めExcelシートに作成しておきましょう。
以下のように『Sheet1』にテンプレートを作成しておきましょう。
![vba_macro_tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/afa3af9f-6187-5ee6-33f3-aba9e4b2e7d5.png)

<b>●『Sheet2』</b>
メールには表を挿入することができます。
予め以下のように『Sheet2』にExcel表を作成しておきましょう。
![メール自動送信マクロ_シート2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/8f285874-cdd1-0298-280f-70a976bb9b38.png)

##3.4：マクロコード
『Module1』モジュールに以下コードを貼り付けます。
※必要に応じてパラメーターを変更してください

```vb:create_mail_by_vba
'----- メール自動作成スクリプト -----
Sub send_mail_macro()
    
    '--- 宣言 ---
    Dim Appobj As Object
    Dim objMAIL As Object
    Dim ws_sheet_tmp As Worksheet
    Dim ws_sheet_table As Worksheet
    Dim date_today As Date
    Dim body_mail
    Dim cregit_mail
    
    '--- 日付宣言 ---
    date_today = Format(Date, "yyyy/m/d")
    date_today_fm_yyyymmdd = Format(Date, "yyyy年m月d日")
    
    '--- オブジェクト生成 ---
    Set Appobj = CreateObject("Outlook.Application")
    Set objMAIL = Appobj.CreateItem(0)
    
    '--- シート挿入 ---
    Set ws_sheet_tmp = ThisWorkbook.Worksheets("Sheet1")
    Set ws_sheet_table = ThisWorkbook.Worksheets("Sheet2")
    
    '--- メール作成 ---
    With objMAIL
    
        '--- 書式形式 ---
        '// ｢1｣ =『テキスト』. ｢2｣ =『HTML』, ｢3｣ =『リッチテキスト』
        .bodyformat = 2
        
        '--- 送信元 ---
        .SentOnBehalfOfName = ws_sheet_tmp.Range("D2").Value
        
        '--- 宛先 ---
        .To = ws_sheet_tmp.Range("D3").Value
        
        '--- CC ---
        .CC = ws_sheet_tmp.Range("D4").Value
        
        '--- BCC ---
        .BCC = ws_sheet_tmp.Range("D5").Value
        
        '--- 件名 ---
        .Subject = ws_sheet_tmp.Range("D7").Value
        .Subject = Replace(.Subject, "$o_today", date_today)
        
        '--- outlookを表示する ---
        .Display
        
        '--- 本文 ---
        With objMAIL.GetInspector.WordEditor.Windows(1).Selection
            
            '--- メール本文作成 ---
            body_mail = ws_sheet_tmp.Range("D8").Value
            table_name = ws_sheet_table.Range("A1").Value
            cregit_mail = ws_sheet_tmp.Range("D9").Value
            
            '--- 本文内変数の置換
            ws_sheet_tmp.Range("D8").Value = Replace(ws_sheet_tmp.Range("D8").Value, "$fo_today", date_today_fm_yyyymmdd)
            
            '--- 本文の書式設定
            .Font.Name = "遊ゴシック"
            .Font.Size = "11"
            
            '--- 本文作成 ---
            .TypeText ws_sheet_tmp.Range("D8").Value & Chr(13) & Chr(13)
            
            '--- セルデータ作成 ---
            .TypeText table_name & Chr(13)
            ws_sheet_table.Range("A3:F17").CopyPicture
            .Paste
            .TypeText vbCrLf & vbCrLf & vbCrLf
            
            '--- 署名作成 ---
            .TypeText ws_sheet_tmp.Range("D9").Value
            
            '--- 添付ファイル用の改行 ---
            .TypeText vbCrLf & vbCrLf
            
        End With
        
        '--- ファイル添付 ---
        .Attachments.Add ws_sheet_tmp.Range("D10").Value
        .Attachments.Add ws_sheet_tmp.Range("D11").Value
        
        '--- メール送信 ---
        '.Send
        
    End With
    
    '--- オブジェクト解放 ---
    Set objMAIL = Nothing
    Set Appobj = Nothing
    
End Sub

```

##3.5：動作確認
VBエディタで対象のモジュールが開かれていることを確認したら、<b>『F5』</b>を押打してマクロを実行します。
受信先に設定したメールアドレス宛にメールが送れていることを確認してください。

#4：VBSを使用してのメールの自動作成・送信
##4.1：スクリプト作成
Windows左下の<b>『スタート画面』-『Windowsアクセサリ』-『メモ帳』</b>を開きます。
メモ帳に以下コードを貼り付けます。

```vb:create_mail_by_vbs
Option Explicit

'-----------------------------------------
'-- 宣言
'-----------------------------------------
Dim mailAddress
Dim mailTo
Dim mailCc
Dim MailApp
Dim mailobj
Dim mailBody
Dim mailSubject
Dim mailAttachment
Dim timeZone
Dim byLine
Dim kaigyo


'-----------------------------------------
'-- 個人情報
'-----------------------------------------
'// 自分のメールアドレス
mailAddress = "****.*****@****.***"

'// 送信先：TO
mailTo = "****.*****@****.***"

'// 送信先：CC
mailCc = "****.*****@****.***"


'-----------------------------------------
'-- オブジェクト生成
'-----------------------------------------
Set MailApp = CreateObject("Outlook.Application")
Set mailobj = MailApp.CreateItem(0)

'// 改行コード
kaigyo = vbCrLf


'-----------------------------------------
'-- 件名
'-----------------------------------------
mailSubject = "テストメール_"
mailSubject = mailSubject & Year(Date) & "/" & Right("0" & Month(Date), 2) & "/" & Right("0" & Day(Date), 2)


'-----------------------------------------
'-- 本文
'-----------------------------------------
mailBody = "送信テスト" & kaigyo
mailBody = mailBody & "本メールはQiita記事【【WSH】VBA, VBSでメール送信を自動化！ VBでoutlookを操作する！！】でのテストメールです。" & kaigyo & kaigyo
mailBody = mailBody & "メールが受信できているか確認してください。" & kaigyo
mailBody = mailBody & "確認できない場合は、再度スクリプトを実行してください" & kaigyo & kaigyo


'-----------------------------------------
'-- 署名
'-----------------------------------------
'// 署名設定
byLine = "----------------------------------------------" & kaigyo
byLine = byLine & "名前：*** ****" & kaigyo
byLine = byLine & "会社：*************" & kaigyo
byLine = byLine & "TEL：***-****-****" & kaigyo
byLine = byLine & "Mail：***.****@**.***" & kaigyo
byLine = byLine & "----------------------------------------------" & kaigyo

'// 署名を本文に追加
mailBody = mailBody & byLine


'-----------------------------------------
'-- 添付ファイル
'-----------------------------------------
'mailAttachment = "ファイルフルパス"


'-----------------------------------------
'-- メール作成
'-----------------------------------------
mailobj.To = mailTo
mailobj.Cc = mailCc
mailobj.Subject = mailSubject
mailobj.Body = mailBody
'mailobj.Attachments.Add mailAttachment
mailobj.Display
'mailobj.Send


'-----------------------------------------
'-- オブジェクト開放
'-----------------------------------------
Set mailobj = Nothing
Set MailApp = Nothing

WScript.Quit 0

```

スクリプトを貼り付けたら、<b>『ctrl』+『s』</b>でファイルを以下拡張子にリネームし、文字コードを『SJIS』に変更をし、任意のパスに保存してください。
※スクリプト名は任意の名前を指定して下さい

<b><拡張子></b>
'===========================
<b>・変更前 ⇒ ***.txt
・変更後 ⇒ ***.vbs</b>
'===========================
<b><文字コード></b>
'===========================
<b>・変更後 ⇒ SJIS（ANSI）</b>
'===========================

##4.2：動作確認
ファイルをダブルクリックし、スクリプトを実行してください。
Outlookアプリケーションが立ち上がり、スクリプト記載の内容とおりの新規メールが作成されたことを確認してください。

#5：まとめ
定例作業で日報をメール送信する場合等、毎回メールを組み立てるのは面倒だと思いますので、本記事で紹介したなマクロ、及びスクリプトを作成しタスクスケジューラでジョブ設定し定期実行させることで、日々の定常作業を楽にしていきましょう。