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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2014-07-08 最終更新日: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)

・SQL文 ・SELECT文 ・SQLの学習について ・実践例
VBAで正規表現を利用する(RegExp)
・メタ文字 ・正規表現 ・正規表現RegExpの使い方 ・RegExpオブジェクト ・RegExpの使用例 ・RegExp関連のオブジェクト ・Execute(Matches,Match,SubMatches)の使用例 ・Replaceの使用例 ・先読み:肯定先読み、否定先読み ・正規表現の実践例
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
・バインディング方法 ・CDOを使ったメール送信のサンプルVBA ・CDOのプロパティ ・CDOのメソッド ・CDO.Configuration.Fields.Item ・CDO.Fields.Item ・ConstantやEnumについて
VBAでのOutlook自動操作
ADO(ActiveX Data Objects)の使い方の要点
・データベースの種類 ・SQL(SQL:Structured Query Language) ・ADOを使う準備 ・ADOでのDB接続方法 ・ADODB.Recordsetの取得方法 ・ADODBのレコードセットの扱い方 ・ADODBのトランザクション処理 ・ADODB.Commandの使い方 ・VBA100本ノックでの実践例 ・最後に注意点等
特殊フォルダの取得(WScript.Shell,SpecialFolders)
・WScript.Shell ・SpecialFolders プロパティ ・WshShellのSpecialFoldersのマクロVBA使用例
参照設定、CreateObject、オブジェクト式の一覧
VBAでエクセル外のオブジェクトを使うときには、事前バインディングと遅延バインディング(実行時バインディング)の2通りがあります、この時それぞれ何を指定したらよいのか、指定する文字列が長いので結構探してしまうことが度々あります。そこで、自身の覚え書きとしての意味も含めて、参照設定、CreateObjectのclas…
VBAのスクレイピングを簡単楽にしてくれるSelenium
・SeleniumBasicのインストール ・VBEでの参照設定 ・WEBサイトを表示してみましょう ・Seleniumの基本的な使い方(株価情報を取得してみる) ・色々なパターンでのseleniumの使い方 ・色々組み合わせて目的の画面にたどり着きます ・elementをコレクションで取得する ・新規ページが開かれる場合 ・上手くいかない特殊な場合の対処方法 ・Seleniumの実践例例 ・最後に
VBA+SeleniumBasicで検索順位チェッカー作成
・シート構成 ・検索順位チェッカーのVBA全コード ・最後に
VBA+SeleniumBasicで検索順位チェッカー(改)
・シート構成 ・検索順位チェッカーのVBA全コード ・最後に
.Net FrameworkのSystem.Collectionsを利用
・ArrayList ・SortedList ・Hashtable


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

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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