如何使用Access VBA获取已在服务器上打开(Excel)文件的用户的姓名?
服务器(或网络共享存储位置)上有多个Excel文件 我有一个Access文档,需要访问这些Excel文件才能执行特定功能 当其中一个文件打开时,我无法执行VBA函数 我检查是否有人在使用该文件。这在下面的代码中 是否也可以找出谁在使用文件。我会通知他们关闭文件 我尝试过的一些方法(这些不是全部,但我再也找不到一些我也尝试过的方法): 在最后一个例子中,他们得到了文件的所有者,这与当时正在使用该文件的所有者不同。我试过了,但即使这样,我有时也会得到一个用户名,但创建文件的用户名,有时还会得到一个SID(安全标识符?) 用于确定文件是否正在使用的代码。这不包括查看谁在使用该文件的任何内容如何使用Access VBA获取已在服务器上打开(Excel)文件的用户的姓名?,excel,vba,ms-access,Excel,Vba,Ms Access,服务器(或网络共享存储位置)上有多个Excel文件 我有一个Access文档,需要访问这些Excel文件才能执行特定功能 当其中一个文件打开时,我无法执行VBA函数 我检查是否有人在使用该文件。这在下面的代码中 是否也可以找出谁在使用文件。我会通知他们关闭文件 我尝试过的一些方法(这些不是全部,但我再也找不到一些我也尝试过的方法): 在最后一个例子中,他们得到了文件的所有者,这与当时正在使用该文件的所有者不同。我试过了,但即使这样,我有时也会得到一个用户名,但创建文件的用户名,有时还会得到一个
子测试文件打开()
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")
注意事项:
您可以将一些代码添加到要检查的文件中,这些文件将创建日志,然后您可以在代码中引用这些日志。这里有一个例子。谢谢你的解决方案!我不知道为什么您认为自己不擅长编写宏,因为您提供的代码工作得非常完美。一些提示:尝试添加一些注释,或者至少解释一下您在代码中所做的事情,现在我不得不做一些研究,但仍然不完全理解(很多)。例如,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
上,我想应该更早抛出一个错误。由于某些原因,我无法在服务器上看到带有~$
的文件,但我可以在本地看到。也许这就是问题所在?但话说回来,为什么它大部分时间都工作,但只有几次不工作?…需要大量调试。。。。解决此问题的另一种方法可能是获取临时创建的文件的所有者。此文件通常是隐藏创建的,因此在资源管理器下可能不可见。但是,由于没有关于这方面的公开文档,我可以/不会花太多时间(对不起)。