【问题标题】:Close an Excel file from a network drive via a user form通过用户表单从网络驱动器关闭 Excel 文件
【发布时间】:2019-09-09 12:55:49
【问题描述】:

我在 Excel 中有一个用户表单,它充当数据输入机制。此数据保存在共享驱动器上的 Excel 工作表中。所以它是一个 UI 和数据存储,都在 Excel 中。

由于在我将数据从 userform 发布到 Excel 网络驱动器之前我们可能有多个用户,我检查文件是否在任何 Excel 实例中打开,如果是,我想关闭 Excel 文件所以我不没有并发问题。

Dim bFileOpen As Boolean
    bFileOpen = IsWorkBookOpen("\\NTSYDFSP150\Shared\fmd\credit\LEM_Reports\SV Test\Test.xlsx")

    If bFileOpen Then
        MsgBox "File is open and is being closed now "

        Workbooks("\\NTSYDFSP150\Shared\fmd\credit\LEM_Reports\SV Test\Test.xlsx").Close SaveChanges:=False

End If


Function IsWorkBookOpen(FileName As String)
    Dim ff As Long
    Dim 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
    End Select
End Function

我收到以下行的错误:

Workbooks("\\NTSYDFSP150\Shared\fmd\credit\LEM_Reports\SV Test\Test.xlsx").Close SaveChanges:=False

说:

下标超出范围

【问题讨论】:

  • 没有办法做到这一点 - 打开它的人必须关闭它。您将不得不想出另一种方法来更新它。这是创建数据库的原因之一,以避免此类问题。

标签: excel vba


【解决方案1】:
Workbooks("\\NTSYDFSP150\Shared\fmd\credit\LEM_Reports\SV Test\Test.xlsx").Close SaveChanges:=False

这是隐含的:

Application.Workbooks(...).Close SaveChanges:=False

您查询的Workbooks 集合是在当前应用程序实例中打开的所有工作簿的集合

如果没有首先获得该 Application 对象,则无法关闭在另一个 Application 实例中打开的工作簿......而且这在网络上是不可能的:你问你的VBA 代码用于关闭在另一台计算机上运行的应用程序进程 - 没有一些严格的管理员权限,我不明白你怎么能做到这一点。

考虑使用 Microsoft Access,或者为此类事情使用 SQL Server 后端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2018-04-17
    • 2018-11-14
    相关资源
    最近更新 更多