【问题标题】:Issues with detecting open file检测打开文件的问题
【发布时间】:2018-07-11 16:45:51
【问题描述】:

我从字面上复制、粘贴和测试了可能 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

【问题讨论】:

  • 你应该避免像瘟疫一样的On Error Resume Next。删除它,在每个场景中测试它,看看实际返回了什么错误(如果有的话)。然后捕获该特定错误。就个人而言,我还会添加代码以确保该文件甚至完全存在。
  • 删除了 On Error Resume Next 并收到 Runtime error '9' Subscript out of Range on this line
  • 设置 wBook = Workbooks("X:\Audit Tracking\Team_Larry\DailyReports\Larry_Blank.xlsm")
  • 这是因为 Workbooks 被解释为无维度数组。您显然没有使用正确的语法打开工作簿。
  • @BillHileman Workbooks 是一个对象集合,而不是一个数组。当集合中不存在指定的文件时,将引发错误 9,这正是设计使然。 OP 并未尝试在此处打开任何内容。

标签: vba fileopener2


【解决方案1】:

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

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

【讨论】:

  • 工作簿确实存在,但是当我从上面复制并粘贴代码时,我仍然收到“拉里的工作簿未打开”但它是
  • @rholdren 是否在另一台计算机上打开?花点时间阅读这个答案的顶部。
  • 复制并粘贴并输入文件是打开的,仍然告诉我它不是
  • 我已经在我的电脑上打开了
  • 将您使用的路径与Debug.Print Workbooks(1).FullName(或Workbooks(2).FullName,取决于文件是第一次打开还是第二次打开)进行比较。 如果其他人在另一台机器上打开它,你将无法知道。 Excel 会告诉你。
【解决方案2】:

当您打开 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

【讨论】:

    【解决方案3】:

    我相信你的代码会在你运行代码的计算机上测试你是否打开它。

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 2020-01-22
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多