VBAでのOutlook自動操作
エクセルでメールの送受信する方法はいくつかありますが、
どれもなかなか面倒ですし、サポートされない機能(CDOは送信のみ)であったりと、不便な事が多いです。
そこで、Excelを使っていると言う事は、大抵は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して確認すると良いでしょう。
メールを返信
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 ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- VBAでのOutlook自動操作
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。