2013-03-21 12 views
7

Jak sprawdzić, czy arkusz kalkulacyjny programu Excel 2007 jest otwarty i czy jest on otwarty przy użyciu skryptu VBScript?Jak sprawdzić, czy arkusz kalkulacyjny programu Excel 2007 jest otwarty i czy jest otwarty przez WHO przy użyciu VBScript

Próbuję dowiedzieć się, czy skoroszyt programu Excel jest obecnie otwarty przez innego użytkownika i powrócić, który użytkownik jest w moim skrypcie.

Dowiedziałem się już, kto ustalić, czy skoroszyt jest obecnie otwarty. Jest to obejście, ale zasadniczo otwieram skoroszyt i sprawdzam, czy jest on tylko do odczytu. To działa idealnie; Przetestowałem to.

Wiem, że jest to możliwe, ponieważ program Excel daje użytkownikowi, który ma otwarty plik, jeśli otworzysz go przez przeglądarkę.

Oto mój kod (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 

również uruchomić z wiersza poleceń:

cscript isWorkbookOpen.vbs 
+1

@AnsgarWiechers To nie jest duplikat. Ten post pyta, jak ustalić, czy arkusz kalkulacyjny Excela jest już otwarty, co z moim kodem już wykazałem. Szukam, aby WHO to otworzyło. Już wiem, jak zdobyć JEŚLI to jest otwarte. Mógłbym robić źle w tym, czego szukam. – Steven

Odpowiedz

11

Moi współpracownicy genious przypomniał mi o „lock” pliku Excel. Podczas otwierania programu Excel tworzysz ukryty plik systemowy zawierający nazwiska osób, które mają otwarty plik. Plik blokady zaczyna się od "~ $" przed nazwą arkusza kalkulacyjnego. Przykład:

Jeśli masz arkusz kalkulacyjny o nazwie testWorkbook.xlsx, jego plikiem blokującym będzie ~$testWorkbook.xlsx znajdujący się w tym samym katalogu.

Jest to również szybsza i łatwiejsza metoda sprawdzania, czy plik jest otwarty, ponieważ nie jest tak naprawdę otwarcie pliku, jak robiłem wcześniej. Teraz sprawdzam tylko, czy plik blokady istnieje, a jeśli tak, to sprawdzam, kto jest "właścicielem" pliku blokady, a to będzie osoba, która ma obecnie otwarty arkusz kalkulacyjny. Mam nadzieję, że to pomoże komuś w przyszłości!

To jest mój kod, który działa bez zarzutu:

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 

Chcę podkreślić, że nie pisałem wnętrzności funkcyjne GetFileOwner. Połączyłem się ze stroną, na której dostałem ten kod w funkcji.

Ponadto, jeśli lokalizacja nie jest zmapowana do arkusza kalkulacyjnego i znajduje się w sieci, ścieżka UNC nie będzie działać, należy zmapować dysk. Można to zrobić za pomocą następujących 2 linii kodu:

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

Mam nadzieję, że ktoś skorzysta na tym. Wiem, że nie ma zbyt wielu informacji o tym, jak to zrobić w sieci, ponieważ szukałem go na zawsze!

+0

Ta metoda jest genialna! Rozwiązało to duży problem. Dziękuję za udostępnienie! – lovechillcool

+0

BTW, ta metoda działa tylko w przypadku plików wersji programu Excel 2007 i wyższych; to nie działa dla .xls – lovechillcool

+0

@Steven Próbowałem używać tego w VBA i działa dobrze na moim lokalnym dysku C: \, ale po uruchomieniu tego kodu na naszym serwerze wszystko jest zwracane z funkcji jest NULL. I tak, zamapowałem dysk do pliku, którego szukam na serwerze. Jakieś pomysły? – Josh

1

Czy próbowałeś właściwość Workbook.UserStatus? Oto fragment kodu cytat z pomocą 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

Daje mi to, czego szukam, jeśli arkusz kalkulacyjny nie jest obecnie otwarty. Mój bieżący skrypt otwiera plik w trybie tylko do odczytu i nie można pobrać niczego z właściwości Workbook.UserStatus bez otrzymania błędu stwierdzającego, że nie można uzyskać dostępu do pliku tylko do odczytu ... Nie wiem, gdzie przejść z tego miejsca. – Steven

+0

Nieważne, że miałem pomoc od współpracowników i odkryłem to. – Steven