Je voulais utiliser des classurs Excel partagés sur un server qui serait diversement connecté les uns aux autres.
J'ai travaillé pendant plusieurs jours pour ne plus savoir qu'il y a de nombreux problèmes à résoudre car les classurs partagés ne prennent pas en charge de nombreuses fonctionnalités.
Pourriez-vous m'avoir aidé à échapper à la boucle afin qu'il corresponde au but?
Je crois que seulement la partie supérieure du code se rapporte à mon problème, alors je ne l'affiche pas en entier:
Option Explicit Private Sub Workbook_Open() Dim Ret Ret = IsWorkBookOpen(ThisWorkbook.FullName) If Ret = True Then MsgBox "Come back later." ThisWorkbook.Close savechanges:=False End If End Sub
Function IsWorkBookOpen(FileName As Ssortingng) Dim ff As Long, ErrNo As Long On Error Resume Next ff = FreeFile() Open FileName For Input Lock Read As #ff Close ff ErrNo = Err On Error GoTo 0 Select Case ErrNo Case 0: IsWorkBookOpen = False Case 70: IsWorkBookOpen = True Case Else: Error ErrNo End Select End Function
Je ne pense pas que vous devez utiliser cette fonction à vos besoins.
Vous pouvez effectivement vérifier l'état du file en utilisant:
ThisWorkbook.ReadOnly
qui renvoie un boolean; true si le file est en lecture seule.
Maintenant, avant d'ouvrir le file, vous ne pouvez vraiment pas supprimer le pop-up en demandant si vous souhaitez l'ouvrir uniquement en lecture seule. Mais vous pouvez toujours essayer de mettre ce code qui triggersra une fois que l'user a ouvert le file en lecture seule.
Private Sub Workbook_Open() If ThisWorkbook.ReadOnly Then MsgBox "Comeback some other time. File in use" ThisWorkbook.Close False End If End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.Quit End Sub
La beauté de l'approche IsWorkBookOpen
est la vitesse par rapport à l'ouverture du classur sur un réseau par rapport à un test ReadOnly
.
Je vous recommand de modifier votre approche pour charger la vérification à partir d'un vbs
ou d'un file Excel séparé, car c'est la meilleure méthode.
vbs
, par exemple check.vbs . Le code vérifie si le file est ouvert, sinon il lance le file dans une nouvelle instance d'Excel. Si tel est le cas, un message est fourni. code vbs
Dim objExcel FileName = "C:\temp\file.xlsm" If Not IsWorkBookOpen(FileName) Then Set objExcel = CreateObject("Excel.Application") Set ojbWb = objExcel.Workbooks.Open(FileName) objExcel.Visible = True Else wscript.echo FileName & " already opened" End If Function IsWorkBookOpen(FileName) Set oFSO = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set objFile = oFSO.OpenTextFile(filename, 8, False) ErrNo = Err ObjFile.Close On Error GoTo 0 Select Case ErrNo Case 0: IsWorkBookOpen = False Case 70: IsWorkBookOpen = True Case Else: Error ErrNo End Select set objFSO = Nothing End Function
Si vous souhaitez exécuter la vérification à partir du file réel, vous devrez passer au test ReadOnly
code
Private Sub Workbook_Open()
If Me.ReadOnly Then MsgBox "file already opened", vbCritical
End Sub
Je publie ceci car j'ai vu cette question sans réponse sur d'autres forums aussi.
Je voulais utiliser de nombreux classurs Excel partagés sur un server qui serait relié entre eux.
Je voulais utiliser le soi-disant classur partagé pour que tout le monde puisse y accéder et surtout pour le suivi des changements à l'intérieur (users, time, …)
Je voulais que la macro vérifie l'ouverture du file pour savoir si le file est ouvert par quelqu'un d'autre et si «oui», il lui dirait de revenir plus tard.
Les réponses suggérées ici ne pouvaient pas aider et je crois qu'il n'y a aucune chance de créer une macro pour le path du file lui-même afin que IsWorkBookOpen (ThisWorkbook.FullName) puisse être utilisé comme je l'ai essayé.
J'ai décidé d'écrire une macro qui suivrait les changements dans le classur comme s'il était «partagé». De cette façon, j'ai pu "ne pas partager" et utiliser l'approche ReadOnly abordée ici.