J'ai un soucis de simplification sur un tableau de 24 onglets qui sera amené à en avoir plus.
Voici mon problème :
Je veux créer un bouton VBA “Imprimer” (qui avant d’imprimer exécute plusieurs tâches) sur chaque feuille de mon fichier. Le bouton sera situé en A1.
Je précise que pour des raisons esthétiques et pratiques, je préfère utiliser un bouton “ActiveX” dont je pourrai personnaliser la couleur plutôt qu'un bouton "Formulaire".
Avec un bouton "Formulaire" pas de soucis, on met le code dans un module et tous les boutons lui seront reliés. Mais là en mode "ActiveX", impossible (disons que je n'ai pas réussi...).
J'ai donc réalisé l'opération en manuel mais pour cela j'ai dû recopier le même code sur chaque "Sheets" (VBA). Du coup, j’ai le même code sur 24 onglets (pour l’instant…) (fichier en PJ).
Mais si je veux modifier le code par ex., je dois le faire pour chaque onglet, donc 24 fois!!!
Comment faire pour simplifier de la même façon qu’avec le mode “Formulaire”?
J’avais pensé mettre la formule d'impression dans “ThisWorkBook” et mettre un renvoi standardisé dans chaque “Sheets”.
Par contre pour le code je ne sais pas faire…
A moins qu'il y ait une solution via "Module".
A défaut de trouver mieux, je te propose de n'écrire qu'une seule macro, dans un module.
Tu peux utiliser la macro "Imprimer_Module_Click()" que tu as dans le Module1, mais donne-lui un nom unique, par exemple Imprimer(), sinon ça va planter.
Et dans la macro Imprimer_Module_Click() de chacun de tes boutons ActiveX tu fais simplement un Call Imprimer()pour appeler la macro du module.
Bonjour,
Une piste avec des ShapeRectangles.
Ce que j'ai fait :
1) j'ai viré l'ActiveX sur chaque feuille
2) viré le code s'y afférant sur chaque feuille
3) construit un ShapeRectangle sur chaque feuille avec la procédure aa (que vous pouvez renommer à votre convenance)
VB:
Sub aa()
Dim S As Worksheet
Dim SH As Shape
Dim REC As Excel.Rectangle
'---
For Each S In ThisWorkbook.Worksheets
S.Select 'non nécessaire, pour visualiser
'--- Vérifie si la Shape existe déjà ---
On Error Resume Next
Set SH = ActiveSheet.Shapes("impression")
'--- Sinon poursuite du traitement ---
If Err <> 0 Then
Err.Clear
'--- Création d'une ShapeRectangle ---
Set SH = ActiveSheet.Shapes.AddShape(msoShapeRectangle, _
Left:=0, Top:=0, Width:=98.25, Height:=18.75)
SH.Name = "impression"
'--- On récupère l'Object Rectangle de la Shape ---
Set REC = ActiveSheet.Rectangles(SH.Name)
'--- Propriétés du Rectangle ---
With REC
.Border.Color = RGB(175, 175, 175) 'un gris
.Interior.Color = vbCyan
.Text = "Imprimer"
.OnAction = "Imprimer_Module"
With .Font
.Color = vbBlack
.Name = "MS Dans Serif"
.Size = 10
.Bold = True
End With
End With
End If
Next S
End Sub
Sub Imprimer_Module() 'votre traitement
Dim i As Long
For i = 1 To 1
ActiveSheet.Unprotect
''Range("S:Y,AP:AS,AT:BK").Select
''Selection.EntireColumn.Hidden = True
''ActiveSheet.PageSetup.CenterHeader = "&""Arial,Gras""&25HEBERGEMENT"
ActiveWindow.SelectedSheets.PrintPreview
'ActiveWindow.SelectedSheets.PrintOut
''Selection.EntireColumn.Hidden = False
''Range("I:J,AH:AO,AT:BK").Select
''Selection.EntireColumn.Hidden = True
''ActiveSheet.PageSetup.CenterHeader = "&""Arial,Gras""&25RESTAURATION"
'ActiveWindow.SelectedSheets.PrintPreview
'ActiveWindow.SelectedSheets.PrintOut
''Selection.EntireColumn.Hidden = False
''ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
Next i
''ActiveWorkbook.Save
End Sub
Et oui je sais, avec 7 mois de retard...
Toutes mes sincères excuses...
D'autant plus après avoir lu le contenu de vos propositions, je me rends compte du temps passé, et du contenu des fichiers sérieusement denses... et complexes à la fois...
Pour répondre à tous en détail :
- ChTi160 :
Tes fichiers sont impressionnants de maîtrise! Bon en même temps je suis un vrai noob en VBA donc je suis vite impressionné. Mais là en plus de la technique tu as dû y passer pas mal de temps car comme je le disais plus haut, le contenu est dense...
Mais pour le VBA, vu que je suis débutant (et que je vais probablement le rester), j'ai besoin de comprendre un minimum ce qui est proposé, de telle manière que je puisse le réutiliser en cas de besoin.
Même si tu as pris la peine d'expliquer chaque ligne de code, j'avoue que je m'attendais à qque chose de bien plus concis, et simple à mettre en place.
Donc je vais garder les fichiers sous le coude (que j'ai annotés pour une éventuelle réutilisation), mais pour cette fois, je vais me diriger vers qque chose de plus simple.
Par contre le fichier 3 est très intéressant avec la fenêtre à cocher qui s'ouvre et les boutons "Imprimer" et "Quitter", ça c'est super bien vu, et cette version-là , je la réutiliserai probablement!
- Si... :
* Fichier "UsF pour Bouton Commande" :
Une autre solution fonctionnelle, mais comme dit plus haut à ChTi160, étant un noob, je cherche qque chose que je maîtrise à peu près, à savoir ce que j'avais décrit dans la question :
Relier chaque bouton ActiveX de chaque feuille directement au Module1 ou se tiendrait la macro.
En effet, les boutons (ActiveX ou Formulaire) je sais faire, la macro correspondante, je sais faire aussi, la seule chose qu'il me manque c'est relier les 2.
Ce serait bcp plus simple avec les boutons Formulaire, mais on ne peut pas les colorer comme ceux ActiveX, d'où ce choix.
D'ailleurs la question peut-être contournée par :
"Comment fait-on pour colorer un bouton Formulaire de la même manière qu'un bouton ActiveX"?
Et là le problème est réglé!
* Fichier "Cellule Bouton multifeuille" :
Alors là en terme simplicité on ne fait guerre mieux, vraiment top, par contre je n'ai pas compris d'où vient ce bouton "design" (ce serait top d'avoir une "boutonthèque") ni le fonctionnement de la macro.
Mais pourquoi pas, à voir quand j'aurai tout compris.
- PMO2 :
L'idée est efficace effectivement puisqu'elle permet de contourner la restriction de design du bouton Formulaire, mais compliquée à mettre en place, vu que j'utilise régulièrement les boutons, c'est une formule plus simple que j'attendais, qui répondait à la demande initiale :
"Comment faire pour simplifier de la même façon qu’avec le mode “Formulaire”?...
Par contre pour le code je ne sais pas faire…"
Donc comme pour les autres très aimables contributeurs, je vais garder ce code sous la main, en attendant mieux.
- Marcel32 :
C'est toi qui remporte le pompon cher Marcel32!
En effet, c'est la solution la plus simple de toutes à ce jour.
Selon ta proposition, voici ce que ça donne :
- Dans les feuilles :
Code:
Private Sub Imprimer_Click()
ImprimerModule
'ou "Call Imprimer"
End Sub
- Dans le Module1 :
Code:
Sub ImprimerModule()
ActiveSheet.Unprotect
ActiveWindow.SelectedSheets.PrintPreview
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
ActiveWorkbook.Save
End Sub
En attendant, je tiens à vous dire à tous un MERCI!!! pour vos promptes réponses! bien plus que ma présente réponse... et surtout aussi riches.
Si je trouve une ultime solution encore plus simple qui relie directement le bouton ActiveX au Module1 sans passer par la formule de renvoi sur chaque feuille, tout comme on peut le faire avec un bouton Formulaire, je reviendrai partager l'info avec vous.
En attendant si vous trouvez la solution avant moi, ce sera avec grand plaisir.
Ou mieux, si vous trouvez la réponse à cette question, comme dit plus haut :
"Comment fait-on pour colorer un bouton Formulaire de la même manière qu'un bouton ActiveX"?
Et là le sujet sera clos pour de bon!
Merci encore pour votre aide et à très bientôt peut-être...
Je promets de répondre avant 7 mois...