2013-03-21 51 views
7

如何判斷Excel 2007電子表格是否打開並且WHO是否使用VBScript打開它?如何判斷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 
+1

@AnsgarWiechers它不是重複的。這篇文章是問如何確定一個Excel電子表格是否已經打開,這與我已經展示的代碼一致。我希望世衛組織能夠開放。我已經知道如何讓它開放。儘管我在尋找什麼,但我可能做錯了。 – Steven 2013-03-22 17:47:58

回答

11

我的天才要比同事提醒我關於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路徑將不起作用,您必須映射驅動器。這可以使用以下2行代碼完成:

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

希望有人會從中受益。我知道關於如何在網上做到這一點,沒有太多的信息,因爲我一直在尋找它!

+0

這種方法是如此天才!它確實解決了我的大問題。感謝分享! – lovechillcool 2015-04-11 00:14:54

+0

順便說一下,此方法僅適用於Excel 2007及更高版本的文件;它不適用於.xls – lovechillcool 2015-04-15 20:47:50

+0

@Steven我曾嘗試在VBA中使用它,它在我的本地C:\驅動器上正常工作,但在我們的服務器上運行此代碼時,所有從函數返回的都是NULL。是的,我確實將驅動器映射到了我在服務器上查詢的文件。有任何想法嗎? – Josh 2016-12-19 00:42:15

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 
+0

如果電子表格當前未打開,這會給我所尋找的內容。我當前的腳本以只讀方式打開文件,並且您無法從Workbook.UserStatus屬性中檢索任何內容,但不會收到錯誤信息,指出您無法訪問只讀文件...不確定從此處開始的位置。 – Steven 2013-03-22 18:19:13

+0

沒關係,我從同事的幫助,並找出它。 – Steven 2013-03-22 21:31:55

相關問題