检测打开文件的问题

时间:2018-07-11 16:45:52

标签: vba fileopener2

我从字面上复制并粘贴并测试了可能的BB的每一段代码,并且所有这些都发生了相同的事情。他们都告诉我文件是打开还是关闭的,或者告诉我文件是打开还是关闭的。代码永远不会正确。这是我尝试过的最后一件事,它告诉我它什么时候没打开都没有打开

有人可以告诉我这是否是由于文件位于网络上

Sub Is_WorkBook_Open()

    Dim wBook As Workbook



    On Error Resume Next


    Set wBook = Workbooks("X:\Audit Tracking\Team_Larry\DailyReports\Larry_Blank.xlsm")

    'Not open

    If wBook Is Nothing Then

        MsgBox "Larry's Workbook is not open, Proceed to posting", vbCritical

        Set wBook = Nothing

        On Error GoTo 0

        'It is open
    Else

        MsgBox "Yes it is open, Notify Supervisor to close file", vbInformation

        Set wBook = Nothing

        On Error GoTo 0

    End If

End Sub

3 个答案:

答案 0 :(得分:0)

  

它告诉我它什么时候都没有打开

Application.Workbooks集合包含在Excel.Application中在此情况下打开的所有工作簿 ;如果工作簿是由另一台计算机上的其他人打开的,则该工作簿不在集合中,并且您无法使用该方法来知道这一点。

如果您在Office 365上使用最新,最出色的Excel 2016,请查看如何使用co-authoring功能完全消除该担忧。

否则,您可以尝试共享工作簿,然后Excel可以准确告诉您打开了该工作簿的人,但是共享工作簿有很多问题,包括但不是限于无法编辑VBA代码。

使用硬编码路径也是获得假阴性的好方法。打开文件,验证其实际FullName并使用它。

Dim i As Long
For i = 1 To Application.Workbooks.Count
    Debug.Print Application.Workbooks(i).FullName
Next

如果文件的位置并不重要,只需文件名,就可以迭代打开的文件并查看文件名是否匹配:

Dim i As Long
For i = 1 To Application.Workbooks.Count
    If Application.Workbooks(i).Name = "Larry_Blank.xlsm" Then
        MsgBox "File is opened."
        Exit For
    End If
Next

答案 1 :(得分:0)

enter image description here

当您打开Excel工作簿时,将创建该工作簿的隐藏临时副本。大概是用来恢复崩溃的文件。请注意,临时工作簿的名称和路径与实际工作簿相同,但在文件名前加上~$。由于文件路径保持不变,因此我们可以假设↓`isWorkbookOpen()↓即使在映射和共享文件夹下也可以使用。

Function isWorkbookOpen(Path As String) As Boolean
    Dim values() As String
    values = Split(Path, "\")
    values(UBound(values)) = "~$" & values(UBound(values))
    Path = Join(values, "\")

    isWorkbookOpen = Len(Dir(Path, vbHidden)) > 0
End Function

答案 2 :(得分:0)

我相信您的代码将在您从中运行代码的计算机上测试是否将其打开。

此代码将打开工作簿,如果它以只读状态打开,则其他人将其打开。注意:如果您在计算机上打开它,然后在同一台计算机上运行此代码,它将报告它不是处于只读状态。

Sub Test()
Dim oWB As Workbook

Set oWB = Application.Workbooks.Open("C:\Temp\test.xlsx")      

If oWB.ReadOnly Then
    MsgBox "Open"
Else
    MsgBox "Closed"
End If
oWB.Close

End Sub