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
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!
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