日々の業務で、毎回決まった定型情報をメールで報告するようなタスクがある場合、今回紹介するAccessからOutlookのメールを送信する方法が活用できます。
一般的にAccessによる運用を進めると定期的にデータが蓄積されていきますが、これらデータを毎回メールの本文に手入力するのではなく、自動で出力されメールが自動送信されれば、業務効率を飛躍的に向上させることが期待できます。
そこで、今回はあるお店の前日の売り上げをOutlookメールで報告する機能をAccessに盛り込む方法を紹介します。
サンプルデータについて
サンプルテーブルとして「T_売上」テーブルを作成し、「品名」、「売上」及び「売上日」フィールドを追加します。各フィールドは、「短いテキスト」、「通貨型」及び「日付/時刻型」のデータ型に設定します。
続いて、表1に示すサンプルデータを登録します。
表1 サンプルデータ
| 品名 | 売上 | 売上日 |
| えんぴつ | ¥5,000 | 2022/01/18 |
| えんぴつ | ¥6,000 | 2022/01/17 |
| 消しゴム | ¥4,000 | 2022/01/18 |
| 消しゴム | ¥5,000 | 2022/01/17 |
| ノート | ¥9,500 | 2022/01/18 |
| ノート | ¥8,500 | 2022/01/17 |
これでサンプルデータの準備ができましたので、次から前日の売り上げをOutlookメールで報告する機能をVBAでコード実装していきましょう。
Outlookでメール送信するVBAコードの実装
それでは、標準モジュールを作成し、以下のコードを実装してください。
Private Sub SendOutlookMail()
'Outlookオブジェクトの変数宣言
Dim olApp As Object
'メールの参照を代入する変数宣言
Dim SendMail As Object
'メール本文を代入する変数宣言
Dim MailSentence As String: MailSentence = ""
'昨日の日付を代入する変数宣言
Dim YesterDay As Date
YesterDay = DateAdd("d", -1, Date)
'ADOを用いて、2022/1/18のデータを抽出し、MailSentence変数に代入する。
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'カレントデータベースへの接続
Set cn = CurrentProject.Connection
'T_売上テーブルを開く
rs.Open "T_売上", cn, adOpenKeyset, adLockOptimistic
'2022/1/18のレコードを抽出する
rs.Filter = "売上日 = #" & YesterDay & "#"
'何日付のデータかをメール本文に記載する
MailSentence = MailSentence + Format(YesterDay, "yyyy/mm/dd") + "の売上は以下のとおりです。" & vbCrLf
'ループ文でメール本文を作成する
Do Until rs.EOF = True Or rs.BOF = True
'MailSentence変数に、品名、売上を代入し、改行も加える
MailSentence = MailSentence & rs!品名 & ": " & Format(rs!売上, "#,###円") & vbCrLf
rs.MoveNext
Loop
'T_売上テーブルを閉じ、データベースを閉じる
rs.Close
cn.Close: Set cn = Nothing
'Outlookの起動
Set olApp = CreateObject("Outlook.Application")
'メールアイテムを作成する
Set SendMail = olApp.CreateItem(0)
'メールの本文を作成する
With SendMail
'送信先のメールアドレスを指定する。
.Recipients.Add("leastinfostudy@gmail.com").Type = 1
'メールのタイトル
.Subject = "【TEST】_" & Format(YesterDay, "yymmdd売上データ")
'メールの本文
.Body = MailSentence
'メールの送信
'.Send '誤送信を防ぐためコメントアウトをしています。
'確認用としてOutlookを表示する
.Display
End With
End Sub
少し長めのコードですが、一つずつ内容を確認していきましょう。
まずは、Outlookオブジェクト、メールの参照、メール本文に記載する内容を代入する変数宣言をします。また、「昨日の日付」を格納するための「YesterDay」変数も宣言します。この際、YesterDay変数にはDateAdd関数を用いて、昨日の日付を代入します。
ここで、DateAdd関数については以下の記事をご参考にしてください。
ADOによるレコード処理をするために、変数宣言をし、カレントデータベースへの接続、「T_売上」テーブルを開くコードを追加しています。
今回は、「昨日の売り上げデータ」をメール報告する目的のため、Filterプロパティを用いて対象レコードを抽出しています。
Filterプロパティの使い方は以下の記事をご参考にしてください。
次に、メールの本文に記載する内容を変数に代入します。
Do Loop文を用いて、昨日の売上レコードの品名、金額を繰り返し変数に追加していきます。その後、対象レコードがなくなった後、「T_売上」テーブルを閉じ、カレントデータベースへの接続を切ります。
続いて、Outlookでメールを送るために、「CreateObject関数」を用いてOutlookアプリケーションを起動します。さらに、CreateItemでメールアイテムを作成します。この時、CreateItemメソッドの引数を「0」に指定することでメールアイテムを作成することになります。続いて、With文内でメールアイテムのプロパティを設定します。Recipientsプロパティは送信先のメールアドレスを、Subjectプロパティではメールのタイトルを、Bodyプロパティでメール本文を指定します。そして、Sendプロパティでメールを送信しますが、誤送信を防ぐため、今回のサンプルではコメントアウトをしています。
Sendプロパティの代わりとして、Displayメソッドを設定し、作成したメールを表示するようにしました。
作成した機能を実行すると図1の結果(実行日は2022/1/19です。)が得られます。

このようにして、AccessからOutlookのメールを自動作成し、送信することができます。
まとめ
今回は、Accessのデータを用いて、自動でOutlookメールを作成し送信する機能をVBAで実装しました。日々のルーチン業務で同様の事例があった場合には、本記事を参考に業務効率の改善を図っていただければと思います。
また、専門書でも、VBAコードの書き方が詳しく説明されていますので、お手元に1冊用意されてAccess開発に臨まれることをオススメします。
スポンサーリンク




コメント