Microsoft Officeについているメールソフト「Outlook」には、複数メールの添付ファイルを一括で保存する機能が無い。なので、そういった処理をしたいときは、メールを一個ずつ開いて添付ファイルをディスクに保存していくしかない。だが、メール10件程度ならまだしも、これが100件、1000件となってくると、手動ではとてもやっていられない。
Microsoft Officeのアプリには共通のプログラミング言語VBA(Visual Basic for Application)が実装されており、アプリに標準で付いていない機能を自作して追加することができる。もちろんOutlookも例外ではない。VBAを使って上記の処理を作ってみようと思う。
VBAを記述するエディタはOutlook起動後Alt+F11で開くことがでる。もしくは[オプション]→[リボンのユーザ設定]で「開発」を有効にして、「Visual Basic」をクリック。エディタが開いたら[挿入]→[標準モジュール]でモジュールを追加。
プログラムの前提として、「ryoh@fineblue206.net」というアカウントの「受信トレイ」の下に「SUB」というフォルダがあり、添付ファイルを一括保存したいメールがそこにあるものとする。
処理の流れ
処理の流れは次のようになる
- Accountオブジェクトを取得
- 「受信トレイ」のFolderオブジェクトを取得
- 「SUB」フォルダのFolderオブジェクトを取得
- 「SUB」フォルダ内のMailItemオブジェクトを取得
- MailItemのメンバであるAttachmentオブジェクトに対してSaveAsFileメソッドでファイルを保存
コードサンプル
Public Sub SaveAttachmentFiles()
Dim oAccount As Account
Dim folderINBOX As Folder
Dim folderSUB As Folder
Dim itemMail As Outlook.MailItem
Dim strFilename As String
Dim oAttachment As Attachment
'アカウント取得
Set oAccount = Application.Session.Accounts![ryoh@fineblue206.net]
'「受信トレイ」の取得
Set folderINBOX = oAccount.DeliveryStore.GetDefaultFolder(olFolderInbox)
'「SUB」フォルダの取得
Set folderSUB = folderINBOX.Folders.Item("SUB")
'For Eachのループでメール(MailItemオブジェクト)を取得
For Each itemMail In folderSUB.Items
'For Eachのループで添付ファイル(Attachmentオブジェクト)を取得
For Each oAttachment In itemMail.Attachments
'ファイル名(フルパス)
'(保存フォルダは仮のものです)
strFilename = "D:\保存フォルダ\" & oAttachment
'ディスクに保存する
oAttachment.SaveAsFile strFilename
Next
Next
End Sub
このコードを実行すると「SUB」フォルダの中にあるメールの添付ファイルが全て”D:\保存フォルダ\”に保存されるはずだ。もし、このコードをコピーして使う場合は、フォルダの名前等を適時自分の環境に合わせて変えてください。
実行の方法は、「開発」リボンの[マクロ]から実行します。
strFilename = “D:\保存フォルダ\” & itemMail.Attachments(1)
ではなくて
strFilename = “D:\保存フォルダ\” & oAttachment
ではありませんか?
ご指摘の通りでした。記事を修正しました。
元のコードだと添付ファイルが複数あってもすべて保存されませんね。
有難うございました。
こちらこそ勉強になりました。ありがとうございます。
大変お世話になります。ど素人の老人です。よろしくお願いします。
こちらのプログラムをコピ-して実験してみたら、完璧でした。驚きと同時に大変うれしく
思っております。2点だけ質問させてください。
◆予め受信トレイ”SUB”の中に、同じメールをコピーしておいたら、心配していた重複なしで、保存フォルダに保存されていました。重複しないというプログラムになっているのですね?もしそうであれば、重複を避けるため、マクロ実行の度に保存フォルダを空にしなくて済むので、非常にありがたいです。
◆保存フォルダを自分のPCではなく、例えば会社のネットワークフォルダに保存はできますか?
また、それはウィルス感染のリスクがあるので止めた方がよいでしょうか?
以上、よろしくお願いします。
サンプルプログラムに何かの重複を避けたり許可する処理はありません。
保存先をネットワークフォルダにすることはできると思いますが、セキュリティに関しては会社のネットワーク管理者に問い合わせてください。
実際に重複がないという事実については、同じファイルについて、
上書き処理がされているものと勝手に理解させていただきます。
セキュリティについても、会社に確認の上で対応いたします。
ど素人相手に丁寧にコメントいただき、ありがとうございました。
今後の仕事に生かしていきたいと思います。