Excel VBA Filedialog:检查.selecteditems(1)是否被另一个用户打开

我正在使用Filedialog来select一个文件,但我需要知道该文件是否打开。 我曾尝试使用GetAttr,但我总是得到代码32(文件已被更改,因为上次备份)我也尝试从MSDN使用IsFileOpen( https://support.microsoft.com/en-us/help/291295/macro-code检查文件是否已经打开 ),但是当我的同事打开这个文件时,这个方法总是返回我自己的用户。 当文件closures时,IsFileOpen按预期工作,正如我在同事closures文件时testing的那样。

我应该如何继续执行IsFileOpen以返回我的同事的用户名,而不是我自己的?

更新3和回复里卡多·罗德里格斯:从MSDN上的文章提出的解决scheme不会返回我所需要的,恐怕…(“UserStatus属性不会返回有指定工作簿打开为已读的用户的信息- 只。“) MSDN

更新2和回复蒂姆·威廉姆斯和里卡多·罗德里格斯:我现在看到我的错误通过使用GetFileOwner过程…当然,它给我自己的用户名,因为它实际上是我创build文件…

李嘉图:我会testing你的程序,然后恢复

更新并回复Tim Williams:

Function GetFileOwner(fileDir As String, fileName As String) As String 'On Error Resume Next Dim secUtil As Object Dim secDesc As Object Set secUtil = CreateObject("ADsSecurityUtility") Set secDesc = secUtil.GetSecurityDescriptor(fileDir & fileName, 1, 1) GetFileOwner = secDesc.Owner 

结束function

我相信你要找的是UserStatus属性( 文档 )

返回基于1的二维数组,该数组提供有关将工作簿打开为共享列表的每个用户的信息。 第二维的第一个元素是用户的名字,第二个元素是用户上次打开工作簿的date和时间,第三个元素是一个表示列表types的数字(1表示排他,2表示排他共享)。 只读变体。

本示例将创build一个新的工作簿,并向其中插入关于将活动工作簿打开为共享列表的所有用户的信息。

 users = ActiveWorkbook.UserStatus With Workbooks.Add.Sheets(1) For row = 1 To UBound(users, 1) .Cells(row, 1) = users(row, 1) .Cells(row, 2) = users(row, 2) Select Case users(row, 3) Case 1 .Cells(row, 3).Value = "Exclusive" Case 2 .Cells(row, 3).Value = "Shared" End Select Next End With