IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Workbook ne s'exécute pas après un Workbooks.Open


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut Workbook ne s'exécute pas après un Workbooks.Open
    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 ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Le niveau de sécurité des macros?
    Ceci dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Close (False)
    arrête instantanément les macros exécuté par ThisWorkbook

  3. #3
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour Robert,

    Pour le niveau de sécurité des macros, je ne penses pas car lorsque j'ouvre en lecture seule, Workbook_Open est exécuté.

    Ensuite je fais ThisworkBook.Close donc toutes les macros sont automatiquement désactivées, mais juste avant je programme le lancement d'une macro qui servira a l'ouvrir, et il s'ouvre bien mais sans le Workbook_Open.


    As-tu testé de mettre les morceaux de code dans un classeur ? La seule chose impérative c'est que le fichier soit enregistrer physiquement dans le pc et que l'instance Excel reste ouvert. Ce qui est le cas avec .Close

  4. #4
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour tout le monde,

    Je suis toujours avec mon problème mais j'ai fait un test dont le résultat est étonnant :
    Ajout dans le module ThisWorkbook de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        MsgBox "fermeture"
    End Sub
    1. J'ouvre en lecture seule
    2. j'exécute le code en particulier 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)
    3. Le fichier se ferme
    4. 3 secondes plus tard il s'ouvre en lecture / écriture
    5. MsgBox "execution de Workbook_Open" dans Workbook_Open ne s'exécute pas
    6. Je ferme le fichier
    7. MsgBox "fermeture" dans Workbook_BeforeClose s'exécute bien.


    Etonnant non ? Des idées ?

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    et si tu passes par une procédure Auto_Open dans un module standard, il se passe quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Auto_Open()
    MsgBox "toto"
    End Sub

    quid de l'existence de procédures évènementielles dans tes feuilles ? Genre un petit EnableEvent qui traine ? (j'y crois pas trop)

  6. #6
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour Joe,

    Merci pour ta réponse mais Sub Auto_Open n'est pas exécuté non plus.

    J'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
        MsgBox Target.Address
    End Sub
    Apres fermeture et réouverture 3 secondes plus tard, l'évènement Workbook_SheetSelectionChange est bien fonctionnel donc EnableEvent est bien a vrai.


    Je suis perdu car je ne vois vraiment pas pourquoi seul l'évènement d'ouverture du classeur est inopérant.

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Afin d'écarter toute cause liée à la structure du classeur (formules, évènements, mises en forme etc etc...), tu as essayé de reproduire ce comportement sur un fichier Excel complètement vierge ?


    Peut être que la réouverture programmée dans l'instance neutralise l'évènement "ouverture" ?

    D'ailleurs, j'ai été surpris de ce que tu mets en place dans la mesure où quand un fichier est en lecture seule sur un reseau, on a une invite proposant d'avertir quand le fichier est disponible

  8. #8
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    J'ai trouvé une Bidouille de contournement. (Bidouille car vraiment pas une solution)

    J'écris une procédure MyAutoOpen, mon Workbook_Open devient un simple Call MyAutoOpen donc rien de diffèrent dans le fonctionnement d'origine.
    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.OnTime Now + TimeSerial(0, 0, 3), "OuvrirCeClasseur"
    Application.OnTime Now + TimeSerial(0, 0, 3 + 3), "MyAutoOpen"
    ThisWorkbook.Close (False)
    De cette façon l'équivalent de mon Workbook_Open est exécuté.


    Mais on peut voir tout de suite que c'est bien une bidouille et non une solution car si le fichier met plus de 3 secondes à s'ouvrir ça va être le foutoire


    Je ne passe en résolu car j'ai toujours espoir que l'un de vous me donne une explication sur le comportement d'Excel dans mon cas.

    Patrick t'es ou ?
    Et ne me répondez pas à Toulon !!!

  9. #9
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Afin d'écarter toute cause liée à la structure du classeur (formules, évènements, mises en forme etc etc...), tu as essayé de reproduire ce comportement sur un fichier Excel complètement vierge ?
    C'est déjà le cas. Fichier complètement vierge qui n'a pour code que ce que j'ai posté dans cette discussion.

    Citation Envoyé par joe.levrai Voir le message
    Peut être que la réouverture programmée dans l'instance neutralise l'évènement "ouverture" ?
    C'est l'impression que j'ai mais très peu d'info à ce sujet sur le net. Donc compliqué à confirmer ou réfuter.

    Citation Envoyé par joe.levrai Voir le message
    D'ailleurs, j'ai été surpris de ce que tu mets en place dans la mesure où quand un fichier est en lecture seule sur un reseau, on a une invite proposant d'avertir quand le fichier est disponible
    Je ne voulais pas utiliser cette solution car il me s'emble que l'instance Excel doit rester ouverte ce que ne font pas forcement les utilisateurs et moi non plus d'ailleurs.
    En plus je viens de tester et chose étonnante, Workbook_Open n'est pas exécuté non plus

  10. #10
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour,

    Je viens de tomber la dessus :
    Une macro "Auto_Open" est ignorée lorsqu'un classeur est ouvert par le biais du code à l'aide de la méthode Open.
    Dans ce lien

    Il est aussi précisé qu'il faut utiliser l'évènement Workbook_Open dans ce cas. (ce qui est mon cas)

    Pensez-vous qu'il y a un lien avec mon cas ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code dans ThisWorkbook : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private Sub Workbook_Open()
    MyAutoOpen
    End Sub
    Code dans un modue standard : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub MyAutoOpen()
    Application.OnTime Now + TimeSerial(0, 0, 3 + 3), "MyAutoOpen"
    ThisWorkbook.Close (False)
    End Sub

  12. #12
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour Robert,

    Je ne comprends pas ta proposition, mon but n'est pas de faire tourner en boucle la macro MyAutoOpen.

    Je programme juste la réouverture du fichier et je suis obligé de programmer aussi l'exécution de MyAutoOpen car Workbook_Open n'est pas exécuté.
    Cela posse un problème car si le fichier est trop long a s'ouvrir, les 3 secondes peuvent ne pas être suffisante.

    En fait je veux juste comprendre pourquoi seule la macro évènementielle Workbook_Open n'est pas exécuté dans le cas d'un Workbooks.open placé dans un Application.OnTime.


    EDIT:
    Je viens de faire le test suivant :

    Dans un autre classeur je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ouvrir()
        Workbooks.Open ("C:\Users\*****\Desktop\Classeur1.xlsb")
    End Sub
    Workbook_Open est bien exécuté.

    Ensuite toujour dans cet autre classeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        Application.OnTime Now + TimeSerial(0, 0, 3), "ouvrir"
    End Sub
    La aussi Workbook_Open est bien exécuté.


    Je suis perdu

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2014, 18h06
  2. Worksheets_change ne se lance pas après exécution macro
    Par d0n32 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/03/2013, 17h18
  3. Code qui fonctionne depuis un module mais pas depuis un workbook
    Par Gualino dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/10/2011, 18h48
  4. Réponses: 8
    Dernier message: 25/10/2009, 11h03
  5. Réponses: 6
    Dernier message: 21/07/2008, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo