網路城邦
上一篇 回創作列表 下一篇  字體:
[Outlook VBA] 把 email 附件檔全部存入一個資料夾
2009/03/05 13:17:46瀏覽29974|回應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 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

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

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

peggy
2018/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)

robin
2015/08/18 14:09
我想要知道,可以給我詳細的方式嗎rb11511@gmail.com感恩(rb11511@gmail.com)
ThisIsTheWay(WayCheng) 於 2016-03-02 19:15 回覆:

關於如何在 Outlook 裡執行VBA程式,請讀這一篇:「在 Outlook 裡使用巨集」



http://blog.udn.com/WayCheng/2989842



2014/05/13 10:58
你好  如果我要只下載今天的附件,該怎麼改呢?(s9456077(AT)gmail.com)

pxw
在Excel user form 中实现此程序
2012/05/07 01:54

你好,我目前遇到了一个问题,已经好几天了都没有进展。不知道你是否能帮我看看:

我需要实现把outlook中某个特定邮箱内,具有某些特定名字(subject)的邮件的excel格式的附件自动存入一个硬盘上的文件夹内。不过我不在Outlook中编辑代码,而是在excel的用户表中,我现在的问题是,我使用了 item.attachment.saveAs....语句,想把附件存在一个路径指明的文件夹内,但是出现 error messege,说明对象不支持此功能。。。。不知到你有什么办法没有?谢谢了。如果需要我下次把全部的代码贴上来。


islander
you a expert, how can i contact you
2010/02/19 14:38
I cannt find you email address

EugeneTsou
感謝大大無私的分享
2009/10/12 22:28

找了許多網頁,都找不太到討論outlook vba的網站,大大的文章詳細又清楚,讓我獲益良多。

想請問一下,該用甚麼方式可以將草稿中的信件複製一定的數量,並且在複製過程中,帶入客戶信箱(excel檔or text檔)。
我參考過大大提供 彰化一天的部落格,可是那個是excel檔,並且無法設定smtp的port,我還是比較希望在outlook的草稿中手動發送信件。

還煩請大大指引一下。
感恩!

ThisIsTheWay(WayCheng) 於 2009-11-11 06:31 回覆:
您的問題挺複雜的,可能必需雙向溝通,請利用會員功能看我的信箱地址,把詳細的問題描述 email 給我,我用 email 與您討論。

小肥汶
請問那如何把寄來的信自動匯出成文字檔呢?
2009/10/01 09:51

請問那如何把寄來的信自動匯出成文字檔呢?

因為我想對SERVER發出的信件直接存成TXT檔, 再寫程式去拆解



等級:
留言加入好友
Outlook VBA 的想法
2009/09/30 14:50
找了很久,終於找到 Outlook VBA 高手,我有以下2個需求經驗,不知您是否曾經碰過,若有,也敬請給予指點:
  1. 以郵件主旨為檔名,將開啟的郵件另存附檔名為 .msg 的獨立 Outlook 郵件檔。
  2. Outlook 郵件規則只能設定『啟用』與『未啟用』,但很多時候,我不希望郵件一進來就套用已啟用的規則,而是在特定的時機,才手動點選我希望套用的郵件規則。
    我的郵件設了很多規則,有沒有辦法設定一些類似批次檔的Outlook VBA,來執行郵件規則。(例如,批次處理A,執行規則1、2、3;批次處理B,執行規則4、5、6;批次處理C,...)
因為工作關係,我算是Outlook用很兇的使用者,希望能獲得指點!先謝謝囉!

virginia
outlook VBA
2009/09/11 17:21

我想使用把outlook附檔存出的程式,可是不太會用,

可以請問你的mail嗎  

ThisIsTheWay(WayCheng) 於 2009-09-14 15:19 回覆:

讀這篇吧!
http://blog.udn.com/WayCheng/2989842
ThisIsTheWay(WayCheng) 於 2009-09-13 18:47 回覆:
我的mail ?????
就在上面的 "作家簡介" 裡面


Money
請教outlook+excel VBA
2009/08/03 22:36
我們團隊常需要針對所有客戶發最新訊息的公告,
而各客戶資料目前都使用excel管理,
故我最近著手寫一支excel vba呼叫outlook發mail給所有客戶。
讓vba直接抓第一欄當企業名,第二欄當mail,第三欄當窗口姓名....etc
再設定一格儲存格放這次mail的內容。

我曾學過vb和c,但都是很久遠的故事了....
我目前只想到呼叫cmd+mailto:,但是看網路上有提及CDO呼叫,
卻找不到相關說明,不知是否可以給一些指引呢?
ThisIsTheWay(WayCheng) 於 2009-08-04 11:43 回覆:
我曾用 CDO 寫過類似你想要的大量郵寄的 Excel VBA 程式,
還幫某位網友寫一個寄發房租帳單的 Excel VBA 程式,
只是一直沒把程式整理成文章,尤其最近雜事很多......
不過,上次發現 彰化一整天的Blog 裡有一個很完整的例子,
不妨去看看:

如何在Excel中自動寄送Email並夾帶檔案



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