2017-02-15 82 views
3

我有,目前從一個.zip提取一個.xls以下,然後用新的名稱保存到指定的目錄展望VBA覆蓋磁盤上的現有文件

Public Sub saveAttachmentZip(itm As Outlook.MailItem) 

Const saveFolder = "C:\Temp\" 
Const fileFolder = "C:\Report\" 

Dim objAtt As Outlook.Attachment 
Dim oApp As Object 
Dim dName As Variant 

For Each objAtt In itm.Attachments 
    dName = objAtt.DisplayName 
    objAtt.SaveAsFile saveFolder & dName 
    Set oApp = CreateObject("Shell.Application") 
    oApp.NameSpace("C:\Report\").CopyHere _ 
      oApp.NameSpace(saveFolder & dName).Items 
      Name fileFolder & "Report.xls" As fileFolder & "NewReport.xls" 
      Kill saveFolder & dName 
Next 

End Sub 

我唯一的問題是,這個作品由於文件已經存在,一次然後失敗。爲了覆蓋現有文件,是否需要另存一種方法來保存它?

獎金信息

我也有做同樣的事情如下但是對於電子郵件,沒有壓縮擴展,這一個正確覆蓋磁盤上的現有文件

Public Sub saveAttach(itm As Outlook.MailItem) 

    Const fileFolder = "C:\Report\" 

    Dim objAtt As Outlook.Attachment 

    For Each objAtt In itm.Attachments 
     objAtt.SaveAsFile fileFolder & "\" & "OldReport.csv" 
     Set objAtt = Nothing 
    Next 

End Sub 

回答

3

根據我的測試,將CopyHere更改爲

oApp.NameSpace("C:\Report\").CopyHere _ 
     oApp.NameSpace(saveFolder & dName).Items, _ 
     4 + 16 

應該這樣做。

the docs,標誌4禁止進度對話框和標誌16強制「是所有」響應。

在舊版本的Windows中(我記得),「對所有人都是」是「覆蓋」響應,這似乎適用於我。

在Windows 8.1 Pro上的Word 2013 VBA中測試。我用靜態文件名檢查了這個,而不是與.Items集合。

+0

我仍然收到文件已存在的錯誤。幾乎看起來它甚至沒有達到Windows要求覆蓋文件的地步,而是代碼失敗,因爲它已經存在。 – Josh

+2

關掉你的思想,我將註釋重新命名爲文件的部分,然後刪除原文。這正確覆蓋該文件,所以我可以從那裏繼續。謝謝! – Josh

+0

你確定這段代碼甚至可以運行嗎?應用程序沒有名爲Namespace的屬性或函數。 GetNamespace函數只允許「MAPI」作爲其參數。沒有Outlook對象具有CopyHere方法。 –