VBA技術解説
VBAでのOutlook自動操作

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2022-08-04

VBAでのOutlook自動操作


エクセルでメールの送受信する方法はいくつかありますが、
どれもなかなか面倒ですし、サポートされない機能(CDOは送信のみ)であったりと、不便な事が多いです。

・バインディング方法 ・CDOを使ったメール送信のサンプルVBA ・CDOのプロパティ ・CDOのメソッド ・CDO.Configuration.Fields.Item ・CDO.Fields.Item ・ConstantやEnumについて

そこで、Excelを使っていると言う事は、大抵はOutlookもインストールされているはずですので、
これを使って、メールの送受信を行うという選択をすることは自然な流れです。

以下では、ExcelからVBAでOutlookを自動操作して、メールの送受信をする場合のサンプルになります。

私自信の覚書の意味で掲載しますので、解説はあまりなく、多くのサンプルコードを掲載いたします。
VBAコード自体は、難しいものではないので、コードを見るだけで理解できるはずです。


目次

Outlookインスタンスの生成と、ログオン、全て送受信


Sub sample1()
  Dim oApp As New Outlook.Application
  Call oApp.Session.LogOn("Outlook", "")
  Call oApp.Session.SendAndReceive(True) '全て送受信
  oApp.Quit
  Set oApp = Nothing
End Sub

※参照設定で、
  Microsoft Outlook 15.0 Object Library
  (バージョンは各PCに合わせて設定して下さい。)
  を設定して下さい。
  CreateObject("Outlook.Application")
  でも良いのですが、なるべく事前バインディングするようにしましょう。


Outlookを起動して指定フォルダーを表示

Sub sample2()
  Dim oApp As New Outlook.Application
  Dim oNamespace As Outlook.Namespace
  Dim oFolder As Outlook.Folder
  Set oNamespace = oApp.GetNamespace("MAPI")
  Set oFolder = oNamespace.GetDefaultFolder(olFolderInbox) '受信トレイ
  oFolder.Display '受信トレイ を表示
End Sub

GetDefaultFolderの引数はOlDefaultFolders列挙です。
名前 説明
olFolderCalendar 9 予定表フォルダー。
olFolderConflicts 19 競合フォルダー (同期の失敗フォルダーのサブフォルダー)。 Exchange アカウントの場合のみ。
olFolderContacts 10 連絡先フォルダー。
olFolderDeletedItems 3 削除済みアイテム フォルダー。
olFolderDrafts 16 下書きフォルダー。
olFolderInbox 6 受信トレイ フォルダー。
olFolderJournal 11 履歴フォルダー。
olFolderJunk 23 迷惑メール フォルダー。
olFolderLocalFailures 21 ローカルの失敗フォルダー (同期の失敗フォルダーのサブフォルダー)。 Exchange アカウントの場合のみ。
olFolderManagedEmail 29 管理対象のフォルダー グループの最上位フォルダー。 管理対象のフォルダーについて詳しくは、Microsoft Outlook のヘルプを参照。 Exchange アカウントの場合のみ。
olFolderNotes 12 メモ フォルダー。
olFolderOutbox 4 送信トレイ フォルダー。
olFolderSentMail 5 送信済みアイテム フォルダー。
olFolderServerFailures 22 サーバーの失敗フォルダー (同期の失敗フォルダーのサブフォルダー)。 Exchange アカウントの場合のみ。
olFolderSuggestedContacts 30 連絡先候補フォルダー。
olFolderSyncIssues 20 同期の失敗フォルダー。 Exchange アカウントの場合のみ。
olFolderTasks 13 タスクフォルダー。
olFolderToDo 28 To Do フォルダー。
olPublicFoldersAllPublicFolders 18 Exchange パブリック フォルダー ストア内の All Public Folders フォルダー。 Exchange アカウントの場合のみ。
olFolderRssFeeds 25 RSS フィード フォルダー。


フォルダーの取得

Sub sample2()
  Dim oApp As New Outlook.Application
  Dim oNamespace As Outlook.Namespace
  Dim oFolder As Outlook.Folder
  Dim i As Long
  Set oNamespace = oApp.GetNamespace("MAPI")
  i = 1
  For Each oFolder In oNamespace.Folders
    Cells(i, 1) = oFolder.Name
    i = i + 1
  Next
  Set oFolder = Nothing
  Set oNamespace = Nothing
  Set oApp = Nothing
End Sub

ここでのGetNamespaceは、"MAPI"のみです。
そして、これは、Sessionと同一になりますので、以下と同じことになります。

Sub sample3()
  Dim oApp As New Outlook.Application
  Dim oFolder As Outlook.Folder
  Dim i As Long
  i = 1
  For Each oFolder In oApp.Session.Folders
    Cells(i, 1) = oFolder.Name
    i = i + 1
  Next
  Set oFolder = Nothing
  Set oApp = Nothing
End Sub

上記は、Outlookのルート直下のみ取得しています。
Folder内のサブフォルダーを取得する場合は、
oFolder.Folders
より取得可能です。

全フォルダーを取得するなら、以下のように再起呼び出しが必要になります。

Sub sample4()
  Dim oApp As New Outlook.Application
  Dim oFolder As Outlook.Folder
  Dim i As Long
  Dim j As Long
  i = 1
  For Each oFolder In oApp.Session.Folders
    j = 1
    Cells(i, j) = oFolder.Name
    i = i + 1
    Call sample4_sub(oFolder, i, j)
  Next
  Set oFolder = Nothing
  Set oApp = Nothing
End Sub
Sub sample4_sub(ByVal oFolder As Outlook.Folder, ByRef i As Long, ByVal j As Long)
  j = j + 1
  For Each oFolder In oFolder.Folders
    Cells(i, j) = oFolder.Name
    i = i + 1
    Call sample4_sub(oFolder, i, j)
  Next
End Sub


メールの一覧を取得

Sub sample5()
  Dim oApp As New Outlook.Application
  Dim oFolder As Outlook.Folder
  Dim oItem As Outlook.MailItem
  Dim i As Long
  Dim j As Long
  Set oFolder = oApp.Session.Folders("Outlook データ ファイル").Folders("受信保存").Folders("×××")
  i = 1
  For Each oItem In oFolder.Items
    Cells(i, 1) = oItem.ReceivedTime
    Cells(i, 2) = oItem.SenderName
    Cells(i, 3) = oItem.Subject
    Cells(i, 4) = oItem.Body
    For j = 1 To oItem.Attachments.Count
      Cells(i, j + 4) = oItem.Attachments.Item(j).FileName
      '保存する場合は
      'oItem.Attachments.Item(j).SaveAsFile Path:="フルパス"
    Next
    i = i + 1
  Next
  Set oItem = Nothing
  Set oFolder = Nothing
  Set oApp = Nothing
End Sub

通常は、処理したいフォルダーはきまっているはずですので、
上記のように、Foldersにフォルダー名を指定して特定すれば簡単です。


メールを送信

Sub sample6()
  Dim oApp As New Outlook.Application
  Dim oItem As Outlook.MailItem
  Set oItem = oApp.CreateItem(olMailItem)
  
  With oItem
    '送信者を既定から変更する場合
    .SendUsingAccount = oApp.Session.Accounts.Item("送信者メールアドレス")
    'Outlookを参照設定しない場合は、Setが必要になります。
'    Set .SendUsingAccount = oApp.Session.Accounts.Item("送信者メールアドレス")
    
    '返信先を設定する場合
    .ReplyRecipients.Add "返信先メールアドレス"
    
    .To = "Toメールアドレス"
    .CC = "CCメールアドレス" '省略可
    .BCC = "BCCメールアドレス" '省略可
    .Importance = olImportanceHigh '重要(値は2)、省略可
    .Attachments.Add "添付フルパス" '省略可
    
     '送信予約する日時をDate型で指定
    .DeferredDeliveryTime = CDate("yyyy/mm/dd hh:mm")
    
    .Subject = "件名"
    .Body = "本文"
    
    .Send
    '送信せずに画面を表示する場合は、
'    .Display
  End With
  
  oApp.Quit
  Set oItem = Nothing
  Set oApp = Nothing
End Sub

CreateItem
で作成すれば、後は、各プロパティへの設定だけです。
VBAテスト中は、いきなりSendせずに、Displayして確認すると良いでしょう。

予約送信はOutlookが起動していないとその時間に送信されないので、最後のQuit及びNothingは行わないようにするか、後で起動しておいてください。


メールを返信

Sub sample7()
  Dim oApp As New Outlook.Application
  Dim oFolder As Outlook.Folder
  Dim oItem As Outlook.MailItem
  Dim rItem As Outlook.MailItem
  Dim i As Long
  Dim j As Long
  Set oFolder = oApp.Session.Folders("Outlook データ ファイル").Folders("受信保存").Folders("×××")
  For Each oItem In oFolder.Items
    If oItem.UnRead Then
      Set rItem = oItem.Reply
      oItem.UnRead = False
      rItem.Body = "メール受け取りました。"
      rItem.Send
      Exit For
    End If
  Next
  Set oItem = Nothing
  Set oFolder = Nothing
  Set oApp = Nothing
End Sub

Replyは、全員へ返信のRplyAllもあります。
添付等、他はsample6と同様になります。


最後に

メールに関しては、これくらいで大抵は事足りるでしょう。
予定表等についても、VBAで操作可能です。
どんなオブジェト・プロパティがあるかを調べる事が少々面倒ですが、
VBAコード自体は、いたってシンプルに実現できるはずです。




同じテーマ「マクロVBA技術解説」の記事

VBAでのSQLの基礎(SQL:Structured Query Language)
VBAで正規表現を利用する(RegExp)
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
VBAでのOutlook自動操作
ADO(ActiveX Data Objects)の使い方の要点
特殊フォルダの取得(WScript.Shell,SpecialFolders)
参照設定、CreateObject、オブジェクト式の一覧
VBAのスクレイピングを簡単楽にしてくれるSelenium
VBA+SeleniumBasicで検索順位チェッカー作成
VBA+SeleniumBasicで検索順位チェッカー(改)
.Net FrameworkのSystem.Collectionsを利用


新着記事NEW ・・・新着記事一覧を見る

数字(1~50)を丸付き数字に変換するVBA|VBA技術解説(2022-11-15)
TEXTAFTER関数(テキストの指定文字列より後ろの部分を返す)|エクセル入門(2022-11-14)
TEXTBEFORE関数(テキストの指定文字列より前の部分を返す)|エクセル入門(2022-11-14)
TEXTSPLIT関数(列と行の区切り記号で文字列を分割)|エクセル入門(2022-11-12)
LAMBDA以降の新関数はVBAで使えるか|VBA技術解説(2022-11-11)
WRAPCOLS関数(1次元配列を指定数の列で折り返す)|エクセル入門(2022-11-08)
WRAPROWS関数(1次元配列を指定数の行で折り返す)|エクセル入門(2022-11-08)
EXPAND関数(配列を指定された行と列に拡張する)|エクセル入門(2022-11-07)
TAKE関数(配列の先頭/末尾から指定行/列数を取得)|エクセル入門(2022-11-06)
DROP関数(配列の先頭/末尾から指定行/列数を除外)|エクセル入門(2022-11-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.エクセルVBAでのシート指定方法|VBA技術解説
9.マクロって何?VBAって何?|VBA入門
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ