*這裡所說的 "Outlook" 是指 "Microsoft Office (我用的是2003版)" 裡的 Outlook,不是 Outlook Express。Outlook Express 不支援 VBA。
有位網友在知識+提出 "將Outlook的email附加檔案轉存至資料夾的VBA程式" 的請求,他說,每天都會收到各業務單位寄給他的 Excel檔案,所以每天都要將很多 Email 的附件檔一一地「另存新檔」。能不能寫個 Outlook 的 VBA 程式,把這些附加檔案一口氣全部轉存到指定的資料夾呢?
對於 Outlook 的 VBA,我的撰寫經驗很少,一方面是需求不多,另一方面是因它沒有錄製巨集的功能,參考資訊也比 Excel 少。好奇心驅使之下,我研究了一下,嘗試寫了一個 subroutine,測試完成之後貼進解答中。可惜的是,那個問題後來淪為 "網友票選",最後竟然被系統移除了 (可能是因為只有我和提問者投票)。
底下就是我寫的SaveAttachments()程式碼, 會將Outlook收件匣所有附件檔一一地另存到 "D:\來信的附件檔" (見 TargetFolder 變數值的設定):
Sub SaveAttachments()
'會將收件匣所有附件檔另存
Dim myNameSpace As Outlook.NameSpace
Dim myFolder As Outlook.MAPIFolder
Dim myAttachments As Outlook.Attachments
Dim myItems As Outlook.Items
Dim TargetFolder As String, SFName As String, NSFName As String
Dim i As Integer
TargetFolder = "D:\來信的附件檔" '檔案將要存入此處
Set fs = CreateObject("Scripting.FileSystemObject")
Set myNameSpace = Application.GetNamespace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox)
'myFolder 代表 "收件匣 Inbox"
Set myItems = myFolder.Items
'myItems 代表 "收件匣" 中所有信件 (的集合)
For Each mail In myItems '檢查每一封信
Set myAttachments = mail.Attachments
'myAttachments 代表這封信件裡所有附件檔 (的集合)
For Each att In myAttachments
SFName = TargetFolder & "\" & att.FileName
If fs.FileExists(SFName) Then '若檔案已存在, 就加上 (數字)
i = 0
Do
NSFName = TargetFolder & "\" & fs.GetBaseName(SFName) _
& "(" & i & ")." & fs.GetExtensionName(SFName)
i = i + 1
Loop While fs.FileExists(NSFName)
att.SaveAsFile NSFName '用加了數字的檔名儲存
Else
att.SaveAsFile SFName ''若檔案不存在, 就用原來的檔名儲存
End If
Next att
Next mail
End Sub
這個程式的重點可分為兩部份:
(一) 由 MAPI Namespace 存取得收件匣裡每封信的附件檔:
首先請注意程式開始 Dim 宣告中用到的 Outlook.NameSpace、Outlook.MAPIFolder、Outlook.Attachments、Outlook.Items 物件資料型別。看程式碼裡面,的註解就可以知道,這些型別的用途。
GetDefaultFolder(olFolderInbox) 就是取得 "收件匣",GetDefaultFolder() 也可以用來存取 Outlook 裡其他預設資料夾。GetDefaultFolder(OlDefaultFolders) 引數如下:
olFolderCalendar :行事曆
olFolderContacts :連絡人
olFolderDeletedItems :刪除的郵件
olFolderDrafts :草稿
olFolderInbox :收件匣
olFolderJournal :日誌
olFolderNotes :記事
olFolderOutbox :寄件匣
olFolderSentMail :寄件備份
olFolderTasks :工作
olPublicFoldersAllPublicFolders :所有的公用資料夾
olFolderJunk :垃圾郵件
(二) 附件檔儲存時如何避免檔名重複?
不同封 email 可能會有相同檔名的附件,所以要把附件檔全部存到一個資料夾,每個檔案存檔前都需用FileExists()檢查資料夾裡是否已有同名的檔案。若已有同名的檔案,就要換個檔名。我用的方法是,把 "檔名.副檔名" 拆開,在檔名後面加數字,再合起來變成 "檔名數字.副檔名"。而因為可能有兩個以上同名的檔案,所以我用一個 Do 迴圈把數字累加,一直到FileExists()檢查資料夾裡沒有同名的檔案為止。
※想要使用此程式卻不知如何在 Outlook 裡使用 VBA 的朋友,請留言或寄 email 給我。
16樓. peggy2018/01/11 11:33非常感謝你! 因為工作上非常需要這項功能
不過執行後卻一直出現''The attempted operation failed. An object could be found.''
因為我是要下載特定資料夾的檔案, 因此也有參考另一篇並加上此碼Set myFolder = myInbox.Folders("XXX"), 宣告Dim myFolder, myInbox As Outlook.MAPIFolder
請問可能會是怎麼樣的原因造成的呢? 謝謝你~
(gagashe@livemail.tw)
15樓. robin2015/08/18 14:09我想要知道,可以給我詳細的方式嗎rb11511@gmail.com感恩(rb11511@gmail.com)
關於如何在 Outlook 裡執行VBA程式,請讀這一篇:「在 Outlook 裡使用巨集」
ThisIsTheWay 於 2016/03/02 19:15回覆
http://blog.udn.com/WayCheng/2989842
14樓. 雷2014/05/13 10:58你好 如果我要只下載今天的附件,該怎麼改呢?(s9456077(AT)gmail.com)
13樓. pxw2012/05/07 01:54在Excel user form 中实现此程序
你好,我目前遇到了一个问题,已经好几天了都没有进展。不知道你是否能帮我看看:
我需要实现把outlook中某个特定邮箱内,具有某些特定名字(subject)的邮件的excel格式的附件自动存入一个硬盘上的文件夹内。不过我不在Outlook中编辑代码,而是在excel的用户表中,我现在的问题是,我使用了 item.attachment.saveAs....语句,想把附件存在一个路径指明的文件夹内,但是出现 error messege,说明对象不支持此功能。。。。不知到你有什么办法没有?谢谢了。如果需要我下次把全部的代码贴上来。
12樓. islander2010/02/19 14:38you a expert, how can i contact you
I cannt find you email address
11樓. EugeneTsou2009/10/12 22:28感謝大大無私的分享
找了許多網頁,都找不太到討論outlook vba的網站,大大的文章詳細又清楚,讓我獲益良多。
想請問一下,該用甚麼方式可以將草稿中的信件複製一定的數量,並且在複製過程中,帶入客戶信箱(excel檔or text檔)。
我參考過大大提供 彰化一天的部落格,可是那個是excel檔,並且無法設定smtp的port,我還是比較希望在outlook的草稿中手動發送信件。還煩請大大指引一下。
感恩!您的問題挺複雜的,可能必需雙向溝通,請利用會員功能看我的信箱地址,把詳細的問題描述 email 給我,我用 email 與您討論。 ThisIsTheWay 於 2009/11/11 06:31回覆
10樓. 小肥汶2009/10/01 09:51請問那如何把寄來的信自動匯出成文字檔呢?
請問那如何把寄來的信自動匯出成文字檔呢?
因為我想對SERVER發出的信件直接存成TXT檔, 再寫程式去拆解
- 9樓.2009/09/30 14:50Outlook VBA 的想法
找了很久,終於找到 Outlook VBA 高手,我有以下2個需求經驗,不知您是否曾經碰過,若有,也敬請給予指點:- 以郵件主旨為檔名,將開啟的郵件另存附檔名為 .msg 的獨立 Outlook 郵件檔。
- Outlook 郵件規則只能設定『啟用』與『未啟用』,但很多時候,我不希望郵件一進來就套用已啟用的規則,而是在特定的時機,才手動點選我希望套用的郵件規則。
我的郵件設了很多規則,有沒有辦法設定一些類似批次檔的Outlook VBA,來執行郵件規則。(例如,批次處理A,執行規則1、2、3;批次處理B,執行規則4、5、6;批次處理C,...)
因為工作關係,我算是Outlook用很兇的使用者,希望能獲得指點!先謝謝囉! - 以郵件主旨為檔名,將開啟的郵件另存附檔名為 .msg 的獨立 Outlook 郵件檔。
8樓. virginia2009/09/11 17:21outlook VBA
我想使用把outlook附檔存出的程式,可是不太會用,
可以請問你的mail嗎

7樓. Money2009/08/03 22:36請教outlook+excel VBA
我們團隊常需要針對所有客戶發最新訊息的公告,而各客戶資料目前都使用excel管理,故我最近著手寫一支excel vba呼叫outlook發mail給所有客戶。讓vba直接抓第一欄當企業名,第二欄當mail,第三欄當窗口姓名....etc再設定一格儲存格放這次mail的內容。我曾學過vb和c,但都是很久遠的故事了....我目前只想到呼叫cmd+mailto:,但是看網路上有提及CDO呼叫,卻找不到相關說明,不知是否可以給一些指引呢?我曾用 CDO 寫過類似你想要的大量郵寄的 Excel VBA 程式,
還幫某位網友寫一個寄發房租帳單的 Excel VBA 程式,
只是一直沒把程式整理成文章,尤其最近雜事很多......
不過,上次發現 彰化一整天的Blog 裡有一個很完整的例子,
不妨去看看:
如何在Excel中自動寄送Email並夾帶檔案
ThisIsTheWay 於 2009/08/04 11:43回覆




