如何判断Excel 2007电子表格是否已打开且WHO是否已使用VBScript打开它

Ste*_*ven 9 vbscript excel excel-2007

如何判断Excel 2007电子表格是否已打开且WHO是否已使用VBScript打开它?

我试图弄清楚Excel工作簿当前是否由另一个用户打开并返回该用户在我的脚本中的用户.

我已经找出了确定工作簿目前是否开放的人.这是一种解决方法,但我基本上打开工作簿并检查它是否是只读的.这很完美; 我测试了它.

我知道这是可能的,因为如果您通过浏览器打开文件,Excel会为您提供打开文件的用户.

这是我的代码(isWorkbookOpen.vbs):

Set objExcelTestWorkbook = CreateObject("Excel.Application")
objExcelTestWorkbook.DisplayAlerts = False 'doesn't display overwrite alert
testWorkbookFile = "I:\test_workbook.xlsx"
Set objBook = objExcelTestWorkbook.Workbooks.open(testWorkbookFile)

If objBook.ReadOnly Then
    Wscript.echo "The file is read only"
    Call EndScript
Else
    Wscript.echo "The file is available"
    Call EndScript
End If

Function EndScript
    objExcelTestWorkbook.Workbooks.close
    objExcelTestWorkbook.Quit
    WScript.Echo "Closed " & testWorkbookFile
    WScript.Quit
End Function
Run Code Online (Sandbox Code Playgroud)

另外,我从命令行运行它:

cscript isWorkbookOpen.vbs
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 13

我的Genious同事提醒我关于Excel的"锁定"文件.打开excel时,您将创建一个隐藏的系统文件,其中包含打开文件的人员姓名.锁定文件以电子表格名称前的"〜$"开头.例:

如果你有一个名为testWorkbook.xlsx它的电子表格,它的锁定文件将~$testWorkbook.xlsx位于同一目录中.

这也是一种检查文件是否打开的更快速,更简单的方法,因为您实际上并没有像以前那样打开文件.现在我只是检查锁文件是否存在,如果存在,我检查谁是锁文件的"所有者",那将是当前打开电子表格的人.希望这将有助于将来的人!

这是我的代码完美无缺:

testWorkbookLockFile = "I:\~$test_workbook.xlsx"
Set objFSO = CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(testWorkbookLockFile) Then
    WScript.Echo "The file is locked by " & GetFileOwner(testWorkbookLockFile)
Else
    WScript.Echo "The file is available"
End If

Function GetFileOwner(strFileName)
    'http://www.vbsedit.com/scripts/security/ownership/scr_1386.asp
    Set objWMIService = GetObject("winmgmts:")
    Set objFileSecuritySettings = _
    objWMIService.Get("Win32_LogicalFileSecuritySetting='" & strFileName & "'")
    intRetVal = objFileSecuritySettings.GetSecurityDescriptor(objSD)

    If intRetVal = 0 Then
       GetFileOwner = objSD.Owner.Name
    Else
       GetFileOwner = "Unknown"
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

我想指出我没有编写GetFileOwner函数的内容.我链接到我在函数中获得该代码的网站.

此外,如果您没有将位置映射到电子表格并且它位于网络上,则UNC路径将不起作用,您必须映射驱动器.这可以使用以下两行代码完成:

Set objNetwork = WScript.CreateObject("WScript.Network")
objNetwork.MapNetworkDrive "Z:", "\\Server1\Share1"
Run Code Online (Sandbox Code Playgroud)

希望有人能从中受益.我知道在网上没有太多关于如何做到这一点的信息,因为我一直在寻找它!