ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA OLEを使ってメールを配信する

<2019/12/29誤記訂正。失礼しました>

エクセル作業をVBA自動化した時、その結果をメール配信するところまで自動化できればいいな、と思ったことはありませんか?OLEというワザを使えば簡単にできてしまいます。今回はOLEを使ってメール配信をしてみましょう。

ここではクラスやオブジェクトの知識には深入りせずにメールを送る部分のみに絞って解説をします。クラスやオブジェクトそのものについてきちんと理解したい方はVBAのクラスを使う① クラスを使うためのオブジェクトとメソッドの前提知識 - ゆんの業務改善ブログをご覧下さい。

目次

OLEを使ってメールを配信する

OLEとは

OLEとは他のアプリケーションを動かすための規格(または技術、やり方、方法。)のことで、 Object Linking and Embeddingの略です。例えば、ExcelにはブックがあるのでExcelでブックの操作が可能です。OutlookにはメールがあるのでOutlookでメールの操作が可能です。Excelでメールを操作する為にOutlookからメールを借りてこよう、と言うのがOLEの考え方です。

より詳しい解説については、VBA OLEオートメーションで別のアプリケーションを動かす① OLEの目的と概念をご参照下さい。

OLEを使う

クラスからオブジェクトを生成して、メールを使う準備をする

まずはOutLookというアプリを操作するためのオブジェクト*1を生成します。

' これは標準モジュールに記述します
Sub Email作成()
    Dim myOL As Object 'Outlookを操作する為のオブジェクトを宣言した
    Set myOL = CreateObject("Outlook.Application") 'オブジェクトを生成した
End Sub
送信するメールのオブジェクトを生成する

前項ではOutlookを操作するためのオブジェクトであるmyOLを準備しました。今度は送信するメールオブジェクトをmyITEM と言う名前で用意します。メールオブジェクトとは送信するメールそのもののことです。Outlookを操作するオブジェクト、つまり機能の塊がmyOL で、送信するメールそのものをmyITEM としています。このあたりがごちゃごちゃになると理解出来なくなりますので、一つ一つ進めましょう。

先ほどのコード Set myOL = CreateObject("Outlook.Application")の下に下記を追記します。

Sub Email作成()
    Dim myOL As Object 'Outlookを操作する為のオブジェクトを宣言した
    Set myOL = CreateObject("Outlook.Application") 'オブジェクトを生成した

'ここから先が新しい部分
    Dim myITEM As Object '送信するメールそのもののオブジェクトを宣言
    Set myITEM = myOL.CreateItem(0) 'オブジェクトを生成した
End Sub

このmyITEMがメールそのものです。ここまででメールの準備ができたので、あとは宛先と本文、添付ファイルをつければ、送信目前です。myOL もmyITEM も好きな名前をつけることができます。オブジェクトが2つ出てくるので分かりやすい様に、Outlookを操作する為のオブジェクトを格納する変数名、メールアイテムだと分かる様な変数名と変数名を分かりやすい様にしておきましょう。

宛先、本文、添付ファイルを準備する

Set myITEM = myOL.CreateItem(0) 'オブジェクトを生成したの下の部分に下記を記述します。

' 前略

    Dim 配信先str As String
    Dim CCstr As String
    Dim 題名str As String
    Dim 本文str As String
    Dim 添付ファイルfullpath As String
    Dim 添付ファイル As Object

    配信先str = 'ココに配信先を入れる 複数宛先の場合は「;」で区切る
    CCstr = 'ココにCCに入れる宛先を入れる 複数宛先の場合は「;」で区切る
    題名str = 'ココに題名を入れる
    本文str = 'ココに本文を入れる  
    添付ファイルfullpath = ’ココにフルパスを入れる    

    With myItem
        .To = 配信先str
        .CC = CCstr
        .Subject = 題名str
        .Body = 本文str
        Set 添付ファイル = .Attachments
    End With
   
    
    添付ファイル.Add 添付ファイルfullpath

    myITEM.display
    myITEM.send ’送信せずにメールを送る直前で止める場合は、コメントアウトしておく

上の例では、分かりやすくするため最小限のコードに留めています。実務的には本文や題名には日付を入れたり、場合によって内容が異なるので、Functionプロシジャで作成した文字列を受け取るのが現実的です。


別シートに宛先の一覧表を作っておき、For~Next文で取得しています。A列にメールアドレス、B列に「Atten」か「CC」を入れておきます。Functionプロシジャは配列にしておき、Attenならインデックス0、CCならインデックス1に「;」区切りで格納していきます。これで、データ作成だけで無く、メール配信まで自動化できました。

なお、メールを作成するのに必要な機能を備えたクラスを作るでは宛先などを取得するクラス自体を自作します。クラスとは機能をまとめたモノ、オブジェクトはそのクラスを具現化したものですので、この関連記事のようにクラスを使うと標準モジュールをすっきりとさせることができます。

*1:クラスから生成するオブジェクトをインスタンスと言います。ここでは深入りしません