簡體   English   中英

在 VBA 宏中打開/激活 Word 文檔

[英]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 的過程。 它有效,但應該有更好的解決方案。

請注意,可能會遇到各種問題:

  1. 如果您想在關閉文檔后重新打開它......Word/Windows 不會“釋放”文件名,您會收到“文件忙”消息或有關“創建臨時副本”的消息。 為了解決這個問題,我不得不開發一個精心設計的系統來創建/保存和整理我在 Word 應用程序中打開/操作的任何其他文檔的多個版本,因為 Office Open / Close / Save方法中的這個設計缺陷。

  2. 使用.Open方法將ReadOnlyRecommended屬性設置為False

  3. 如果您在嘗試操作之前不能確保doc object 仍然存在,則參考文檔 object(上面命名為文檔)可能會導致嚴重錯誤。 永遠記住,Word 是一個“開放”的應用程序平台......用戶可能會在最后幾毫秒左右做一些你沒想到的事情。 此建議適用於您可能希望在 Word 中操作的任何其他 object 或屬性。

  4. 如果您操作 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM