Bonjour à tous,

J'ai dans un classeur un bouton qui n'apparait que si ThisWorkbook.ReadOnly est vrai.

Dans un module standard :
  • Une fonction qui test si le fichier ouvert est disponible ou non :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function IsFileOpen(filename As String)
    Dim Filenum%, Errnum%
        On Error Resume Next
            Filenum = FreeFile()
            'Test d'ouverture du fichier.
            Open filename For Input Lock Read As #Filenum
            Close Filenum
            Errnum = Err
        On Error GoTo 0
 
        Select Case Errnum
            Case 0: IsFileOpen = False
            Case 70: IsFileOpen = True
            Case Else: Error Errnum
        End Select
End Function
  • Une procédure sur le bouton qui va test la disponibilité du fichier et afficher un message pouvant proposer l'ouverture de celui-ci s'il est disponible :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub TesterLectureSeule()
    Dim Message$, Titre$
        Titre = "        Lecture Seule"
        If IsFileOpen(ThisWorkbook.FullName) Then
            Message = "Le classeur est toujours réservé par un autre utilisateur."
            MsgBox Message, vbInformation, Titre
        Else
            Message = "Le classeur est maintenant disponible." & vbNewLine & vbNewLine & _
                    "Voulez-vous l'ouvrir en lecture / écriture ?"
            Select Case MsgBox(Message, vbInformation + vbYesNo, Titre)
                Case vbNo
                    'rien
                Case vbYes
                    Application.OnTime Now + TimeSerial(0, 0, 3), "OuvrirCeClasseur"
                    ThisWorkbook.Close (False)
            End Select
        End If
End Sub
  • Une procédure pour s'auto-ouvrir :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Sub OuvrirCeClasseur()
    Workbooks.Open ThisWorkbook.FullName
End Sub
Dans le module ThisWorkbook :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
Private Sub Workbook_Open()
    MsgBox "execution de Workbook_Open"
End Sub

Vous pouvez voir que les deux lignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Application.OnTime Now + TimeSerial(0, 0, 3), "OuvrirCeClasseur"
ThisWorkbook.Close (False)
programment l'ouverture du fichier dans 3 secondes et le ferme. L'instance Excel restant ouvert, la procédure OuvrirCeClasseur va bien s'exécuter.


Mon problème est que le fichier se rouvre bien en lecture / écriture mais l'évènement Workbook_Open ne s'exécute pas.

Savez-vous pourquoi ? Et auriez-vous des pistes à explorer pour régler le problème ?