[英]Opening/Activating Word Documents in a VBA macro
我希望 VB/VBA 專家可以幫助我。 考慮以下情況:用戶在 Word 2003 中打開一個文檔,在 Normal.dot AutoOpen
宏中,我們查看當前文檔,如果它是通過單擊網頁上的鏈接打開的,並且滿足某些其他特定於應用程序的條件,關閉流式傳輸的“副本”並打開源文檔(在我們可以假設用戶有權訪問的共享驅動器上找到):
Documents.Open origDoc
Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges
Documents(origDoc).Activate
With ActiveDocument
''# Do work
End With
我的想法是我需要調用Activate
以確保原始文檔是ActiveDocument
,但我在.Activate
調用中收到 4160 'Bad file name' 錯誤。 如果我注釋掉對.Activate
的調用,似乎ActiveDocument
設置為 origDoc 文檔,即使已經打開了其他文檔(我不太確定如何管理 Documents Collection,以及 Word 如何確定下一個ActiveDocument
如果您以編程方式關閉當前的 ActiveDocument)
那么,在文檔上調用.Open
是否明確地將 Document 設置為ActiveDocument
? 另外,在已經激活的文檔上調用.Activate
會導致錯誤嗎?
我真的無法找到很多關於此的文檔,所以提前感謝您的任何建議和見解!
簡單的答案是肯定的。 通過使用您的代碼打開文檔,您可以將其設置為活動文檔,然后您在下一行關閉它並嘗試在下一行激活,但由於文檔不再打開而失敗。 VBA 通常似乎以這種方式工作。
小心使用 ActiveDocument 很重要,因為代碼或其他地方的哪些操作會使文檔“激活”並不總是不言而喻的(我沒有證據,但即使是自動保存也可能會這樣做)。 如果有任何疑問,您最好通過 Documents 集合引用文檔,盡管如果文檔不再打開,這也會導致錯誤,並且您可能不得不求助於遍歷集合以確保文檔是,其實開。 我在 excel VBA 遇到了很多這樣的問題,而 VBA 在這方面似乎與 ZC1C425268E68385D14ZA97 相同。
此外,VBA 在釋放應用程序對象方面存在問題。 如果你不小心,你最終會得到多個 WINWORD 進程,可以在任務管理器中查看,無論你是在代碼中關閉還是退出它們。 我發現解決此問題的代碼相當於模擬在任務管理器中選擇 END PROCESS 的過程。 它有效,但應該有更好的解決方案。
請注意,可能會遇到各種問題:
如果您想在關閉文檔后重新打開它......Word/Windows 不會“釋放”文件名,您會收到“文件忙”消息或有關“創建臨時副本”的消息。 為了解決這個問題,我不得不開發一個精心設計的系統來創建/保存和整理我在 Word 應用程序中打開/操作的任何其他文檔的多個版本,因為 Office Open
/ Close
/ Save
方法中的這個設計缺陷。
使用.Open
方法將ReadOnlyRecommended
屬性設置為False
如果您在嘗試操作之前不能確保doc
object 仍然存在,則參考文檔 object(上面命名為文檔)可能會導致嚴重錯誤。 永遠記住,Word 是一個“開放”的應用程序平台......用戶可能會在最后幾毫秒左右做一些你沒想到的事情。 此建議適用於您可能希望在 Word 中操作的任何其他 object 或屬性。
如果您操作 Documents 集合(或任何其他集合)而不確保文檔或其他 object 在集合中刪除或移動之前仍然存在且有效,您可以
得到“堆棧溢出”錯誤。 特別是如果您嘗試關閉/刪除從.item(1)
開始的集合中的對象。 您必須從最后一個集合中刪除項目,並記住,每當您.add/.remove/.close 項目時,集合 idicies 和指針都會更改。
你在這里有一個錯誤:
Document(origDoc).Activate
應該是 Document 。
是的,您可以激活活動文檔。 然后什么也沒有發生。
是的,打開的文檔變為活動狀態。 如果您不確定,請使用Documents.Open(origDoc).Activate
。
除非絕對必要,否則您不應該首先使用ActiveDocument
object,因為它非常不可靠。 首選的方法是:
Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges
Dim doc as Document
Set doc = Documents.Open(origDoc)
With doc
'Do work
End With
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.