2013-03-21 8 views
7

Come faccio a sapere se un foglio di calcolo Excel 2007 è aperto e che lo ha aperto con VBScript?Come sapere se un foglio di calcolo Excel 2007 è aperto e che lo ha aperto utilizzando VBScript

Sto cercando di capire se una cartella di lavoro di Excel o non è aperto da un altro utente e il ritorno che l'utente è nel mio script.

ho già capito che per determinare se la cartella di lavoro è aperto. È una soluzione, ma fondamentalmente apro la cartella di lavoro e controllo se è di sola lettura. Funziona perfettamente; L'ho provato

So che questo è possibile perché Excel ti dà l'utente che ha aperto il file, se lo si apre tramite il browser.

Ecco il mio codice (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 

Inoltre, corro questo dalla riga di comando:

cscript isWorkbookOpen.vbs 
+1

@AnsgarWiechers Non è un duplicato. Quel post sta chiedendo come determinare se un foglio di calcolo excel è già aperto, che con il mio codice ho già dimostrato. Sto cercando di far sì che l'OMS lo apra. So già come ottenere SE è aperto. Potrei sbagliarmi per quello che sto cercando però. – Steven

risposta

11

mio genio collaboratori mi hanno ricordato su file "lock" di Excel. Quando apri Excel, crei un file di sistema nascosto che contiene il nome di chi ha il file aperto. Un file di blocco inizia con "~ $" prima del nome del foglio di calcolo. Esempio:

Se si dispone di un foglio di calcolo chiamato testWorkbook.xlsx, il file di blocco sarà ~$testWorkbook.xlsx situato nella stessa directory.

Questo è anche un metodo più veloce e più facile da controllare se il file è aperto perché il vostro non è in realtà l'apertura del file, come facevo prima. Ora sto solo controllando se il file di lock esiste e se lo fa, controllo chi è il "proprietario" del file di lock e quella sarà la persona che attualmente ha il foglio di calcolo aperto. Speriamo che questo possa aiutare qualcuno nel futuro!

Questo è il mio codice che funziona perfettamente:

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 

Voglio precisare che non ho scritto il coraggio di funzione GetFileOwner. Mi sono collegato al sito web in cui ho ottenuto quel codice nella funzione.

Inoltre, se non si ha la posizione mappato al foglio di calcolo ed è attraverso la rete, un percorso UNC non funziona, è necessario mappare un'unità. Questo può essere fatto utilizzando le seguenti 2 righe di codice:

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

Speriamo che qualcuno potranno beneficiare di questo. So che non ci sono molte informazioni su come fare questo sul web poiché ho cercato per sempre!

+0

Questo metodo è così geniale! Mi ha risolto un grosso problema. Grazie per averlo condiviso! – lovechillcool

+0

BTW, questo metodo funziona solo per Excel 2007 e sopra i file di versione; non funziona per .xls – lovechillcool

+0

@Steven Ho provato a utilizzare questo in VBA e funziona bene sul mio C: \ drive locale ma quando si esegue questo codice sul nostro server tutto viene restituito dalla funzione è un NULL. E sì, ho mappato un'unità al file che sto interrogando sul server. Qualche idea? – Josh

1

Hai provato la proprietà Workbook.UserStatus? Ecco una citazione frammento di codice da l'aiuto di 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

Questo mi dà quello che sto cercando SE il foglio di calcolo non è attualmente aperto. Il mio script corrente apre il file in sola lettura e non è possibile recuperare nulla dalla proprietà Workbook.UserStatus senza ricevere un errore che indica che non è possibile accedere a un file di sola lettura ... Non si sa da che parte andare. – Steven

+0

Non importa, ho avuto l'aiuto dei colleghi e l'ho capito. – Steven