检测Excel工作簿是否已打开

use*_*679 67 excel vba

在VBA中,我以编程方式打开了名为"myWork.XL"的MS Excel文件.

现在我想要一个可以告诉我其状态的代码 - 无论是否开放.就是这样的IsWorkBookOpened("myWork.XL)

Sid*_*out 82

试试这个:

Option Explicit

Sub Sample()
    Dim Ret

    Ret = IsWorkBookOpen("C:\myWork.xlsx")

    If Ret = True Then
        MsgBox "File is open"
    Else
        MsgBox "File is Closed"
    End If
End Sub

Function IsWorkBookOpen(FileName As String)
    Dim ff As Long, ErrNo As Long

    On Error Resume Next
    ff = FreeFile()
    Open FileName For Input Lock Read As #ff
    Close ff
    ErrNo = Err
    On Error GoTo 0

    Select Case ErrNo
    Case 0:    IsWorkBookOpen = False
    Case 70:   IsWorkBookOpen = True
    Case Else: Error ErrNo
    End Select
End Function
Run Code Online (Sandbox Code Playgroud)

  • 就个人而言,当恕我直言有更好的选择时,使用原始文件IO尝试在打开的Excel工作簿上读取文件时,我会感到非常不舒服:但也许它有效? (4认同)
  • @CharlesWilliams Fair点.虽然在我的情况下,当我尝试类似的东西实际*开放时间开销*在海外服务器上托管的大型模型大约2-3分钟.当它只是打开时,它给了一个"grrr"时刻,而上面的Sid的功能立即给出了响应.FWIW Bob Phillips在[vbaexpress](http://www.vbaexpress.com/kb/getarticle.php?kb_id=468)上列出了类似的功能,这是一个更先进的版本,等待从[Chip Pearson]其他地方关闭本书(http://www.cpearson.com/excel/WaitForFileClose.htm) (4认同)
  • +1 我已经使用这种方法一段时间来检查其他用户可以访问的新网络驱动器上的文件。我认为该代码最初发布在 msft 网站上。 (2认同)
  • @Charles Williams:是的,它可能是原始的,但它仍然是一个没有缺点的好代码.至少我不知道.:)试试吧也许你会喜欢它? (2认同)

Dic*_*ika 45

对于我的应用程序,我通常希望使用工作簿而不仅仅是确定它是否已打开.对于这种情况,我更喜欢跳过布尔函数,只返回工作簿.

Sub test()

    Dim wb As Workbook

    Set wb = GetWorkbook("C:\Users\dick\Dropbox\Excel\Hoops.xls")

    If Not wb Is Nothing Then
        Debug.Print wb.Name
    End If

End Sub

Public Function GetWorkbook(ByVal sFullName As String) As Workbook

    Dim sFile As String
    Dim wbReturn As Workbook

    sFile = Dir(sFullName)

    On Error Resume Next
        Set wbReturn = Workbooks(sFile)

        If wbReturn Is Nothing Then
            Set wbReturn = Workbooks.Open(sFullName)
        End If
    On Error GoTo 0

    Set GetWorkbook = wbReturn

End Function
Run Code Online (Sandbox Code Playgroud)

  • 我同意这通常是想要的:如果你想检查这本书是否已经在另一个 Excel 实例中打开,你可以检查它是否以只读方式打开 (2认同)

Cha*_*ams 18

如果它打开它将在Workbooks集合中:

Function BookOpen(strBookName As String) As Boolean
    Dim oBk As Workbook
    On Error Resume Next
    Set oBk = Workbooks(strBookName)
    On Error GoTo 0
    If oBk Is Nothing Then
        BookOpen = False
    Else
        BookOpen = True
    End If
End Function

Sub testbook()
    Dim strBookName As String
    strBookName = "myWork.xls"
    If BookOpen(strBookName) Then
        MsgBox strBookName & " is open", vbOKOnly + vbInformation
    Else
        MsgBox strBookName & " is NOT open", vbOKOnly + vbExclamation
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 查尔斯,我已经想到了这种方法.此方法的主要缺点是,如果在不同的Excel实例中打开工作簿,那么您将始终将值视为false :)另一种方法是添加代码以循环遍历所有Excel实例,然后使用您的代码.最终我意识到我正在编写更多代码,因此我使用了另一种方法.希德 (10认同)
  • 如果你想检查另一个Excel实例中正在打开的书(可能是因为你无法保存或编辑它),为什么不在打开它之后检查它的Readonly(如果是oBk.Readonly ...) (4认同)
  • 怎么分享呢? (2认同)

use*_*971 10

我会这样做:

Public Function FileInUse(sFileName) As Boolean
    On Error Resume Next
    Open sFileName For Binary Access Read Lock Read As #1
    Close #1
    FileInUse = IIf(Err.Number > 0, True, False)
    On Error GoTo 0
End Function
Run Code Online (Sandbox Code Playgroud)

作为sFileName,您必须提供文件的直接路径,例如:

Sub Test_Sub()
    myFilePath = "C:\Users\UserName\Desktop\example.xlsx"
    If FileInUse(myFilePath) Then
        MsgBox "File is Opened"
    Else
        MsgBox "File is Closed"
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)


Der*_*son 5

如果要检查而不创建另一个Excel实例怎么办?

例如,我有一个Word宏(反复运行),需要从Excel电子表格中提取数据。如果电子表格已在现有Excel实例中打开,则我不希望创建新实例。

我在这里建立了一个很好的答案:http : //www.dbforums.com/microsoft-access/1022678-how-check-wether-excel-workbook-already-open-not-search-value.html

感谢MikeTheBike和kirankarnati

Function WorkbookOpen(strWorkBookName As String) As Boolean
    'Returns TRUE if the workbook is open
    Dim oXL As Excel.Application
    Dim oBk As Workbook

    On Error Resume Next
    Set oXL = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then
        'Excel is NOT open, so the workbook cannot be open
        Err.Clear
        WorkbookOpen = False
    Else
        'Excel is open, check if workbook is open
        Set oBk = oXL.Workbooks(strWorkBookName)
        If oBk Is Nothing Then
            WorkbookOpen = False
        Else
            WorkbookOpen = True
            Set oBk = Nothing
        End If
    End If
    Set oXL = Nothing
End Function

Sub testWorkbookOpen()
    Dim strBookName As String
    strBookName = "myWork.xls"
    If WorkbookOpen(strBookName) Then
        msgbox strBookName & " is open", vbOKOnly + vbInformation
    Else
        msgbox strBookName & " is NOT open", vbOKOnly + vbExclamation
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)