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

时间:2013-03-21 18:38:00

标签: excel vbscript 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

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

cscript isWorkbookOpen.vbs

2 个答案:

答案 0 :(得分:12)

My 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

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

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

Set objNetwork = WScript.CreateObject("WScript.Network")
objNetwork.MapNetworkDrive "Z:", "\\Server1\Share1"

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

答案 1 :(得分:1)

您是否尝试过Workbook.UserStatus属性?以下是Excel VBA帮助中的代码段引用:

users = ActiveWorkbook.UserStatus
With Workbooks.Add.Sheets(1)
    For row = 1 To UBound(users, 1)
    .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