web-dev-qa-db-fra.com

Comment savoir si une feuille de calcul Excel 2007 est ouverte et que l'OMS l'a ouverte avec VBScript

Comment savoir si un tableur Excel 2007 est ouvert et que l'OMS l'a ouvert à l'aide de VBScript?

J'essaie de déterminer si un classeur Excel est actuellement ouvert par un autre utilisateur et de renvoyer l'identité de cet utilisateur dans mon script.

J'ai déjà compris qui déterminer si le classeur est actuellement ouvert. C'est une solution de contournement, mais j'ouvre essentiellement le classeur et vérifie s'il est en lecture seule. Cela fonctionne parfaitement; Je l'ai testé.

Je sais que cela est possible car Excel vous indique l'utilisateur qui a ouvert le fichier si vous l'ouvrez via le navigateur.

Voici mon 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

En outre, je lance ceci à partir de la ligne de commande: 

cscript isWorkbookOpen.vbs
9
Steven

Mes collègues de Genious m'ont rappelé le fichier "verrouillé" d'Excel. Lorsque vous ouvrez Excel, vous créez un fichier système masqué contenant le nom de la personne qui a ouvert le fichier. Un fichier de verrouillage commence par "~ $" avant le nom de la feuille de calcul. Exemple:

Si vous avez une feuille de calcul appelée testWorkbook.xlsx, son fichier de verrouillage serait ~$testWorkbook.xlsx situé dans le même répertoire.

C'est également une méthode plus rapide et plus simple pour vérifier si le fichier est ouvert car vous n'ouvrez pas réellement le fichier comme je le faisais auparavant. Maintenant, je vérifie simplement si le fichier de verrouillage existe et si c'est le cas, je vérifie qui est le "propriétaire" du fichier de verrouillage et ce sera la personne qui a actuellement le tableur ouvert. Espérons que cela aidera quelqu'un à l'avenir!

Ceci est mon code qui fonctionne parfaitement:

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

Je tiens à souligner que je n'ai pas écrit les tripes de la fonction GetFileOwner. Je me suis connecté au site Web où j'ai obtenu ce code dans la fonction.

De plus, si l'emplacement ne correspond pas à la feuille de calcul et qu'il se trouve sur le réseau, un chemin UNC ne fonctionnera pas, vous devez mapper un lecteur. Cela peut être fait en utilisant les 2 lignes de code suivantes:

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

J'espère que quelqu'un en profitera. Je sais qu'il n'y a pas beaucoup d'informations sur la façon de le faire sur le Web depuis que je le cherche depuis toujours!

12
Steven

Avez-vous essayé la propriété Workbook.UserStatus? Voici une citation d'extrait de code de l'aide de 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 
1
Eric