Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

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

何かデータをまとめたとき、次工程に渡す方法の一つとしてメール配信まで自動化できればいいな、と思ったことはありませんか?

VBAではシートやエクセルと言ったエクセルアプリケーションが持つオブジェクト以外を操作することができます。今回はAPIという外部の機能を提供するクラスを利用してメール配信する方法を解説します。

この記事は初段です。(APIを完全に使いこなすのは3段だと思いますが、とりあえず使うだけなら初段で大丈夫です。私も実は自由自在では無く、とりあえずある程度使える位です)

レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

APIとは

APIとはApplication Programming Interfaceの略で、ざっくり言うと他のアプリから呼び出して使えるようにした、いろいろなクラスがまとめられたモノです。

Application:アプリ
Programmig:プログラミング
Interface:境目

というわけで、アプリのプログラミングで、別のアプリとの間に立つべく、その機能を使うために提供されているライブラリです。

飲食店の検索アプリでグーグルマップと連携していたりします。これは飲食店の検索アプリがグーグルマップのAPIを使って、その機能を使わせてもらっている状態です。

エクセルは独立したアプリケーションですが、Windows APIを使う事により、その機能を利用することができます。

今回はOutLookの機能をお借りする作戦です。

Windows APIをつかってOutLookの機能を利用する

それでは早速、手順を追っていくことにしましょう。

メールを使う準備をする

まずはOutLookというアプリを操作するためのオブジェクトを生成します。インスタンスとも言います。クラスやオブジェクトについての前提知識についてはVBAのクラスを使う① クラスを使うためのオブジェクトとメソッドの前提知識 - Mutable_YunのVBA上達&業務改善ブログをご覧下さい。

Sub Email作成()
    Dim myOL As Object
    Set myOL = CreateObject("Outlook.Application")
End Sub


~余談ながら~

まず、OutLookを利用するために、オブジェクトを生成します。今回はmyOLとしました。オブジェクトを格納する変数名は分かりやすければ何でもOKです。

APIではなく、自分でクラスからオブジェクトを生成するときにはNewを使いました。これはクラスモジュールに自分でクラスを記述しているので、クラスモジュールにあるクラスを参照してオブジェクトを作りますよ、と言う事をNewをつけることで表しています。


今回は他のアプリケーションのクラスを活用してるので、Newをつけてオブジェクトを生成しても「誰ソレ」状態になってしまうので、CreateObjectを使って「Outlook.Application」というオブジェクトを作りたいのです、とお伝えする必要があります。

Newを使ってAPIのオブジェクトを生成することもできますが、マクロを実行するユーザー側にてエクセルの設定をする必要があるため、私は使ったことがありません。

メソッド名を調べるために、自分のエクセルでは参照の設定をして、入力補助を参考にコードを記述し、配布するときは今回のようにNewでは無くCreateObjectを使う手はあると思います。

~余談ここまで~

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

先ほどは、Outlookを操作するためのオブジェクトであるmyOLを準備しました。今度は送信するメールオブジェクトを用意します。

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

    Dim myITEM As Object
    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
    End With
   
    Set 添付ファイル1 = .Attachments
    添付ファイル1.Add 添付ファイル1fullpath

    myITEM.display
    myITEM.send ’送信せずに、メールを送る直前で止めて欲しいユーザーも多い

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

私の場合は、To、CCに入れる宛先もFunctionで作成しています。

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

これで、データ作成だけで無く、メール配信まで自動化できました。

APIの難しさは①クラスとオブジェクト、②メソッドを知らない、の②点だと思います。①クラスとオブジェクトに関してはすでに、勉強済みなので②の攻略ですよね。

これは、ぶっちゃけ過去の使い回しで攻略しましょう。苦労して調べて、あとは必要な手直しだけをしていきます。

私もこの記事を作成するに当たりサンプルコードはゼロから作るので無く、過去に自作したモノをシンプルに書き換える形で作成しました。

さあ、APIを使ってデータ作成ツールにメール配信機能をつけて、完成度を高めましょう。