2013-03-21 15 views
7

Wie kann ich feststellen, ob ein Excel 2007-Arbeitsblatt geöffnet ist und wer es mit VBScript geöffnet hat?Wie kann ich feststellen, ob ein Excel 2007-Arbeitsblatt geöffnet ist und mit VBScript geöffnet wurde?

Ich versuche herauszufinden, ob eine Excel-Arbeitsmappe derzeit von einem anderen Benutzer geöffnet ist und zurückgeben, wer dieser Benutzer in meinem Skript ist.

Ich habe bereits herausgefunden, wer zu bestimmen, ob die Arbeitsmappe derzeit geöffnet ist. Es ist eine Problemumgehung, aber ich öffne im Grunde die Arbeitsmappe und überprüft, ob es schreibgeschützt ist. Das funktioniert perfekt; Ich habe es getestet.

Ich weiß, dass dies möglich ist, weil Excel Ihnen den Benutzer gibt, der die Datei geöffnet hat, wenn Sie es über den Browser öffnen.

Hier ist mein Code (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 

Auch ich diese Zeile aus dem Befehl ausführen:

cscript isWorkbookOpen.vbs 
+1

@AnsgarWiechers Es ist kein Duplikat. Dieser Beitrag fragt, wie man feststellen kann, ob eine Excel-Tabelle bereits geöffnet ist, was ich mit meinem Code bereits demonstriert habe. Ich möchte herausfinden, wer die WHO geöffnet hat. Ich weiß schon, wie man es bekommt, wenn es offen ist. Ich könnte es falsch machen für das, wonach ich suche. – Steven

Antwort

11

Mein Genious Mitarbeiter erinnerte mich über Excel „sperren“ Datei. Beim Öffnen von Excel erstellen Sie eine versteckte Systemdatei mit dem Namen der Person, die die Datei geöffnet hat. Eine Sperrdatei beginnt mit "~ $" vor dem Namen der Tabelle. Beispiel:

Wenn Sie eine Tabelle mit der Bezeichnung testWorkbook.xlsx haben, ist die Sperrdatei ~$testWorkbook.xlsx im selben Verzeichnis.

Dies ist auch eine schnellere und einfachere Methode zu überprüfen, ob die Datei geöffnet ist, weil Sie die Datei nicht wirklich öffnen, wie ich es zuvor getan habe. Jetzt überprüfe ich nur, ob die Sperrdatei existiert und wenn dies der Fall ist, überprüfe ich, wer der "Besitzer" der Sperrdatei ist und wer die aktuelle Tabelle geöffnet hat. Hoffentlich hilft das jemandem in der Zukunft!

Dies ist mein Code, der einwandfrei funktioniert: darauf hin

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 

Ich möchte, dass ich nicht die GetFileOwner Funktion Mut geschrieben hat. Ich verlinkte auf der Website, wo ich diesen Code in der Funktion bekam.

Wenn Sie den Standort nicht dem Arbeitsblatt zugeordnet haben und er sich über das Netzwerk befindet, funktioniert ein UNC-Pfad nicht, Sie müssen ein Laufwerk zuordnen. Dies kann unter Verwendung der folgenden zwei Codezeilen erfolgen:

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

Hoffentlich wird jemand davon profitieren. Ich weiß, dass es nicht viele Informationen darüber gibt, wie man das im Web macht, da ich immer danach gesucht habe!

+0

Diese Methode ist so genial! Es hat mich großes Problem gelöst. Danke für das Teilen! – lovechillcool

+0

BTW, diese Methode funktioniert nur für Excel 2007 und ältere Versionsdateien; Es funktioniert nicht für .xls – lovechillcool

+0

@Steven Ich habe versucht, dies in VBA und es funktioniert gut auf meinem lokalen Laufwerk C: \, aber wenn Sie diesen Code auf unserem Server ausgeführt wird all die von Ihrer Funktion zurückgegeben ist ein NULL. Und ja, ich habe der Datei, die ich auf dem Server abfrage, ein Laufwerk zugeordnet. Irgendwelche Ideen? – Josh

1

Haben Sie die Workbook.UserStatus Eigenschaft versucht? Hier ist ein Code-Snippet Zitat aus der Excel-VBA-Hilfe:

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

Dies gibt mir, was ich suche, wenn die Tabelle nicht geöffnet ist. Mein aktuelles Skript öffnet die Datei schreibgeschützt, und Sie können nichts aus der Eigenschaft Workbook.UserStatus abrufen, ohne einen Fehler zu erhalten, der besagt, dass Sie nicht auf eine schreibgeschützte Datei zugreifen können ... Nicht sicher, wohin Sie von hier aus gelangen sollen. – Steven

+0

Egal, ich hatte Hilfe von Kollegen und fand es heraus. – Steven

Verwandte Themen