[VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Staple1600

XLDnaute Barbatruc
Bonjour à tous

Situation de départ
Suite à la lecture de ce fil
https://www.excel-downloads.com/threads/envoie-dune-feuille-par-email.78303/

J'ai vu dans le code VBA qu'il y avait 12 boutons pour imprimer 12 feuilles mensuelles
avec 12 macros du type
Sub ImprimerJanvier()
Sheets("Janvier").PrintOut
End Sub

Problème
NB: Cette demande n'est pas liée au problème initial de l'auteur du poste cité

Mon but est de faire une seule macro Impression
qui imprime la feuille du mois selon la caption du Button

Voila ou j'en suis

Code:
Dim X As String
Dim mois As Variant
For Each obj In Sheets("KILOMETRAGE").DrawingObjects
If TypeName(obj) Like "Button*" And obj.Characters.Text Like "Imprimer*" Then
X = Application.Trim(StrReverse(Right(obj.Characters.Text, Len(obj.Characters.Text) - 8)))
mois = StrReverse(X)
MsgBox mois

J'essaie de créer un module de classe

mais je ne sais pas la bonne syntaxe
'dans le module de classe
Code:
Public WithEvents ButtonGroup As [B]Shapes[/B]
[B]ou As DrawingObjects[/B]
[B]ou As MSForm.CommandButton[/B]
Private Sub ButtonGroup_Click()
MsgBox "Bouton cliqué =" & ButtonGroup.Name
End Sub

J'ai sous la main un exemple de module de classe mais qui
s'applique sur des commandbutton d'un userform

et je n'arrive pas à l'adapter pour le cas de boutons (issus de la BO Formulaires)


Merci à l'avance pour l'aide que vous m'apporterez.

Staple
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Bonjour Spitnolan08

Merci pour ton lien

edit : Dans ton fichier
Option Explicit
Public WithEvents MesBoutons As MSForms.CommandButton 'OLEObject

Quoi mettre à la place de MSForms.CommandButton
pour désigner un bouton de la BO Formulaire

As Button.DrawingObjects?



//////////////////////////////////


J'avais déjà ce genre de solutions avec des CommandButtons
avec des modules de classe

La problème c'est que dans le classeur qui est l'origine
de ma prise de tête du jour avec VBA

il ya des boutons issues de la BO formulaire

et je n'arrive pas à trouver la bonne syntaxe à ce niveau

Public WithEvents ButtonGroup As Shapes
ou
Public WithEvents ButtonGroup As DrawingObjects
ou
Public WithEvents ButtonGroup As MSForm.CommandButton

Je m'entête car je voudrais au cas ou je serais confronté dans le futur
à un classeur qui contient des boutons (BO Formulaires)

je ne voudrais pas remplacer les boutons par des commandbutton
juste parce que a solution n'a pas été trouvé

J'ai cherché sur le net, dans MPFE

et je netrouve pas d'exemple de syntaxe

Dans tous mes essais seul le code ci-dessous
fonctionne
Code:
Dim X As String
Dim mois As Variant
For Each obj In Sheets("KILOMETRAGE").DrawingObjects
If TypeName(obj) Like "Button*" And obj.Characters.Text Like "Imprimer*" Then
X = Application.Trim(StrReverse(Right(obj.Characters.Text, Len(obj.Characters.Text) - 8)))
mois = StrReverse(X)
MsgBox mois

mais il ne sert à rien pour le moment
 
Dernière édition:

Spitnolan08

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Re,
La problème c'est que dans le classeur qui est l'origine
de ma prise de tête du jour avec VBA

il ya des boutons issues de la BO formulaire
Tu as du voir que ce fut aussi notre prise de tête et que nous avons (Bebere et moi même) opté en parrallèle, et sans consultation préalable, après moult essais infructueux pour les commandButton de la boite à outils...

Ce ne dot pas être difficile de remplacer tes boutons formulaires par ceux ci.. Si ?

Bon courage
Bien sûr, bien que je n'utilise que très rarement les boutons issus du formulaire, si un pro du module de classe a une idée...

Cordialement

Edit : sinon, tu peux t'inspirer du dernier fichier mis en ligne par Pierrejean sur le fil indiqué plus haut et qui utillise astucieusement Application.caller
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Re

Non ce n'est pas difficile

Mais je n'aime rester sur un échec

Il doit bien y avoir une possibilité non?

edit: issu du fichier de pierrejean

mois = Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre")
x = CInt(Replace(Application.Caller, "Bouton ", ""))

->pierrejean (si tu passes par la), Spitnolan08 et vous autre VBAistes
pouvez m'apporte quelques explications, svp

Ai-je bien compris

Replace...
remplale la chaine "Bouton" par rien
CInt....
conversion de Application.Caller(rien) par un chiffre
Chiffre qui ira chercher le mois dans l' Array() (sans mauvais jeux de mots:p )

Et dans le fichier de Pierrejean ce sont bien des boutons (BO formulaires) non?
 
Dernière édition:

Spitnolan08

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Re,

Je comprends... Mais l'important n'est il pas de passer l'obstacle d'une manière ou d'une autre ?
Mais en attendant, tu as une solution qui fonctionne.

As tu vu le edit que j'ai rajouté à mon dernier post? Encore une autre voie pour conserver tes boutons formulaire.;)

Cordialement
 

MichelXld

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

bonjour Staple1600, bonjour Spitnolan08

en utilisant Application.Caller:
Tu nommes les boutons formulaire à l'identique de chaque feuille à imprimer.
et tu assignes la macro suivante à chacun des boutons:

Code:
Sub MacroGlobale()
Worksheets(Application.Caller).PrintOut Copies:=1, Collate:=True
End Sub


Bon après midi
MichelXld
 

Spitnolan08

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Re,
Bonjour MichelXld,

Je ne comprends pas ta dernière question
Donc nouvelles quetions dans mon edit de ma précente réponse
Apparement tu as compris comment ça marche...
et Michel vient de t'indiquer la suite, si j'ai bien compris ton pb...

Et si Michel ne te donne pas une solution pour le module de classe c'est qu'il ne doit pas y en avoir ou alors qu'il n'a pas eu encore l'occasion ou l'utilité de réfléchir à ce pb...

Cordialement
 

Staple1600

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Bonjour MichelXLD


Merci pour ta réponse concise

Mais aujourd'hui je m'entète et j'ai envie de me compliquer la vie

Admettons que dans un classeur X j'ai N boutons

dont la caption contient la chaine "Imprimer XXXX"

ou XXXX peut des noms de mois mais aussi n'importe quelque chaine de caractère

avec ce code alambiqué de mon cru
X = Application.Trim(StrReverse(Right(obj.Characters.Text, Len(obj.Characters.Text) - 8)))
X= StrReverse(X)


J'identifie la chaine qui correspond au nom d'une feuille X

Donc si je clique sur le bouton "Imprimer Janvier"

Comment obtenir ton résultat ?

et c'est que la je m'obstine sur lemodule de classe


'Macro fontionnelle quand bouton=nom feuille
Sub MacroGlobale()
'Auteur: MichelXLD
Worksheets(Application.Caller).PrintOut Copies:=1, Collate:=True
End Sub
 

MichelXld

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

rebonjour

Effectivement je n'ai pas de solution par module de classe ... ;o)


Pour retrouver le texte du bouton cliqué, à partir de l'exemple précédent:

Code:
Sub MacroGlobale()
MsgBox ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Caption
End Sub


Bon après midi
MichelXld
 

Spitnolan08

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Re,
Mon question actuelle

est-dans la cas ou les boutons ont un non (ou caption) variables

comment identifer sur quel botuion on vient de cliquer

pour lancer une macro globale (dans l'exemple une impression)
Ca j'ai compris, si ce n'est que je ne sais pas ce que c'est que des caption variables. Et que tu ne réponds pas à ma question : y a t il sur ton bouton le nom de la feuille à imprimer d'une façon ou d'une autre ?

Cordialement
 

Staple1600

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Re


Une petite recap s'impose


La solution de MichelXLD
fonctionne parfaitement
dans le cas ou les boutons sont nommés exactement comme les feuilles

Dans l'exemple (qui est dans la pièce jointe du précedent message)

les boutons ne sont pas nommés
c'est en identifiant
obj.Characters.Text (ce que j'appelle Caption)
que l'on sait sur quel bouton on clique

mais avec le code tel quel
une msgbox affiche tous boutons

Ce que je cherche à faire

C'est qu'en fonction obj.Characters.Text (dont une partie de la chaine de caractère correponds à une feuille du classeur)
se lance une macro "globale" qui éviterait d'avoir une macro
pour chaque bouton qui fasse en fait la même chose

Ce qui était le cas dans le claseur qui est à l'origine de ce post

12 boutons "Imprimer Mois" donc donc 12 macros d'impression.


PS: le fichier joint du précedent message est une copie
d'un classeur réalisé par PierreJean dans le post
cité par Spitnolan08
 
Dernière édition:

MichelXld

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

rebonjour

La solution de MichelXLD
fonctionne parfaitement
dans le cas ou les boutons sont nommés exactement comme les feuilles

Tu n'as pas lu mon dernier message ....



Adapté à ton classeur

Code:
Sub MacroGlobale()
Dim Chaine As String
 
Chaine = ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Caption
 
If InStr(1, Chaine, "Imprimer", vbTextCompare) > 0 Then
    'Caption des boutons supposés du style "Imprimer Janvier", "Imprimer Fevrier"...
    'MsgBox Mid(Chaine, 10)
    Worksheets(Mid(Chaine, 10)).PrintPreview
End If
End Sub



Bon après midi
MichelXld
 

Spitnolan08

XLDnaute Barbatruc
Re : [VBA] Module de classe : Button (BO Formulaire) Explications demandées SVP

Re, Toujours pas tout compris à ton pb mais ce code fonctionne :
Code:
Sub MacroGlobale()
Y = Trim(ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Caption)
X = Trim(Mid(Y, 9))
Sheets(X).Select
End Sub
Cordialement

Edit: pas vu la réponse de MichelXld mais ça revient au même...pour les mêmes cas en rempaçant Select par PrintPreview.
 
Dernière édition:

Discussions similaires

Réponses
29
Affichages
917

Statistiques des forums

Discussions
312 195
Messages
2 086 078
Membres
103 111
dernier inscrit
Eric68350