У меня возникла проблема с автоматизацией файла Excel. Сценарий VBA в Excel сначала открывает приложение Word, и документ Word:Обнаружение, если объект был отключен от его клиентов
Dim wordApp As Object
Set wordApp = CreateObject("Word.Application")
vPath = Application.ActiveWorkbook.Path
Set wordDoc = wordApp.Documents.Open(vPath & "\test.doc")
И затем я вызвать подпрограмму в документ Word, проходя некоторые данные из файла Excel:
Call wordApp.Run("StartWithData", variable1, variable2)
Если Excel обнаруживает, что возникает ошибка в этой подпрограмме, я закрываю документ Word, и приложение Word, Excel из в метке я называю 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
Это отлично работает U при нормальных обстоятельствах; Однако, если документ слова или приложение закрыто до 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
Update 1:
Посмотрев на omegastripes' answer, я понял, что ошибка, приведенные выше только возникает, когда документ (wordDoc
) был объект, который был отключен. Если приложение Word (wordApp
) является то, что отсоединился, я получаю следующее сообщение об ошибке:
Run-time error '462':
The remote server machine does not exist or is unavailable
Почему бы вам просто не проверить объект ошибки? 'Err.Number' или' Err.Description'. Если объект отключен, потому что он закрыт, то проверить нечего - так что вы не можете это проверить. –
@MacroMan Это хорошая мысль; однако ошибка, которая возникает, - Ошибка 440: «Ошибка автоматизации», которая будет выбрана по нескольким причинам, включая отключенный объект, а также любую ошибку, возникающую при вызове удаленной процедуры (подпрограмма Word). – Jonathan
Я предполагаю, что вы можете проверить, все ли работает приложение Word (что довольно просто), но проверка того, что что-то отключена, будет очень сложной, если вообще возможно, тот факт, что это не связано, означает, что это свойства и методы невозможно получить доступ. Только то, что вы можете попробовать, это увидеть, возвращает ли объект 'wordApp'' Nothing' –