2016-08-15 115 views
0

這很奇怪 - 我發誓,我只是使用此代碼成功,但不是它不工作:計數(和激活)打開Word文檔

Sub t() 
Dim wdApp As Object 
Set wdApp = GetObject(, "Word.Application") 
Debug.Print wdApp.Documents.Count 
End Sub 

從Excel中,它應該只是知道有一個Word文檔打開並返回1。但是,出於某種原因我得到0。我也試過Set wdApp = CreateObject("Word.Application").

我可以忽略什麼?沒有錯誤拋出,它只是沒有顯示我打開了一個文檔。

(注:我想到這個主意來自this thread,因爲我想複製一個Excel範圍並粘貼到Word文檔)

+1

我會檢查你的任務管理器,看看你是否有一個殭屍Word進程運行。 – Comintern

+0

@Comintern - Ooooooh,我有五個「WINWORD.EXE」正在運行。這隻適用於一個?編輯:是的,當我關閉所有四個殭屍並且只打開一個殭屍時它就起作用。感謝十億,這是一個(幸好)簡單的修復。如果你想做出答案,我會標記它。乾杯!! – BruceWayne

+1

爲了您的特定目的,是的。 'GetObject'只能返回一個應用程序對象,所以它看起來像沒有打開文檔就會得到一個。如果有多個實例在運行,我不確定選擇哪一個。 – Comintern

回答

5

GetObject只能返回一個Word.Application對象。如果您有多個實例在運行,打開文檔的計數可能會關閉(因爲您只計算一個實例)。不幸的是,從文檔中不清楚哪個應用程序在這個實例中,但是我猜你從wdApp.Documents.Count得到了0,因爲你正在附加殭屍Word程序。

2

也作爲最佳實踐,始終在錯誤處理中釋放資源,以便在宏成功或失敗時始終關閉此類進程。

Sub t() 
On Error Goto ErrHandle 
    Dim wdApp As Object 
    Set wdApp = GetObject(, "Word.Application") 

    Debug.Print wdApp.Documents.Count 

    Set wdApp = Nothing 
    Exit Sub 

ErrHandle: 
    Set wdApp = Nothing 
    Exit Sub 
End Sub 

如果從其他語言如Python,PHP,R等,正在運行的COM接口使用try/catch程序,總是很清楚這樣的對象,無論失敗或成功的。下面是在Python中的宏的對口:

import win32com.client 

try: 
    wdApp = win32com.client.Dispatch("Word.Application") 

    print(wdApp.Documents.Count) 

except Exception as e: 
    print(e) 

finally:  
    wdApp = None