Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Procédures évènementielles communes

7 réponses
Avatar
ThierryP
Bonjour le forum et Denis !

Dans un fichier comprenant plusieurs onglets (strucuturés de la même façon), j'ai des macros évènementielles qui s'exécutent pour chaque onglet. Elles sont identiques, seules des plages nommées sont différentes.

Je voudrais écrire une seule macro, lui passer les paramètres qui vont bien et exécuter le code d'un bouton de l'onglet actif...et lÍ , je coince !
VoilÍ  ce que j'ai commis :
'--------------------------------------------------------------------------------------
Sub Feuille_DoubleClic(ByVal F_Index As Integer, ByRef Cellule As Range, ByVal Statut As String, ByVal Bouton_Etat As Boolean, ByVal Bouton_Code As String, Avancement)
With Sheets(F_Index)
.Unprotect
Cellule = UCase(Cellule)
If Cellule = "P" Then 'Coche verte
Cellule.ClearContents
GoTo fin
Else
Cellule = "P": Cellule.Font.ColorIndex = 4
GoTo fin
End If
fin:
If Bouton_Etat Then Call .Bouton_Code '############### C'est lÍ  que ça coince !
.Protect
Call Feuille_Change(F_Index, Cellule, Statut, Avancement)
End With
End Sub

La variable Bouton_Code contient la chaͮne "Bouton_Click()" mais je ne trouve pas la syntaxe d'appel.

Merci d'avance Í  tout contributeur pour un coup de main !

ThierryP
'------------------------------------------------------------------------------------------------------------------

7 réponses

Avatar
MichD
Le 14/04/22 Í  11:00, ThierryP a écrit :
Bonjour le forum et Denis !
Dans un fichier comprenant plusieurs onglets (strucuturés de la même façon), j'ai des macros évènementielles qui s'exécutent pour chaque onglet. Elles sont identiques, seules des plages nommées sont différentes.
Je voudrais écrire une seule macro, lui passer les paramètres qui vont bien et exécuter le code d'un bouton de l'onglet actif...et lÍ , je coince !
VoilÍ  ce que j'ai commis :
'--------------------------------------------------------------------------------------
Sub Feuille_DoubleClic(ByVal F_Index As Integer, ByRef Cellule As Range, ByVal Statut As String, ByVal Bouton_Etat As Boolean, ByVal Bouton_Code As String, Avancement)
With Sheets(F_Index)
.Unprotect
Cellule = UCase(Cellule)
If Cellule = "P" Then 'Coche verte
Cellule.ClearContents
GoTo fin
Else
Cellule = "P": Cellule.Font.ColorIndex = 4
GoTo fin
End If
fin:
If Bouton_Etat Then Call .Bouton_Code '############### C'est lÍ  que ça coince !
.Protect
Call Feuille_Change(F_Index, Cellule, Statut, Avancement)
End With
End Sub
La variable Bouton_Code contient la chaͮne "Bouton_Click()" mais je ne trouve pas la syntaxe d'appel.
Merci d'avance Í  tout contributeur pour un coup de main !
ThierryP
'------------------------------------------------------------------------------------------------------------------

Bonjour,
.Bouton_Code
C'est quoi cet objet, un bouton de commande émanant de la barre
"ContrÍ´le formulaire" ou de la barre d'outils d'Activex?
Quel est le nom de ce bouton (voir Í  gauche de la barre de formule...
Tu veux écrire ce code dans tous les modules de tes feuilles? Si oui,
pourquoi ne pas écrire ton code dans le ThisWorkbook (un seul endroit).
MichD
Avatar
Michel__D
Le 14/04/2022 Í  17:00, ThierryP a écrit :
Bonjour le forum et Denis !
Dans un fichier comprenant plusieurs onglets (strucuturés de la même façon), j'ai des macros évènementielles qui s'exécutent pour chaque onglet. Elles sont identiques, seules des plages nommées sont différentes.
Je voudrais écrire une seule macro, lui passer les paramètres qui vont bien et exécuter le code d'un bouton de l'onglet actif...et lÍ , je coince !
VoilÍ  ce que j'ai commis :
'--------------------------------------------------------------------------------------
Sub Feuille_DoubleClic(ByVal F_Index As Integer, ByRef Cellule As Range, ByVal Statut As String, ByVal Bouton_Etat As Boolean, ByVal Bouton_Code As String, Avancement)
With Sheets(F_Index)
.Unprotect
Cellule = UCase(Cellule)
If Cellule = "P" Then 'Coche verte
Cellule.ClearContents
GoTo fin
Else
Cellule = "P": Cellule.Font.ColorIndex = 4
GoTo fin
End If
fin:
If Bouton_Etat Then Call .Bouton_Code '############### C'est lÍ  que ça coince !
.Protect
Call Feuille_Change(F_Index, Cellule, Statut, Avancement)
End With
End Sub
La variable Bouton_Code contient la chaͮne "Bouton_Click()" mais je ne trouve pas la syntaxe d'appel.
Merci d'avance Í  tout contributeur pour un coup de main !
ThierryP
'------------------------------------------------------------------------------------------------------------------

Tu as mis : .Bouton_Code
Ce qui signifie que c'est soit une propriété ou soit une méthode de Sheets(F_Index)
Avatar
MichD
Le 14/04/22 Í  11:23, MichD a écrit :
Le 14/04/22 Í  11:00, ThierryP a écrit :
Bonjour le forum et Denis !
Dans un fichier comprenant plusieurs onglets (strucuturés de la même
façon), j'ai des macros évènementielles qui s'exécutent pour chaque
onglet. Elles sont identiques, seules des plages nommées sont
différentes.
Je voudrais écrire une seule macro, lui passer les paramètres qui vont
bien et exécuter le code d'un bouton de l'onglet actif...et lÍ , je
coince !
VoilÍ  ce que j'ai commis :
'--------------------------------------------------------------------------------------
Sub Feuille_DoubleClic(ByVal F_Index As Integer, ByRef Cellule As
Range, ByVal Statut As String, ByVal Bouton_Etat As Boolean, ByVal
Bouton_Code As String, Avancement)
With Sheets(F_Index)
     .Unprotect
     Cellule = UCase(Cellule)
     If Cellule = "P" Then 'Coche verte
         Cellule.ClearContents
         GoTo fin
     Else
         Cellule = "P": Cellule.Font.ColorIndex = 4
         GoTo fin
     End If
fin:
     If Bouton_Etat Then Call .Bouton_Code '############### C'est l͠
que ça coince !
     .Protect
     Call Feuille_Change(F_Index, Cellule, Statut, Avancement)
End With
End Sub
La variable Bouton_Code contient la chaͮne "Bouton_Click()" mais je ne
trouve pas la syntaxe d'appel.
Merci d'avance Í  tout contributeur pour un coup de main !
ThierryP
'------------------------------------------------------------------------------------------------------------------

Bonjour,
.Bouton_Code
C'est quoi cet objet, un bouton de commande émanant de la barre
"ContrÍ´le formulaire" ou de la barre d'outils d'Activex?
Quel est le nom de ce bouton (voir Í  gauche de la barre de formule...
Tu veux écrire ce code dans tous les modules de tes feuilles? Si oui,
pourquoi ne pas écrire ton code dans le ThisWorkbook (un seul endroit).
MichD

Après quelques instants de réflexion, tu pourrais utiliser ceci...
Cependant, ce n'est pas une certitude, tu ne donnes pas beaucoup
d'explications.
If Bouton_Etat Then
'Ce bouton est dans le même module que le reste du code
Call Bouton_Click 'ou l'événement auquel est lié ce bouton
.Protect
Call Feuille_Change(F_Index, Cellule, Statut, Avancement)
End With
MichD
Avatar
ThierryP
Bonjour Denis,
A me relire, effectivement ça manque d'explications.....
J'ai plusieurs onglets, structurés de la même façon, avec sur chaque onglet des toggle buttons similaires qui exécutent la même chose sur leurs onglets respectifs.
Il ya également du code dans les Worksheet_Change et Worksheet_Beforedoubleclick, qui est similaire. Seules les noms de plage sur lesquelles s'exécute le code sont différents.
Dans le Worksheet_Change, j'ai placé cette ligne :
Call Feuille_DoubleClic(Feuille, Cible, Statut, Etat, Nom_Code, Avancement)
Je passe Í  ma procédure (qui est dans un module standard) les variables suivantes :
Feuille : index de la feuille "appelante"
Cible : = Target
Statut : booléen de l'état du toggle (je passe "True")
Nom_Code : le nom de la procédure du toggle de la feuille appelante donc : = "ToggleButton1_click()"
Avancement : le nom de la plage nommée Í  traiter dans la feuille appelante
La procédure "générique" (Feuille_DoubleClic) fait le job, elle s'exécute bien sur l'onglet "appelant" sauf que l'appel Í  ToggleButton1_Click() de cet onglet crée une erreur 438.
J'ai bien supprimé le "Private" devant le nom de la procédure "ToggleButton1-Click() afin ma procédure puisse la voir.
Je ne sais pas dire Í  ma procédure : si l'état du ToggleButton est "true" (ma variable Statut) alors lance la procédure du ToggleButton qui est sur l'onglet actif.
J'espère que j'ai été un peu plus clair !
ThierryP
Avatar
MichD
Le 15/04/22 Í  02:18, ThierryP a écrit :
Bonjour Denis,
A me relire, effectivement ça manque d'explications.....
J'ai plusieurs onglets, structurés de la même façon, avec sur chaque onglet des toggle buttons similaires qui exécutent la même chose sur leurs onglets respectifs.
Il ya également du code dans les Worksheet_Change et Worksheet_Beforedoubleclick, qui est similaire. Seules les noms de plage sur lesquelles s'exécute le code sont différents.
Dans le Worksheet_Change, j'ai placé cette ligne :
Call Feuille_DoubleClic(Feuille, Cible, Statut, Etat, Nom_Code, Avancement)
Je passe Í  ma procédure (qui est dans un module standard) les variables suivantes :
Feuille : index de la feuille "appelante"
Cible : = Target
Statut : booléen de l'état du toggle (je passe "True")
Nom_Code : le nom de la procédure du toggle de la feuille appelante donc : = "ToggleButton1_click()"
Avancement : le nom de la plage nommée Í  traiter dans la feuille appelante
La procédure "générique" (Feuille_DoubleClic) fait le job, elle s'exécute bien sur l'onglet "appelant" sauf que l'appel Í  ToggleButton1_Click() de cet onglet crée une erreur 438.
J'ai bien supprimé le "Private" devant le nom de la procédure "ToggleButton1-Click() afin ma procédure puisse la voir.
Je ne sais pas dire Í  ma procédure : si l'état du ToggleButton est "true" (ma variable Statut) alors lance la procédure du ToggleButton qui est sur l'onglet actif.
J'espère que j'ai été un peu plus clair !
ThierryP

exemple Í  partir de ce je comprends :
Dans le module d'une feuille, tu as une macro de ce type :
Le bouton "commandButton1" émane de la barre d'outils "Activex"
C'est la même chose pour tous les contrÍ´les de cette barre.
'------------------------------
Private Sub CommandButton1_Click()
MsgBox "toto"
End Sub
'------------------------------
Dans un module standard, tu peux appeler la procédure
"CommandButton1_click" Í  partir d'une autre procédure
Voici la macro du module standard :
'-----------------------------
Sub toto()
Dim LaMacro As String
LaMacro = "'" & ThisWorkbook.Name & "'!feuil1.CommandButton1_Click"
Application.Run LaMacro
End Sub
'-----------------------------
Le Thisworkbook est mis en "'" et "'" parce que dans cela provoque une
erreur si le nom du classeur contient un espace dans son nom.
Le "Feuil1" dans "feuil1.CommandButton1_Click" n'est pas le nom de
l'onglet de la feuille, mais la propriété "Name" de l'objet Worksheet
visible seulement dans l'éditeur de code.
Si tu n'as aucune ligne de code mise en "jaune" pour cette erreur, place
devant l'appel de la procédure une ligne de code simple : Stop cela va
arrêter l'exécution du code et tu utilises la touche F8 (pas Í  pas) afin
de terminer la macro. Tu utilises probablement une propriété qui
n'appartient pas Í  un objet donné. Désolé, je ne peux pas deviner!
MichD
Avatar
MichD
Le 15/04/22 Í  06:33, MichD a écrit :
Le 15/04/22 Í  02:18, ThierryP a écrit :
Bonjour Denis,
A me relire, effectivement ça manque d'explications.....
J'ai plusieurs onglets, structurés de la même façon, avec sur chaque
onglet des toggle buttons similaires qui exécutent la même chose sur
leurs onglets respectifs.
Il ya également du code dans les Worksheet_Change et
Worksheet_Beforedoubleclick, qui est similaire. Seules les noms de
plage sur lesquelles s'exécute le code sont différents.
Dans le Worksheet_Change, j'ai placé cette ligne :
Call Feuille_DoubleClic(Feuille, Cible, Statut, Etat, Nom_Code,
Avancement)
Je passe Í  ma procédure (qui est dans un module standard) les
variables suivantes :
Feuille : index de la feuille "appelante"
Cible : = Target
Statut : booléen de l'état du toggle (je passe "True")
Nom_Code : le nom de la procédure du toggle de la feuille appelante
donc :  = "ToggleButton1_click()"
Avancement : le nom de la plage nommée Í  traiter dans la feuille
appelante
La procédure "générique" (Feuille_DoubleClic) fait le job, elle
s'exécute bien sur l'onglet "appelant" sauf que l'appel Í 
ToggleButton1_Click()  de cet onglet crée une erreur 438.
J'ai bien supprimé le "Private" devant le nom de la procédure
"ToggleButton1-Click() afin ma procédure puisse la voir.
Je ne sais pas dire Í  ma procédure : si l'état du ToggleButton est
"true" (ma variable Statut) alors lance la procédure du ToggleButton
qui est sur l'onglet actif.
J'espère que j'ai été un peu plus clair !
ThierryP

exemple Í  partir de ce je comprends :
Dans le module d'une feuille, tu as une macro de ce type :
Le bouton "commandButton1" émane de la barre d'outils "Activex"
C'est la même chose pour tous les contrÍ´les de cette barre.
'------------------------------
Private Sub CommandButton1_Click()
MsgBox "toto"
End Sub
'------------------------------
Dans un module standard, tu peux appeler la procédure
"CommandButton1_click" Í  partir d'une autre procédure
Voici la macro du module standard :
'-----------------------------
Sub toto()
Dim LaMacro As String
LaMacro = "'" & ThisWorkbook.Name & "'!feuil1.CommandButton1_Click"
Application.Run LaMacro
End Sub
'-----------------------------
Le Thisworkbook est mis en "'" et "'" parce que dans cela provoque une
erreur si le nom du classeur contient un espace dans son nom.
Le "Feuil1" dans "feuil1.CommandButton1_Click" n'est pas le nom de
l'onglet de la feuille, mais la propriété "Name" de l'objet Worksheet
visible seulement dans l'éditeur de code.
Si tu n'as aucune ligne de code mise en "jaune" pour cette erreur, place
devant l'appel de la procédure une ligne de code simple : Stop  cela va
arrêter l'exécution du code et tu utilises la touche F8 (pas Í  pas) afin
de terminer la macro. Tu utilises probablement une propriété qui
n'appartient pas Í  un objet donné. Désolé, je ne peux pas deviner!
MichD

dans la procédure "toto" du module standard, tu préfères travailler avec
le nom de l'onglet de la feuille, tu peux faire ceci :
'-------------------------------------
Sub toto()
Dim LaMacro As String, LaFeuille As String
'toto est le nom de l'onglet de la feuille de calcul
'LaFeuille = Propriété "Name" de l'objet Worksheet "toto"
LaFeuille = Worksheets("Toto").CodeName
'La Ligne de code devient
LaMacro = "'" & ThisWorkbook.Name & "'!" & LaFeuille &
".CommandButton1_Click"
Application.Run LaMacro
End Sub
'-------------------------------------
MichD
Avatar
ThierryP
Bonjour Denis,
Merci pour tes retours !
Tout roule maintenant, le souci venait apparemment du fait que je n'utilisais pas le CodeName dans mon code....
Tes exemples fonctionnent nickel, merci !!
ThierryP