Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Access VBA获取已在服务器上打开(Excel)文件的用户的姓名?_Excel_Vba_Ms Access - Fatal编程技术网

如何使用Access VBA获取已在服务器上打开(Excel)文件的用户的姓名?

如何使用Access VBA获取已在服务器上打开(Excel)文件的用户的姓名?,excel,vba,ms-access,Excel,Vba,Ms Access,服务器(或网络共享存储位置)上有多个Excel文件 我有一个Access文档,需要访问这些Excel文件才能执行特定功能 当其中一个文件打开时,我无法执行VBA函数 我检查是否有人在使用该文件。这在下面的代码中 是否也可以找出谁在使用文件。我会通知他们关闭文件 我尝试过的一些方法(这些不是全部,但我再也找不到一些我也尝试过的方法): 在最后一个例子中,他们得到了文件的所有者,这与当时正在使用该文件的所有者不同。我试过了,但即使这样,我有时也会得到一个用户名,但创建文件的用户名,有时还会得到一个

服务器(或网络共享存储位置)上有多个Excel文件

我有一个Access文档,需要访问这些Excel文件才能执行特定功能

当其中一个文件打开时,我无法执行VBA函数

我检查是否有人在使用该文件。这在下面的代码中

是否也可以找出谁在使用文件。我会通知他们关闭文件

我尝试过的一些方法(这些不是全部,但我再也找不到一些我也尝试过的方法):

在最后一个例子中,他们得到了文件的所有者,这与当时正在使用该文件的所有者不同。我试过了,但即使这样,我有时也会得到一个用户名,但创建文件的用户名,有时还会得到一个SID(安全标识符?)

用于确定文件是否正在使用的代码。这不包括查看谁在使用该文件的任何内容

子测试文件打开()
Dim文件数组作为变量
filesArray=Array(“Map1.xlsx”、“Map2.xlsx”)
将文件位置设置为字符串
fileLocation=“\\DESKTOP-NETWORK\SharedFolder\NetwerkTest\”
将消息设置为字符串
对于FileArray中的每个文件
如果IsFileOpen(fileLocation&file),则
message=message&vbNewLine&“文件”&“文件”已打开
”“否则呢
“message=message&vbNewLine&“File”&“File&”已关闭!”
如果结束
下一个文件
MsgBox消息
端接头
用于检查文件是否正在使用的函数:

函数IsFileOpen(文件名为字符串)
Dim filenum为整数,errnum为整数
出错时继续下一步
filenum=FreeFile()
打开输入锁的文件名,读取为#filenum
关闭filenum
errnum=Err
错误转到0
选择Case errnum
案例0
IsFileOpen=False
案例70
IsFileOpen=True
其他情况
错误errnum
结束选择
端函数

当您尝试手动打开文件时,Access和Excel能够做到这一点。超级用户帖子:

好的,我不擅长编写下降宏,所以修改代码以满足您自己的需要

这应该给出当前打开Excel工作表的用户的名称:

Sub InUse(filename As String)
    Dim f
    Dim i
    Dim x
    Dim inUseBy
    Dim tempfile
    tempfile = Environ("TEMP") + "\tempfile" + CStr(Int(Rnd * 1000))
    
    f = FreeFile
    i = InStrRev(filename, "\")
    If (i > 0) Then
        filename = Mid(filename, 1, i) + "~$" + Mid(filename, 1 + i)
    Else
        filename = "~$" + filename
    End If
    
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    fso.CopyFile filename, tempfile
    
    Open tempfile For Binary Access Read As #f
    Input #f, x
    Close (f)
    inUseBy = Mid(x, 2, Asc(x))
    fso.Deletefile tempfile
    Set fso = Nothing

    MsgBox "InUse by: " + inUseBy, vbOKOnly, "InUse"
    
End Sub
示例用法:

InUse("T:\Book1.xlsx")
注意事项:

  • 当板材打开失败时(由于使用中),应使用此选项
  • 我没有找到任何文档说明这是一种“有效”的方法
  • 我不知道这是否也适用于共享excel工作表

  • 您可以将一些代码添加到要检查的文件中,这些文件将创建日志,然后您可以在代码中引用这些日志。这里有一个例子。谢谢你的解决方案!我不知道为什么您认为自己不擅长编写宏,因为您提供的代码工作得非常完美。一些提示:尝试添加一些注释,或者至少解释一下您在代码中所做的事情,现在我不得不做一些研究,但仍然不完全理解(很多)。例如,Mid函数,为什么它必须是“Mid(x,2,Asc(x))”?你在哪里找到的,又是怎么找到的?另外,尽量不要使用像“x,y,i”这样的短变量,而是给它们一个合适的名称。以上内容将有助于大家阅读和理解代码。为什么
    Mid(x,2,Asc(x))
    是因为我读过的
    x
    的第二个位置需要一些东西。这个宏最大的问题不是缺少我的注释,而是缺少有关Excel创建的tempfile(内部)格式的文档。您提供的代码工作得很好,但我在第
    inUseBy=Mid(x,2,Asc(x))
    行上不时出现错误,因为
    x
    为空。你知道原因是什么吗?如果问题出在
    tempfile
    上,我想应该更早抛出一个错误。由于某些原因,我无法在服务器上看到带有
    ~$
    的文件,但我可以在本地看到。也许这就是问题所在?但话说回来,为什么它大部分时间都工作,但只有几次不工作?…需要大量调试。。。。解决此问题的另一种方法可能是获取临时创建的文件的所有者。此文件通常是隐藏创建的,因此在资源管理器下可能不可见。但是,由于没有关于这方面的公开文档,我可以/不会花太多时间(对不起)。