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

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

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")
  でも良いのですが、なるべく事前バインディングするようにしましょう。


フォルダーの取得

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 "返信先メールアドレス"
    
    oItem.To = "Toメールアドレス"
    oItem.CC = "CCメールアドレス" '省略可
    oItem.BCC = "BCCメールアドレス" '省略可
    .Importance = olImportanceHigh '重要(値は2)、省略可
    .Attachments.Add "添付フルパス" '省略可
    
    .Subject = "件名"
    .Body = "本文"
    
    .Send
    '送信せずに画面を表示する場合は、
'    .Display
  End With
  
  Set oItem = Nothing
  Set oApp = Nothing
End Sub

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

参照設定しない場合は、以下のように「Set」がひつようになる部分が


メールを返信

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 ・・・新着記事一覧を見る

抜けている数値を探せ|エクセル雑感(2022-07-01)
.Net FrameworkのSystem.Collectionsを利用|VBA技術解説(2022-06-29)
迷路ネコが影分身の術を体得したら…|エクセル雑感(2022-06-27)
迷路にネコが挑戦したら、どうなるかな…|エクセル雑感(2022-06-26)
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)|エクセル雑感(2022-06-24)
「マクロの登録」で登録できないプロシージャーは?|エクセル雑感(2022-06-23)
オブジェクトのByRef、ByVal、Variant|エクセル雑感(2022-06-22)
コメントから特定形式の年月を取り出す|エクセル雑感(2022-06-19)
4,9を使わない連番作成|エクセル雑感(2022-06-17)
連番を折り返して出力|エクセル雑感(2022-06-16)


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

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




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


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



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