ExcelマクロVBA技術解説
VBAでのOutlook自動操作

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-06-16

VBAでのOutlook自動操作


エクセルでメールの送受信する方法はいくつかありますが、


なかなか面倒ですし、サポートされない機能(CDOは送信のみ)があったりと、不便な事が多いです。
VBAでメール送信する方法はいろいろありますが、ここでは、CDO(MicrosoftCollaborationDataObjects)を使っての送信方法を解説します。メール送信は、メーラーを使う方法や、フリーのDLLを使う方法等もありますが、まずは、Windowsに標準であるCDOを使ってみましょう。

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

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

メールを返信


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でのInternetExplorer自動操作
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で検索順位チェッカー(改)


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

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • VBAでのOutlook自動操作

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


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




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