如何判断Excel 2007电子表格是否打开,世卫组织是否使用VBScript打开它

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

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

我已经想出了谁来确定工作簿是否已经打开。 这是一个解决方法,但我基本上打开工作簿,并检查它是否是只读的。 这很好, 我已经testing过了。

我知道这是可能的,因为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 

我的Genious的同事提醒我关于Excel的“locking”文件。 打开excel时,您将创build一个隐藏的系统文件,其中包含打开文件的人员的姓名。 locking文件在电子表格名称之前以“〜$”开头。 例:

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

这也是一个更快,更简单的方法来检查文件是否打开,因为你没有像我之前做的那样实际打开文件。 现在我只是检查locking文件是否存在,如果存在,我检查locking文件的“所有者”是谁,当前打开电子表格的人员是谁。 希望这将有助于未来的人!

这是我的代码,完美的作品:

 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函数的胆量。 我链接到网站,我在那里得到了代码的function。

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

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

希望有人会从中受益。 我知道有没有关于如何在网上做这个事情的信息,因为我一直在寻找它!

你有没有尝试过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