2017-08-25 63 views
1

我有我分發的Excel VBA代碼來生成一些報告。代碼有錯誤,我現在修復了它們。我想更新最終用戶。Excel VBA:SaveAs,然後查殺舊文件有權限錯誤

假設代碼在宏工作簿「software.xlsm」中,就像他們輸入的任何數據一樣。

我所做的是創建「軟件v1.0.1.xlsm」。它檢查「software.xlsm」的存在並將其中的所有數據和參數複製到它自己。然後將「software.xlsm」重命名爲「software v1.0.0.xlsm.old」,並將其自身保存爲「software.xlsm」。在這一點上,Excel非常高興這是該工作簿的新名稱。

剩下的就是刪除「更新」。但這是我遇到許可錯誤的地方--Excel不會讓我殺死它。它沒有在其他地方使用,並且好像Excel不放棄原始文件名。

這是我的代碼:

set newWb = ActiveWorkbook 
thisName = newWb.FullName     ' get full name of updater 
newWb.SaveAs newWb.Path & "\software.xlsm" ' save updater as code file 
Kill thisName        ' delete updater <!! FAILS 

我撕我的頭髮在這裏。我在網上查了一下,我在做什麼應該可以工作 - 但不是!

謝謝。

編輯:我應該提到,我也試過SetAttr在文件上,這也沒有效果。

編輯2:我不確定我是否清楚自己想做什麼。我想擺脫updater一旦運行,以免混淆用戶。因此,我使用「另存爲」將更新程序保存爲一個新名稱,該名稱將兩個文件保留在磁盤上,並在Excel中打開一個文件。然後我試圖殺死/刪除在Excel中不再打開的文件(即,在我用新名稱保存之前的更新程序)。

+2

您必須先關閉它,然後才能刪除它。 – braX

+0

@braX儘管我已經完成了「SaveAs」?此時我在磁盤上有兩個文件 - 一個帶有新名稱,另一個帶有舊名稱。具有新名稱的名稱是開放的名稱,如Excel上的標題欄所示。它不能有_both_打開,可以嗎? 而且在任何情況下,工作簿都是帶有代碼的。如果關閉工作簿,則無法運行代碼將其刪除! 在網絡上的其他論壇中有這樣的例子,它顯示了正確的方式來做到這一點,下面有「它有效」的評論。 – StuartR143

回答

0

newWb.Close(你必須關閉它之前,你可以刪除)

您也可以嘗試變量設置爲無。

Set newWb = Nothing

+0

即使我已經做了「另存爲」?此時我在磁盤上有兩個文件 - 一個帶有新名稱,另一個帶有舊名稱。具有新名稱的名稱是開放的名稱,如Excel上的標題欄所示。它不能同時打開,可以嗎?在任何情況下,工作手冊都是帶有代碼的手冊。如果關閉工作簿,則無法運行代碼將其刪除!在網絡上的其他論壇中有這樣的例子,它顯示了正確的方式來做到這一點,下面有「它有效」的評論。 – StuartR143

+0

使用'set newWb = Nothing'也不幫助我。 – StuartR143

+0

將工作簿設置爲空不會關閉它。它所做的只是將指向工作簿的指針更改爲「Nothing」。 –

0

您所遇到的錯誤是因爲你試圖訪問具有自SaveAs後改變工作簿的FullName。例如。如果我有FullName "SomeFilePath.foo"的工作簿,並且我做了SaveAsFullName & ".old"FullName現在是"SomeFilePath.foo.old"

這是有道理的,但你被絆倒的部分是你的thisname變量。例如:

Dim thisName as String 
thisName = ActiveWorkbook.FullName 

Debug.Print thisName ' E.G "SomeFilePath.Foo" 
ActiveWorkbook.SaveAs ActiveWorkbook.FullName & ".old" 

Debug.Print thisname ' Still "SomeFilePath.Foo" 

舊名稱的工作簿根本不存在了。它已被更改爲新名稱。

我們如何解決這個問題?你可以找到新的名字,但它仍然Kill它,但你沒有看到Kill往往是有原因的,這是一個不好的做法。

理想的做法是妥善託管和參考您的工作簿。例如:

thisName = thisWorkbook.FullName 
thisWorkbook.SaveAs thisWorkbook.FullName & ".old" 
thisWorkbook.Close(False) 

我們快到了。我們正在保存工作簿並關閉當前工作簿,但這實際上並不是我們想要的。我們需要的是:

thisWorkbook.SaveCopyAs thisWorkbook.FullName & ".old" 
thisWorkbook.Close(False) 

而不是更改更新工作簿的FilePath,只需複製它。它不僅更加清潔,而且它使我們無需擔心當代碼正在運行時我們弄亂了文件時可能發生的奇怪事情。

但請注意,您將希望將輸出文件路徑改爲您實際打算的路徑。 ".old"純粹是例如。同樣,ThisWorkbook.Close(False)並不理想,但如果您必須在完成後立即關閉,那麼這將最好。

TLDR:權限被拒絕錯誤是由於在進程內不再存在工作簿而引起的。