Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Procédures évènementielles communes

4 views
Skip to first unread message

ThierryP

unread,
Apr 14, 2022, 11:00:50 AM4/14/22
to
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
'------------------------------------------------------------------------------------------------------------------

MichD

unread,
Apr 14, 2022, 11:23:30 AM4/14/22
to
Le 14/04/22 à 11:00, ThierryP a écrit :
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

Michel__D

unread,
Apr 14, 2022, 11:29:02 AM4/14/22
to
Tu as mis : .Bouton_Code

Ce qui signifie que c'est soit une propriété ou soit une méthode de Sheets(F_Index)

MichD

unread,
Apr 14, 2022, 11:32:52 AM4/14/22
to

Le 14/04/22 à 11:23, MichD a écrit :
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

ThierryP

unread,
Apr 15, 2022, 2:18:44 AM4/15/22
to
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

MichD

unread,
Apr 15, 2022, 6:33:51 AM4/15/22
to
Le 15/04/22 à 02:18, ThierryP a écrit :
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



MichD

unread,
Apr 15, 2022, 7:19:11 AM4/15/22
to
Le 15/04/22 à 06:33, MichD a écrit :
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

ThierryP

unread,
Apr 19, 2022, 3:58:15 AM4/19/22
to
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
0 new messages