2016-08-15 206 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