需求与场景
在Excel的VBA中,打开Word文件是比较容易的,但判断某个word文件是否已经打开,则有些小坑需要注意。
因为工作需求,要把Excel中的数据写入到指定的word文件里(用链接的方式经常会出现word无响应的状况,而且数据量大的时候,打开速度实在太慢。),所以就研究了一下如何判断word文件是否被打开的情形。参考了一些资料,结合自己的理解,记录如下。
Excel VBA代码
① 首先要在ExcelVBA工程中引入word
工具-引用,选取MicroSoft Word xx.0 Object Library
②判断指定word文件是否打开(函数)
Function WordDocIsOpen(ByVal strDocName As String) As Boolean
'objWordDocName 这个变量的目的是接收一下循环出来的objWordDoc的文件名,
'如果没有的话会导致if条件无法正确判断(office2010试验后结果)
Dim objWordDocName As String
Dim objWordApp As Object
Dim objWordDoc As Object
On Error Resume Next '此句是关键,因为当word文件没有被打开时,会直接报错(GetObject:Run-time error '429':)
strDocName = UCase(strDocName) '将文件名字母全部大写。注意:这个参数变量必须是全路径+文件名
Set objWordApp = GetObject(, "Word.Application")
For Each objWordDoc In objWordApp.Documents '遍历当前在 Word 中打开的所有 Document 对象的集合
objWordDocName = UCase(objWordDoc.FullName) 'FullName是完整路径+文件名
If objWordDocName = strDocName Then
WordDocIsOpen = True
Exit For
Else
WordDocIsOpen = False
End If
Next
Set objWordDoc = Nothing '清变量
Set objWordApp = Nothing
End Function
③判断后,打开word文件(使用函数)
Sub OpenWord()
If WordDocIsOpen("D:\Test\test.docx") Then
MsgBox "该word文件已经被打开。"
Else
Set wrd = CreateObject("Word.Application")
wrd.Visible = True
wrd.Documents.Open fileName:="D:\Test\test.docx"
Set wrd = Nothing
End If
End Sub
④其他一些说明
1、判断word文件是否被打开以及打开了几个,要用GetObject
,而不能用CreateObject。
GetObject与CreateObject可以参看这个微软文档,写的很清楚。(无论多么简单的语言,都必须多看文档,少百度)
GetObject is used to attach to a running instance of an automation server.
CreateObject is used to start a new instance of an Automation server.
2、如果不想用objWordDoc.FullName
这种完整路径名的写法,可以用objWordDoc.Name
,参数文件名可以这样截取:
strPath = "D:\Test\test.docx"
docName = Right(strPath, Len(strPath) - InStrRev(strPath, "\"))
参考引用的资料
判断指定的WORD文档是否被打开的函数代码
微软文档:word与其他应用程序进行通讯
微软文档:word(Documents对象)