检查word文件是不是已经打开vba

Posted

技术标签:

【中文标题】检查word文件是不是已经打开vba【英文标题】:Checking if word file is already open vba检查word文件是否已经打开vba 【发布时间】:2019-04-29 07:52:38 【问题描述】:

在打开 Word 文件之前,我想检查一下这个文件是否已经打开。 (更多word文件同时打开) 主子调用这个函数告诉我它是否打开。

Function FileInWdOpen(DokName As String) As Boolean                 

    Dim wd As Word.Application
    Dim wDoc As Word.Document

    On Error Resume Next                                            
    Set wd = GetObject(, "Word.Application")
    On Error GoTo NO_WORD_FOUND                                     

    If wd Is Nothing Then                                           
        FileInWdOpen = False
    End If

    For Each wDoc In wd.Documents        'should check for every open word file but doesn't do that                         
        If wDoc.Name = DokName Then      'checks if this file is named like the one I want to check if its open or not                           
            FileInWdOpen = True
            Exit Function                                           
        End If
    Next                                                            

    FileInWdOpen = False                                            

    Exit Function

NO_WORD_FOUND:       

    FileInWdOpen = False                                            

End Function

当只打开一个 word 文件时,此代码运行良好。如果打开了两个或更多文件,则脚本不起作用。

问题在于 for 循环只检查第一个打开的文件。

我不明白为什么它不检查所有打开的文件。 我认为可以通过以下方式访问所有文档:

Dim WordApp As Word.Application                 'sets an var for the Word Application
Set WordApp = GetObject(, "Word.Application")   'give the var an obj, in this case the Word Application

Dim WordDoc As Word.Document                    'sets an var for the singel Word Documents
For Each WordDoc In WordApp.Documents           'for each Document in Dokuments
    'code
Next

那么为什么只关注第一个文档呢?

【问题讨论】:

你不需要循环。只需尝试分配文档。如果结果为空,则文档未打开。例如设置 wDoc = wd.Documents(Dokname);如果 wdoc 什么都不是,那么..... 对不起。在 set 语句之前,您将需要一个 on Error resume next。 它是检查您要检查的文件名的第一个文档吗?如果是,那么它将退出循环,因为这就是您告诉代码要做的事情 - 事实上,您是在告诉它离开整个 FUNCTION (Exit Function)。我假设你的意思是Exit For,这样它就只会留下循环...... 当我尝试使用wd.Documents.Count 进行检查时,结果为 1,即使两个 Word 应用程序都已打开。 @Freeflow 伟大的想法,但它对我不起作用。我认为它的 bc 在 wd obj 中只有一个 Document。 @Cindy Meister,退出函数适用于我的情况,如果文档打开,我返回 true 并退出函数,因为所有其他文档的名称对我来说并不重要。所以我的论点是,每个文档都有一个单词应用程序。有没有办法让所有应用程序都在一个 obj vba 中进行检查?也许我错了……什么都不确定了。 如果您的宿主应用程序是 Word,那么您不需要创建另一个 Word 应用程序,例如第一个代码示例中的 WD 对象。 【参考方案1】:

这个可行 - 最后,我花了几个小时才找到解决方案。但我仍然错过了以下问题的答案:

我的网络中的用户正在从服务器打开 Word 文件 - 我如何在 VBA 中找出哪个用户打开了(并保持打开状态)?

Function FileInWordOpen(DokName As String) As Boolean
Dim wd As Word.Application
Dim wDoc As Word.Document
Dim i As Long, s As String
On Error Resume Next
Set wd = GetObject(, "Word.Application")
On Error GoTo NO_WORD_FOUND
If wd Is Nothing Then
    FileInWordOpen = False
End If
For i = 1 To wd.Documents.Count
  s = wd.Documents(i)
  If InStr(DokName, s) <> 0 Then
     FileInWordOpen = True
     Exit Function
  End If
Next



'For Each wDoc In wd.Documents        'should check for every open word file but doesn't do that
'    If wDoc.Name = DokName Then      'checks if this file is named like the one I want to check if its open or not
'        FileInWdOpen = True
'        Exit Function
'    End If
'Next


NO_WORD_FOUND:

 FileInWordOpen = False

 End Function




    
    Function GetOpenWordDoc(DokName As String) As Word.Document
        Dim wd As Word.Application
        Dim wDoc As Word.Document
        Dim i As Long, s As String
        On Error Resume Next
        Set wd = GetObject(, "Word.Application")
        On Error GoTo NO_WORD_FOUND
        If wd Is Nothing Then
            Set GetOpenWordDoc = Nothing
        End If
        For i = 1 To wd.Documents.Count
          s = wd.Documents(i)
          If InStr(DokName, s) <> 0 Then
             Set GetOpenWordDoc = wd.Documents(i)
             Exit Function
          End If
        Next
        
    
   NO_WORD_FOUND:
    
        Set GetOpenWordDoc = Nothing
    
    End Function

【讨论】:

以上是关于检查word文件是不是已经打开vba的主要内容,如果未能解决你的问题,请参考以下文章

word2010 无法创建工作文件 请检查临时环境变量

怎么样快捷判断WORD\EXCEL\PDF\图片等文件,是不是已经损坏,或者判断文件是不是完好。

python xlrd 检查文件是不是已经打开

检查文件是不是打开[重复]

word打不开,显示检查文档或驱动器的文件权限

word无法创建工作文件 请检查临时环境变量