XL 2016 Aide à la compréhension - Erreur_VBA

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

tunis48

XLDnaute Nouveau
Bonjour,
Je cherche de l'aide pour comprendre ce qui m'apparait comme une anomalie.
Contexte: Windows 11 Famille, Version 10.0.26100 Build 26100 (24H2)
Excel 2016

Problème : 6 lignes de code dans la procédure Workbook_Open (Cf. copie d'écran jointe) ; blocage sur erreur 91 dés l'ouverture du classeur mais fonctionnement correct si reprise du code en mode débogage pas à pas.
Je n'ai pas trouvé d'aide ou d'explication jusqu'à présent et suis preneur de toutes suggestions.
Merci
17/03 : j'ai identifié que c'est le chargement de CodeModule qui pose problème.
Avec
Set MyApp = Application.VBE.ActiveCodePane
Set MyApp = MyApp.CodeModule
l'erreur se déplace sur la seconde ligne
 

Pièces jointes

  • Erreur91.jpg
    Erreur91.jpg
    72.9 KB · Affichages: 28
Dernière édition:
Solution
Bonjour tunis48,

Il faut définir le CodePane que l'on veut rendre actif :
VB:
Private Sub Workbook_Open()
Dim cp As Object, lig&, nomProcedure$
For Each cp In Application.VBE.CodePanes
    If cp.CodeModule.Name = Me.CodeName Then Set Application.VBE.ActiveCodePane = cp: Exit For 'définit le CodePane
Next cp
With Application.VBE.ActiveCodePane.CodeModule
    For lig = 1 To .CountOfLines
        nomProcedure = .ProcOfLine(lig, 0)
        If nomProcedure <> "" Then Exit For
    Next lig
End With
MsgBox "La 1ère procédure dans " & Me.CodeName & " est : " & nomProcedure
End Sub
Cela dit il n'est pas du tout nécessaire de le rendre actif :
VB:
Private Sub Workbook_Open()
Dim cp As Object, lig&, nomProcedure$
For Each cp In...
Bonjour tunis48,

Il faut définir le CodePane que l'on veut rendre actif :
VB:
Private Sub Workbook_Open()
Dim cp As Object, lig&, nomProcedure$
For Each cp In Application.VBE.CodePanes
    If cp.CodeModule.Name = Me.CodeName Then Set Application.VBE.ActiveCodePane = cp: Exit For 'définit le CodePane
Next cp
With Application.VBE.ActiveCodePane.CodeModule
    For lig = 1 To .CountOfLines
        nomProcedure = .ProcOfLine(lig, 0)
        If nomProcedure <> "" Then Exit For
    Next lig
End With
MsgBox "La 1ère procédure dans " & Me.CodeName & " est : " & nomProcedure
End Sub
Cela dit il n'est pas du tout nécessaire de le rendre actif :
VB:
Private Sub Workbook_Open()
Dim cp As Object, lig&, nomProcedure$
For Each cp In Application.VBE.CodePanes
    If cp.CodeModule.Name = Me.CodeName Then Exit For 'définit le CodePane
Next cp
With cp.CodeModule
    For lig = 1 To .CountOfLines
        nomProcedure = .ProcOfLine(lig, 0)
        If nomProcedure <> "" Then Exit For
    Next lig
End With
MsgBox "La 1ère procédure dans " & Me.CodeName & " est : " & nomProcedure
End Sub
A+
 

Pièces jointes

Bonjour tunis48,

Il faut définir le CodePane que l'on veut rendre actif :
VB:
Private Sub Workbook_Open()
Dim cp As Object, lig&, nomProcedure$
For Each cp In Application.VBE.CodePanes
    If cp.CodeModule.Name = Me.CodeName Then Set Application.VBE.ActiveCodePane = cp: Exit For 'définit le CodePane
Next cp
With Application.VBE.ActiveCodePane.CodeModule
    For lig = 1 To .CountOfLines
        nomProcedure = .ProcOfLine(lig, 0)
        If nomProcedure <> "" Then Exit For
    Next lig
End With
MsgBox "La 1ère procédure dans " & Me.CodeName & " est : " & nomProcedure
End Sub
Cela dit il n'est pas du tout nécessaire de le rendre actif :
VB:
Private Sub Workbook_Open()
Dim cp As Object, lig&, nomProcedure$
For Each cp In Application.VBE.CodePanes
    If cp.CodeModule.Name = Me.CodeName Then Exit For 'définit le CodePane
Next cp
With cp.CodeModule
    For lig = 1 To .CountOfLines
        nomProcedure = .ProcOfLine(lig, 0)
        If nomProcedure <> "" Then Exit For
    Next lig
End With
MsgBox "La 1ère procédure dans " & Me.CodeName & " est : " & nomProcedure
End Sub
A+
Bonjour Barbatruc,
Merci pour la réponse qui me donne une solution qui fonctionne (la seconde)
For Each cp In Application.VBE.CodePanes
If cp.CodeModule.Name = Me.CodeName Then Exit For 'définit le CodePane
Next cp
NomProc = cp.CodeModule.ProcOfLine(10, 0)
Ouvrir_FichierSuiviTrace ' Trace un suivi de l'application des procédures
SuiviTrace (Now & " " & Me.CodeName & " - " & NomProc)

Un point qui me gêne intellectuellement : la première solution proposée provoque la même erreur 91 au premier passage (blocage sur CodeModule et je ne comprends pas le descriptif de lerreur 91 qui ne me semble pas pertinent) alors que celle-ci fonctionne sans erreur à l'ouverture du classeur.
Bonne soirée
 
Bonjour Barbatruc,
Merci pour la réponse qui me donne une solution qui fonctionne (la seconde)
For Each cp In Application.VBE.CodePanes
If cp.CodeModule.Name = Me.CodeName Then Exit For 'définit le CodePane
Next cp
NomProc = cp.CodeModule.ProcOfLine(10, 0)
Ouvrir_FichierSuiviTrace ' Trace un suivi de l'application des procédures
SuiviTrace (Now & " " & Me.CodeName & " - " & NomProc)

Un point qui me gêne intellectuellement : la première solution proposée provoque la même erreur 91 au premier passage (blocage sur CodeModule et je ne comprends pas le descriptif de lerreur 91 qui ne me semble pas pertinent) alors que celle-ci fonctionne sans erreur à l'ouverture du classeur.
Bonne soirée
Bonsoir Barbatruc,
J'ai malheureusement crié victoire trop tôt.
L'erreur 91 réapparait à l'ouverture du classeur (cf. copie écran) dès l'appel à CodeModule . Comme précédemment, un second passage en mode manuel sur la ligne ne génère aucune erreur.
Bonne soirée
 

Pièces jointes

  • Erreur91-2.jpg
    Erreur91-2.jpg
    44.1 KB · Affichages: 8
Bonjour tunis48, le forum,

Perso je n'utilise jamais CodePanes, je travaille toujours avec VBComponents :
VB:
Private Sub Workbook_Open()
Dim lig&, nomProcedure$
With Me.VBProject.VBComponents(Me.CodeName).CodeModule 'module du ThisWorkbook
    For lig = 1 To .CountOfLines
        nomProcedure = .ProcOfLine(lig, 0)
        If nomProcedure <> "" Then Exit For
    Next lig
End With
MsgBox "La 1ère procédure dans " & Me.CodeName & " est : " & nomProcedure
End Sub
J'ai oublié de rappeler que dans ces problèmes sur VBA il faut avoir coché "Accès approuvé au modèle d'objet du projet VBA"
(onglet Développeur => Sécurité des macros).

A+
 

Pièces jointes

Hello

Peut-être une piste pour expliquer pourquoi l'instruction bug à l'execution mais passe quand meme en pas à pas..

j'ai cru remarquer que les instructions faisant appel à "Application." pouvait sans doute souffrir d'un temps d'execution trop long..
du coup.. la ligne de code suivante bugge..
un peu comme si on voulait mettre une valeur dans le textbox d'un formulaire qui n'est pas encore totalement chargé
 
Au lieu de modifier le code que je donne avez-vous testé tels quels les fichiers de mon post #2 ?

Chez moi sur Win 11 Excel 2019 il n'y a pas de bug.
Bonjour Barbatruc,
Oui j'ai testé vos 2 versions dans un classeur test et elles fonctionnent. C'est pourquoi j'ai retenu la version 2 pour mon classeur. J'y ai re testé aujourd'hui les 2 versions (la votre intégrale puis la mienne où je n'ai pas besoin de rechercher le numéro de ligne cf.copie jointe) et je constate que les 2 fonctionnent ! je ne comprends pas ce qui s'est passé (je ne vois pas où est l'erreur). Encore merci, j'ai une solution qui fonctionne même si je ne comprends pas l'origine du bug dans ma version initiale...
PS: Je ne sais pas comment fermer la discussion
 

Pièces jointes

  • Barbatruc_Adapté.jpg
    Barbatruc_Adapté.jpg
    83.3 KB · Affichages: 7
Hello

Peut-être une piste pour expliquer pourquoi l'instruction bug à l'execution mais passe quand meme en pas à pas..

j'ai cru remarquer que les instructions faisant appel à "Application." pouvait sans doute souffrir d'un temps d'execution trop long..
du coup.. la ligne de code suivante bugge..
un peu comme si on voulait mettre une valeur dans le textbox d'un formulaire qui n'est pas encore totalement chargé
Bonjour vgendron,
Effectivement c'est une piste que j'ai testée avec DoEvents puis avec une boucle de comptage d'au mois 2 sec sans résultat positif.
Merci pour votre suggestion
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour