如何判断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
答案 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