[ExcelVBA]脱FAXの第一歩。複数宛先のメールメッセージを生成する方法 | 独学プログラマーHiroのパーツボックスblog

[ExcelVBA]脱FAXの第一歩。複数宛先のメールメッセージを生成する方法

複数宛先のメールを自動作成する記事のアイキャッチ画像 EXCEL
スポンサーリンク

皆さんはFAXで見積もり依頼などを複数宛先に一斉送信していませんか?

実は私もつい最近までFAXを使っていました。

メールで複数の業者に相見積もりする場合、宛先に競合する会社のメールアドレスを複数設定することは難しいです。BCCで送れば良いかもしれませんが、それも失礼に当たるかと思っていました。

複数の宛先宛に個別にメールを作成するのも手動だと結構手間がかかります。

今回は同じ内容で複数宛先のOutLookメールメッセージを自動的に生成するExcelVBAを紹介します。

見積もり用の仕様で作成していますが、内容を変更すれば見積もり以外にも使えますのでご活用ください。

プログラムの仕様

  • 選択された宛先リスト内のメールアドレスと会社名と担当者名を差し込んでメールを作成する
  • 件名、文頭、本文、文末に分けて入力セルを用意して変更する必要がある部分と定型部分は分ける
  • 今日から何日後までに回答してもらいたいかを自動計算する(土曜と日曜になる場合には翌月曜にする)
  • 件名に通し番号を付加する(今日の日付-通し番号の形式)
  • 共通で貼り付ける添付ファイルがあるかをメッセージボックスで確認し、ある場合にはファイルダイアログで選択する。(複数選択可能)
  • ファイルダイアログで開くフォルダを指定できるようにする
  • LOGのシートに作成したメールの「通し番号」と「送付先」と「内容(見積もり内容)」の履歴を記録する

エクセルファイルの用意

エクセルにメールを作成するための情報を入力するシートを用意します。

シート名を「メイン」に変更しておいてください。

見積もり用シート上側の画像

件名情報はB2セル、文頭の定型部分をB3セル、本文(内容変更する部分)をB4セルに入力できるようにします。

通し番号の情報をE1~H1までに記録するセルを用意します。

回答納期用としてB4セルに何日後に設定するかを入力するセルを用意します。


D4セルには下の数式を入力すると回答納期の日付が計算されるようになります。(土曜と日曜になる場合には翌月曜日となります)

=IF(WEEKDAY(TODAY()+$B$4,2)=6,TODAY()+$B$4+2,IF(WEEKDAY(TODAY()+$B$4,2)=7,TODAY()+$B$4+1,TODAY()+$B$4))
D4セルの数式の画像

E4セルには下の数式を入力しておきます。回答納期の情報をメール本文に貼り付ける文字列として用意しています。

="回答希望:"&TEXT(D4,"yyyy/mm/dd")
E4セルの数式の画像

B5セルに文末の定型の情報を入力するセルを用意します。署名などを記述します。

入力用シートの下の部分の画像

B6セルには添付ファイルを選択するファイルダイアログで開きたいフォルダパスを入力するセルを用意します。

A9~D9セル以降は宛先のメールアドレスや会社名、担当者名を入力する宛先一覧表を用意します。


つづいて、新しいシートを追加してシート名を「LOG」に変更してください。

A1セルに「通し番号」、B1セルに「送付先」、C1セルに「内容」を入力してください。

LOGシートの画像

自動でメールを作成したらLOGシートに履歴が自動的に記録されるようにします。

ここまで出来たらファイルを名前を付けて保存してください。拡張子はマクロを含むことができる「.XLSM」にしてください。

VBAプログラムコードの用意

開発タブの中の挿入からコントロールフォームのボタンを選択後、A7~A8セルをドラッグアンドドロップでボタンを配置します。

ボタン配置の画像

ドラッグアンドドロップ後、マクロの新規登録ウィンドウが表示されますので、マクロの保存先を先ほど保存したファイル名を選択してください。マクロ名はボタン1_Clickのままで新規作成ボタンを押してください。

マクロ登録の画像

新規ボタンを押したら自動的にVBEが起動しますので、ボタン1_Click()の部分を削除し、下記コードをコピーして貼り付けてください。

Sub ボタン1_Click()
  Dim MAINROW As Long
  Dim TOUSHI_STR As String
  Dim LOGROW As Long
  
  Dim OL As Outlook.Application
  Dim MI As Outlook.MailItem
  
  Dim RET As Long
  Dim SENDFILEPATH As Variant
  
  Set OL = CreateObject("Outlook.Application")
  
  LOGROW = 1
  Do Until Worksheets("LOG").Cells(LOGROW, 1).Value = ""
    LOGROW = LOGROW + 1
  Loop
  
  OPENFOLDER = Worksheets("メイン").Range("B6").Value
  If OPENFOLDER <> "" Then
    If Dir(OPENFOLDER, vbDirectory) <> "" Then
      If InStr(OPENFOLDER, "\\") > 0 Then
        'ネットワーク上
        With CreateObject("WScript.Shell")
          .CurrentDirectory = OPENFOLDER
        End With
      Else
        'ローカル
        ChDir (OPENFOLDER)
      End If
    End If
  End If
  
  '添付ファイル
  RET = MsgBox("ファイルを添付しますか?", vbYesNo)
  If RET = 6 Then
    SENDFILEPATH = Application.GetOpenFilename(, , "添付するファイルを選択してください", MultiSelect:=True)
    If Not IsArray(SENDFILEPATH) Then
      RET = 7
    End If
  End If
  
  With Worksheets("メイン")
    '通し番号
    If .Range("F1").Value = Date Then
      .Range("H1").Value = .Range("H1").Value + 1
      TOUSHI_STR = CStr(Date) & "-" & CStr(.Range("H1").Value)
    Else
      .Range("F1").Value = Date
      .Range("H1").Value = 1
      TOUSHI_STR = CStr(Date) & "-1"
    End If
    
    MAINROW = 10
    Do Until .Cells(MAINROW, 2).Value = ""
      If .Cells(MAINROW, 1).Value <> "" Then
        Set MI = OL.CreateItem(olMailItem)
        MI.To = .Cells(MAINROW, 2).Value
        MI.Subject = .Range("B1").Value & " " & TOUSHI_STR
        MI.Body = .Cells(MAINROW, 3).Value & " " & .Cells(MAINROW, 4).Value & vbLf & vbLf & .Range("B2").Value & vbLf & vbLf & .Range("B3").Value & vbLf & vbLf & .Range("E4").Value & CStr(.Range("F4").Value) & vbLf & vbLf & .Range("B5").Value
        '添付ファイル貼り付け
        If RET = 6 Then
          If SENDFILEPATH(1) <> "" Then
            For Each ADDFILE In SENDFILEPATH
              MI.Attachments.Add ADDFILE
            Next
          End If
        End If
        MI.Display
        '宛先選択をクリア
        .Cells(MAINROW, 1).Value = ""
        
        'LOGシートに転記
        Worksheets("LOG").Cells(LOGROW, 1).Value = TOUSHI_STR
        Worksheets("LOG").Cells(LOGROW, 2).Value = .Cells(MAINROW, 3).Value & " " & .Cells(MAINROW, 4).Value
        LOGSTR = Replace(.Range("B3").Value, vbLf, " ")
        Worksheets("LOG").Cells(LOGROW, 3).Value = LOGSTR
        LOGROW = LOGROW + 1
        
      End If
      MAINROW = MAINROW + 1
    Loop
  
  End With
  
  Set OL = Nothing
  Set MI = Nothing
  
End Sub

ボタンの文字を変更するには、ボタンを右クリックして「テキストの編集」を選択するとボタンの文字を変更できますので「メール作成」に変更してください。

ボタンのテキストを変更する画像

最後にエクセルVBAからOUTLOOKの機能を呼び出す参照設定をおこないます。

VBEのツールタブを選択し、参照設定を押すと設定ウィンドウが表示されるので、「Microsoft Outlook 16.0 Object Library」にチェックを入れてからOKを押します。(エクセルのバージョンによってはMicrosoft Outlook Object Libraryのバージョンが16以外の可能性があります)

参照設定の画像

使用方法

B1~B5セルに共通メール内容を入力します。

10行目以降の宛先一覧のA列に文字が入っていればその宛先でメールが作成されます。

入力が完了したら「メール作成」ボタンを押します。

使い方説明の画像

添付ファイルの有無をメッセージボックスで確認されるので「はい」か「いいえ」を押します。

ファイル添付確認メッセージ画像

「はい」を選択した場合、ファイルダイアログが開くので、ファイルを選択して「開く」ボタンを押します。(添付ファイルが特定のフォルダに保存されている場合、B6セルのデフォルトで開くフォルダを設定しておくことをお勧めします)

「いいえ」を選択すると添付ファイルを選択するウィンドウは表示されずそのままメールが作成されます。

添付ファイル選択画面の画像

自動的に選択した宛先のメールが作成されます

作成されたメールの画像

内容を確認して、個別に文面を修正する場合や、添付ファイルを貼り付けてから、送信ボタンを押してください。


過去のメール作成した履歴を確認したい場合にはLOGシートを参照ください。

最後に

複数の宛先に同一内容のメールを作成する手間がかかるからFAXの一斉送信機能を利用している方は、このプログラムを利用することでFAXからメールに切り替えることができるようになります。

通信費用の削減もできますし、ファイル添付もできるので、FAXだと文字がつぶれて読み間違えるといったことも無くなります。

今回は見積もり用の仕様でファイルを作成してみましたが、改造すればその他の用途にも流用できます。

このほかにもExcelVBAの有益なコードを公開していますのでそちらの記事も読んでくださいね。

コメント

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