網路城邦
上一篇 回創作列表 下一篇  字體:
[Outlook VBA] 把 email 附件檔全部存入一個資料夾
2009/03/05 13:17:46瀏覽35940|回應16|推薦2

*這裡所說的 "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 給我。

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=WayCheng&aid=2711617

 回應文章 頁/共 2 頁  回應文章第一頁 回應文章上一頁 回應文章下一頁 回應文章最後一頁

彼得鄧
等級:7
留言加入好友
不好意思,請教一下
2009/06/16 14:11

不好意思,想向您請教一下,如果我不是使用預設的"收件匣",而是我自己建的郵件目錄,還能使用GetDefaultFolder()嗎?如果不行,那要如何取得這個資料匣內的郵件呢?謝謝您!

附帶一句,您寫的真的很詳細耶!同時也很有耐心逐條解釋,真的很佩服您~~~

ThisIsTheWay(WayCheng) 於 2009-06-18 02:44 回覆:
謝謝您的鼓勵!其實我很懶得寫註解說明,有一些程式就是因為這樣而沒貼出來。

針對您的問題,我寫了這一篇:做出 Outlook 郵件資料夾的樹狀目錄

敬請指教!

rgb
好感動!終於讓我找到了
2009/06/02 23:40
將附件檔案取出,這段程式碼我找了好久阿,感嘆寫的人真的是不多阿,不然就是有程式碼,但是卻沒有說明,也看不懂。終於是看到有人做先驅,以後可能要常常來這裡請教請教了。
ThisIsTheWay(WayCheng) 於 2009-06-03 07:18 回覆:
謝謝!
我也有些感歎,對於 VBA 的文章,留言的人當中,UDN 的會員佔少數,非會員反而比較多!

vickihun
不懂程式如何在outlook中使用
2009/05/27 09:59

可以教我嗎?

ThisIsTheWay(WayCheng) 於 2009-05-28 09:35 回覆:
 好的,沒問題,請看這一篇:在 Outlook 裡使用巨集

pp
高手
2009/04/15 11:55

果然是高手捏!~網路上我找了很久都沒有找到有人寫outlookvba的

不知可以順道請教一下,若是要把收件夾內的所有資訊倒到excel不知該如何寫呢

ThisIsTheWay(WayCheng) 於 2009-04-15 20:30 回覆:
"高手" 的稱呼實不敢當! Outlook 的 VBA 真的很少人寫!

您沒說清楚 "收件匣內的資訊" 是指email 還是 email 的附件,

無論是何者,都不能 "倒" 到 Excel,能被倒進 Excel 的就

是 XLS 檔、CSV 檔、Lotus 123 的檔案......

不包括 Email

匿名
回复
2009/03/18 09:53
的确不错,我们公司要上Outlook2K7了,我会经常来求教学习的,呵呵
ThisIsTheWay(WayCheng) 於 2009-03-25 19:11 回覆:
歡迎常來,若有希望我寫哪方面問題的文章,請你留言給我。

瘦骨
等級:7
留言加入好友
謝謝您的分享
2009/03/05 23:41
謝謝您的分享,您真是一位VBA高手。我一直很想學如何開始VBA的程式設計,很多時候,只能用錄製巨集的方式,然後稍加修改,但是進步總是有限,希望藉由您的分享,學到更多VBA程式設計。加油!
ThisIsTheWay(WayCheng) 於 2009-03-06 17:07 回覆:

謝謝您! 你是第一位給我回應的, "高手" 實不敢當, 愛現罷了!

我還有很多小程式, 但總需要寫些解說, 以前寫的有些程式連註解都沒寫下

歡迎您常來!

頁/共 2 頁  回應文章第一頁 回應文章上一頁 回應文章下一頁 回應文章最後一頁