Comment éviter la self-reference avec IsWorkBookOpen

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.

  • 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.
  • Malheureusement, je me réfère à moi-même et cela crée une boucle.
  • J'ouvre le file, il se vérifie qu'il est déjà ouvert et après le message qu'il ferme.

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.

  1. Le code ci-dessous peut être enregistré dans NotePad sur votre lecteur réseau en tant que 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 
  1. 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.