2015-11-13 134 views
4

我在自動化Excel文件時遇到問題。在Excel中VBA腳本首先打開Word應用程序和Word文檔:檢測對象是否與客戶端斷開連接

Dim wordApp As Object 
    Set wordApp = CreateObject("Word.Application") 

    vPath = Application.ActiveWorkbook.Path 
    Set wordDoc = wordApp.Documents.Open(vPath & "\test.doc") 

然後我打電話從Excel文件通過一些數據的Word文檔中的子程序:

Call wordApp.Run("StartWithData", variable1, variable2) 

如果Excel檢測發生錯誤在子程序中,我關閉從Excel的Word文檔和Word應用中的標籤我稱之爲Err1

On Error Goto Err1 
    'all the code from above 
    Exit Sub 

    Err1: 
    wordDoc.Close wdCloseWithoutSaving 
    wordApp.Quit SaveChanges:=wdDoNotSaveChanges 
    Set wordDoc = Nothing 
    Set wordApp = Nothing 

這工作完全正常ü正常情況下;但是,如果Word文檔或應用程序是在Err1標籤執行之前關閉(如用戶手動關閉文檔),我收到以下錯誤:

Run-time error '-2147417848 (80010108)':
Automation error The object invoked has disconnected from its clients.

這是非常合情合理的,因爲wordApp和/或wordDoc變量仍然引用應用程序和文檔對象,並且這些對象不再存在(但也不被認爲是Nothing)。

所以,這裏是我的查詢:有沒有辦法檢查是否有一個對象已經從運行時錯誤發生之前已斷開其客戶端,以避免依賴於on error resume next

Such as: 

    If Not isDisconnected(wordDoc) Then 
    wordDoc.Close wdCloseWithoutSaving 
    End If 

    If Not isDisconnected(wordApp) Then 
    wordApp.Quit SaveChanges:=wdDoNotSaveChanges 
    End If 

更新1:

看着omegastripes' answer後,我意識到,當文檔(wordDoc)是斷開了對象上面僅給出的錯誤發生。如果Word應用程序(wordApp)是什麼斷開了,我得到以下錯誤:

Run-time error '462':

The remote server machine does not exist or is unavailable

+0

爲什麼你不檢查錯誤對象? 'Err.Number'或'Err.Description' - 如果對象因爲關閉而斷開連接,那麼沒有什麼可檢查 - 所以你不能檢查它。 –

+0

@MacroMan這是一個很好的想法;然而,所引發的錯誤是錯誤440:「自動化錯誤」,它將由於幾種不同的原因而被拋出,包括被斷開連接的對象以及遠程過程調用(Word的子例程)中發生的任何錯誤。 – Jonathan

+0

我想你可以檢查Word應用程序是否仍在運行(這很簡單),但檢查是否有連接斷開將會非常棘手,如果可能的話,它沒有連接的事實意味着它是屬性和方法無法訪問。只有其他的東西你可以嘗試看看'wordApp'對象是否返回'Nothing' –

回答

3

考慮下面的例子:

Sub Test() 
    Dim wordApp As Object 
    Dim wordWnd As Object 
    Dim wordDoc As Object 

    Set wordApp = CreateObject("Word.Application") 
    Set wordWnd = wordApp.Windows ' choose any object property as indicator 
    wordApp.Visible = True ' debug 
    Set wordDoc = wordApp.Documents.Open(Application.ActiveWorkbook.Path & "\test.doc") 
    MsgBox IsObjectDisconnected(wordWnd) ' False with opened document 
    wordDoc.Close 
    MsgBox IsObjectDisconnected(wordWnd) ' False with closed document 
    wordApp.Quit ' disconnection 
    MsgBox IsObjectDisconnected(wordWnd) ' True with quited application 
End Sub 

Function IsObjectDisconnected(objSample As Object) As Boolean 
    On Error Resume Next 
    Do 
     IsObjectDisconnected = TypeName(objSample) = "Object" 
     If Err = 0 Then Exit Function 
     DoEvents 
     Err.Clear 
    Loop 
End Function 

似乎任何類型的檢測變量,其引用的內在Word對象,如.Documents,.Windows,.RecentFiles等等,在文檔關閉或應用程序退出命令被立即調用後,可能會拋出錯誤14:Out of string space,而Word應用程序正在處理該命令。對Application對象進行同樣的檢測,也可能會掛起Excel應用程序。

在這個例子中TypeName()調用包裝成OERN循環,應該跳過不相關的結果得到明確的斷線反饋,依靠類型名,但不是在錯誤號。爲避免掛起,.Windows屬性被檢查而不是Application

+0

這很聰明!注意文檔(例如'wordDoc')通常具有「Document」類型,但在斷開連接時更改爲「Object」是有用的。 不幸的是,您的答案只適用於問題的一半。這是因爲應用程序(例如'wordApp')在斷開連接後仍然具有「應用程序」類型。所以,即使我可以檢測到文檔何時與您的答案斷開連接,我仍然無法檢測應用程序本身何時斷開連接。但是,您讓我意識到應用程序斷開連接時會發生不同的錯誤(請參閱Update 1)。 – Jonathan

+0

@Jonathan - 那麼爲什麼不把錯誤14陷入'IsObjectDisconnected'?我很困惑,爲什麼你不願意使用錯誤處理程序來檢測錯誤情況。 – Comintern

+0

@Jonathan,Document不能單獨斷開連接,因爲它只是Word對象的一個​​屬性。只有整個應用程序可能會斷開連接。檢查變量的類型,即涉及到其中一個屬性,顯示應用程序的實際狀態。因此,如果對Document屬性的引用類型是「Object」,那麼它明確表示應用程序已斷開連接。 – omegastripes

相關問題