ExcelマクロVBA技術解説 | VBAでのOutlook自動操作 | Excelマクロの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2014-07-08

VBAでのOutlook自動操作


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

なかなか面倒ですし、サポートされない機能(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コード自体は、いたってシンプルに実現できるはずです。




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

Dictionary(ディクショナリー)連想配列の使い方について
Dictionary(ディクショナリー)のパフォーマンスについて
VBAでのInternetExplorer自動操作
VBAでのSQLの基礎(SQL:Structured Query Language)
VBAで正規表現を利用する(RegExp)
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
ADO(ActiveX Data Objects)の使い方の要点

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

SUMIFの間違いによるパフォーマンスの低下について|エクセル関数超技(6月17日)
条件式のいろいろな書き方:TrueとFalseの判定とは|ExcelマクロVBA技術解説(6月15日)
空白セルを正しく判定する方法2|ExcelマクロVBA技術解説(5月6日)
フルパスをディレクトリ、ファイル名、拡張子に分ける|ExcelマクロVBA技術解説(4月15日)
テキストボックスの各種イベント|Excelユーザーフォーム入門(4月9日)
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除|ExcelマクロVBAサンプル集(4月4日)
最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)

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

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.定数と型宣言文字(Const)|ExcelマクロVBA入門
10.CSVの読み込み方法|ExcelマクロVBAサンプル集



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

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


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

    ↑ PAGE TOP