Appliquer une macro Excel à l'impression d'une feuille activ
Bonsoir,
J'aimerais, s'il-vous-plaît, avoir de l'aide pour qu'une macro Excel, qui incrémente automatiquement un numéro de facture à l'impression d'une feuille dans un classeur qui contient plusieurs feuilles, puissent s'appliquer sur certaines feuilles mais pas toutes les feuilles de mon classeur.
J'ai créé la macro dans le module 1 et j'aimerais savoir si avec un IF je pouvais éliminer les feuilles non concernées pour les imprimer sans que la macro se mette en marche.
Je vous remercie à l'avance du temps que vous accorderez à ma demande. Ça fait plusieurs jours que je vais sur les forums et je n'ai malheureusement pas trouvé ce que je cherche. Je dois vous avouer que je suis très novice en la matière.
Merci.
Danièle
Bonjour, cette petite routine est à compléter mais vous donne une base de départ :
Sub impression()
Dim feuille As Worksheet
For Each feuille In Worksheets
If feuille.Name <> "Feuil2" Then
'ici placer le code à effectuer pour la bonne feuille.
End If
Next
End SubEn quelques mots, les routines s'effectueruont sur toutes les feuilles ayant un nom different de "Feuil2"
Bonjour Machin,
Merci pour ta réponse.
Si j'ai environ 7 feuilles auxquelles je ne veux pas appliquer la macro dois-je faire comme suit?
Sub impression()
Dim feuille As Worksheet
For Each feuille In Worksheets
If feuille.Name <> "Feuil2" or feuille.Name <> "Feuil5" or feuille.Name <> "feuil8" Then
'ici placer le code à effectuer pour la bonne feuille.
End If
Next
End Sub
et ainsi de suite. Et pouvez-vous m'expliquer la signification du Next que vous avez mis avant le End Sub.
Merci encore pour votre implication.
Danièle
Oui pour la syntaxe c'est la bonne, cependant, il doit peut-être y avoir une façon plus simple de décrire le nom des feuilles mais je ne la connais pas.
Le next signifie litteralement "suivant" pour dire "on a vérifié le nom de la feuille 1 mais maintenant il faut vérifier le nom de la deuxième feuille dans le classeur" (et etc jusqu'à la dernière feuille) (il y a des tutoriels sur le site sur les boucles, vous devriez allez y jeter un petit coup d'oeil ce sera certainement mieux expliqué.)
La macro balaie ainsi toutes les feuilles présentes dans le classeur.
Sans le "next" la boucle n'aurai pas de sens car elle ne lirait que la première feuille du classeur et s'arreterait
Bonjour Machin,
Merci encore pour l'explication et je vais aller voir les boucles comme vous disiez dans votre message.
Par contre, comme je veux que la macro s'exécute une feuille à la fois, à l'impression, après avoir fait des modification dans la dite feuille, pensez-vous que je devrais laisser le Next parce que je ne veux pas que le no. de facturation change dans les autres feuilles si je n'y ai fait aucune modification parce que chaque feuille va avoir son propre no. de facturation. Ai-je bien compris la signification de Next?
Merci encore de m'accorder autant de temps.
Danièle
Bonsoir Machin,
Voici la Macro que j'ai créée pour incrémenter un numéro de facture à l'impression.
J'ai mis en commentaire l'impression parce que je le test sur ma feuille en l'exécutant manuellement jusqu'à ce qu'elle fonctionne.
Maintenant que j'ai ajouter les lignes For et IF elle ne fonctionne plus. Pourrais-tu, s'il-vous-plaît, me dire ce que je n'ai pas fait correctement?
Je te remercie d'avance pour ton aide.
Danièle
Sub Incrementer_numero_impression() 'Worksheet_BeforePrint(Cancel As Boolean)
'
' Incrementer_numero_impression Macro
'
'
Dim num As Integer
Dim feuille As Worksheet
For Each feuille In Worksheets
If feuille.Name <> ("Feuil1") Then
ElseIf feuille.Name <> ("Feuil2") Then
ElseIf feuille.Name <> ("Feuil3") Then
ElseIf feuille.Name <> ("Feuil5") Then
ElseIf feuille.Name <> ("Feuil9") Then
ElseIf feuille.Name <> ("Feuil13") Then
ElseIf feuille.Name <> ("Feuil22") Then
ElseIf feuille.Name <> ("Feuil23") Then
Range("C11").Select
num = Range("C11").Value
num = num + 1
Range("C11").Value = num
End If
Next
End Sub
Bonjour...le mieux c'est de tester en direct sur votre fichier la macro, analyser le résultat obtenu par rapport au résultat voulu puis de demander de l'aide ici si vous ne savez pas comment atteindre le résultat escompté
Sinon vous pouvez essayer de faire le listing des n° de feuilles dont la macro devra s'effectuer. exemple 1,3,5,8,9.
Puis vous utiliser la fonction choose.
Par exemple si vous avez 10 feuilles à traiter vous écrivez
for i = 1 to 10
feuille =application.WorksheetFunction.Choose(i,1,3,5,8,9) --> de se fait dans la variable feuille, il y aura le bon numéro de feuille à traiter
puis vous écrivez sheets(feuille).range("a28") = sheets(feuille).range("a28") + 1 (ce qui va prendre la valeur de la cellule A28 et lui ajouter 1)...de ce fait, seulement le chiffre de la feuille voulu sera incrémentée (en imaginant que le n° de facture se trouve en A28 bien sur)
puis vous continuez de dérouler votre macro
puis vous rajouter "next" pour indiquer que l'on va incrémenter i de 1.
Au début de la boucle I = 1 donc avec la fonction choose (qui veut dire choisir) cela correspond au Premier chiffre "1" dans la fonction choose après le i
une fois que la macro va arriver sur le "next" , elle va incrémenter i de 1, donc i va valoir 2 et avec la fonction choose, quand i = 2, feuille va prendre la valeur "3" car c'est le deuxième chiffres après le i dans la fonction choose...
Et etc jusque i = 10. une fois que i = 10 la routine s'arrête et i ne s'incrémente plus et la macro passe à la ligne suivante "End sub"
Je ne sais pas si j'ai été bien explicite mais quoi qu'il en soit, il est nécessaire pour vous de tester et d'analyser le résultat pour ensuite faire le point sur ce qu'il faut améliorer.
Bonsoir Machin,
Merci pour la nouvelle formule. Je vais l'essayer demain et je vous reviens avec le résultat.
Je m'excuse je n'étais pas disponible aujourd'hui.
À bientôt.
Danièle
Bonjour, je vous ai mis un classeur exemple pour montrer à peu près quel aspect doit avoir votre macro.
Bonjour Machin,
Merci encore pour l'exemple donnée. J'essaie ça et je vous reviens.
Bonne journée.
Danièle
J'ai omis de préciser, il y a un bouton sur la feuille 1...Désolé je ne suis pas très doué pour aider
Bonjour,
Merci d'avoir précisé qu'il y avait un bouton en feuille 1 ça m'a permis de comprendre ce que vous avez fait.
D'après ce que je vois vous sélectionnez une feuille après l'autre où la macro doit s'appliquer.
Ce que je veux faire c'est tout simplement ouvrir mon fichier Excel, cliquer sur la feuille appropriée pour un client donné, faire les modifications nécessaires sur cette feuille et l'imprimer avec un no. de facture.
Si un autre client se présente je refais la même chose que précédemment. Si je n'ai plus de clients qui se présentent je ferme mon document.
Si par contre je veux modifier une feuille interne (non reliée à un client), je ne veux pas avoir de no. de facture quand je l'imprime.
J'ai 8 feuilles internes sur 34 feuilles au total dans mon document soit 26 feuilles clients qui ont besoin d'un no. de facture à l'impression.
Je ne veux pas qu'un bouton sélectionne une feuille pour un client qui n'est pas en magasin.
Si j'ai besoin de sélectionné une feuille je le fais moi même.
Ce que j'ai besoin c'est que la macro fonctionne pour les 26 feuilles clients et qu'elle ne fonctionne pas pour les 8 feuilles internes.
J'espère que c'est plus clair maintenant.
Comme je n'ai que 8 feuilles qui n'ont pas besoin de la macro j'ai pensé interdire la macro sur 8 feuilles plutôt que de définir la macro 26 fois.
Voici ma macro modifié :
Sub Incrementer_numero_impression() 'Worksheet_BeforePrint(Cancel As Boolean)
'
' Incrementer_numero_impression Macro
'
'
Dim num As Integer
Dim feuille As Worksheet
For Each feuille In Worksheets
If feuille.Name = ("Feuil1") Then GoTo Fini
ElseIf feuille.Name = ("Feuil2") Then GoTo Fini 'endroit où l'erreur se produit et le ElseIf devient bleu
ElseIf feuille.Name = ("Feuil3") Then GoTo Fini
ElseIf feuille.Name = ("Feuil5") Then GoTo Fini
ElseIf feuille.Name = ("Feuil9") Then GoTo Fini
ElseIf feuille.Name = ("Feuil13") Then GoTo Fini
ElseIf feuille.Name = ("Feuil22") Then GoTo Fini
ElseIf feuille.Name = ("Feuil23") Then GoTo Fini
Else
Range("C11").Select
num = Range("C11").Value
num = num + 1
Range("C11").Value = num
Fini:
End If
Next
End Sub
Sur cette macro, quand je l'exécute elle me donne toujours une erreur de compilation Else sans If à la deuxième ligne du If soit la première ligne ElseIf et ElseIf devient bleu.
J'ai même essayé d'exécuter la macro avec seulement la ligne If et j'ai mis en commentaire toutes les lignes ElseIf pour voir si ça fonctionnait et j'ai eu droit à l'erreur de compilation Else sans If et cette fois c'est le Else qui devient bleu.
Je ne trouve pas l'erreur dans mon If. Est-ce que tu pourrais m'aider, s'il-vous-plaît? Je n'y comprend rien.
Merci beaucoup pour ton aide.
Danièle
Je pense qu'il est possible de faire un peu plus simple avec se code
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name <> "Feuil1" And Sh.Name <> "Feuil2" Then
Sh.[C11] = Sh.[C11] + 1
End If
End SubDans le fichier que j'ai joins, à chaque fois que vous selectionnez la feuille 3, la cellule C11 s'incrémentera de 1.
Si vous selectionnez les feuilles 1 et 2 la macro ne se lancera pas car il faut que le nom de la feuille soit différent de "Feuil1" et de "feuil2".
Si le concept est bon, vous n'avez qu'à continuer la ligne d'interdiction c'est à dire rajouter dans cette ligne les 6 autres feuilles internes.
If Sh.Name <> "Feuil1" And Sh.Name <> "Feuil2" ici rajouter les noms des feuilles interdites... ThenA noter que le code doit être collé dans thisworkbook et non dans un module (voir screeshot)
Bonsoir Machin,
J'ai essayé ta macro dans mon document et ça fonctionne très bien. Merci beaucoup. Le seul problème c'est que si jamais je me trompe de sélection de feuille le no. s'incrémente dès que je la sélectionne. Ce que je voudrais c'est que le no. s'augmente qu'à l'impression.
Devrais-je plutôt mettre :
Sub Private Worksheet_BeforePrint(Cancel As Boolean)
à la place de :
Sub Private Workbook_SheetActivate(ByVal Sh As Object)
ou autre chose ou ailleurs. Je sais que Sub Worksheet_BeforePrint(Cancel as Boolean) fonctionnait avant que je rajoute un If dans ma macro. si je dois remplacer le Sub Private à quel endroit dois-je mettre (ByVal Sh as Object) pour que mon If fonctionne et sélectionne la bonne feuille?
Ne te décourage pas trop parce qu'avec ton aide j'ai presque terminé avec mes questions.
Merci encore pour ton aide.
Danièle
Avec ceci je pense qu'on approche du but et je ne suis pas encore découragé, d'ailleurs je m'excuse aussi car je mets du temps pour comprendre...
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ActiveSheet.Name <> "Feuil1" And ActiveSheet.Name <> "Feuil2" Then
ActiveSheet.[C11] = ActiveSheet.[C11] + 1
End If
End SubJ'ai testé de la façon suivante, lancement de l'impression a partir de la feuille active (en tapant CTRL+P) et cela ne s'incrémente que si je suis sur la feuille 3.
Bonjour Machin,
Je m'excuse de ne pas avoir donné suite avant aujourd'hui à votre dernière réponse mais je n'étais pas disponible ces derniers jours.
La nouvelle version de la macro telle que vous me l'avez envoyée fonctionne à merveille.
Merci pour votre coup de main. C'est génial. Je suis tout excitée de pouvoir l'appliquer à mes feuilles de commandes.
Encore une petite chose, s'il-vous-plaît, mon patron m'a demandé de mettre le no. de facturation sur la feuille 1 dans U5 et sur la feuille 13 dans W2 au lieu de C11 pour toutes les autres feuilles excepté les feuilles 2 et 3. Quand j'utilise ElseIF pour ces deux feuilles (1 et 13) j'obtiens toujours une erreur Else sans If et je ne comprend pas pourquoi le ElseIF ne fonctionne pas. Je pense avoir la bonne terminologie pour le ElseIf. Si ce n'est pas le cas, s'il-vous-plaît, faire la correction car je ne sais pas ce qui cloche. Pourriez-vous, s'il-vous-plaît, me permettre de prendre encore de votre temps pour m'aider?
Voici ta macro modifiée :
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ActiveSheet.Name = "Feuil1" Then ActiveSheet.[U5] = ActiveSheet.[U5] + 1
ElseIf ActiveSheet.Name = "Feuil13" Then ActiveSheet.[W2] = ActiveSheet.[W2] + 1
ElseIf ActiveSheet.Name <> "Feuil2" And ActiveSheet.Name <> "Feuil3" Then
ActiveSheet.[C11] = ActiveSheet.[C11] + 1
End If
End Sub
Merci encore une fois.
Danièle
Bonjour Danièle, pas de souci...
La bonne syntaxe est celle-ci, où ce qu'il y a de surligné en vert n'est pas sur la même ligne que le if du départ:
If ActiveSheet.Name = "Feuil1" Then
ActiveSheet.[U5] = ActiveSheet.[U5] + 1
ElseIf ActiveSheet.Name = "Feuil13" Then ActiveSheet.[W2] = ActiveSheet.[W2] + 1
ElseIf ActiveSheet.Name <> "Feuil2" And ActiveSheet.Name <> "Feuil3" Then
ActiveSheet.[C11] = ActiveSheet.[C11] + 1
End If
End SubEt très certainement qu'il vous martèle que vous avez un else sans if car si vous écrivez sur une même ligne if, then, et une instruction alors "end if" est implicite. De se fait, la ligne du dessous commençant par elseif, vba renvoi une erreur car il ne lit pas d'instruction if d'ouvert (au dessus) vu que le précédent est implicitement fermé.
c'est la seule explication logique que j'ai trouvé (je n'ai que de maigre notion en vba)
Bonjour Machin,
Je vais essayer ce nouveau modèle et je vous reviens dès que possible, Par contre je trouve que la façon de composer les If avec des ElseIf est quand même bizarre parce que j'avais tout mais il faut que je le mette sur 2 lignes. J'essaye.
Merci.
À bientôt.
Danièle
Il y a très certainement une logique de programmation que nous ne connaissons pas et qui a une raison d'être. Vous aviez tout juste dans l'utilisation des elseif sauf pour une ligne, c'est déjà très bien je trouve.
Bonsoir Machin,
C'est certain que certaines logiques de programmation font une grosse différence surtout quand notre logique personnelle n'est pas la même. Merci de m'encourager.
Vous ne le croirez peut-être pas mais j'ai bâti ma macro comme la vôtre et je l'ai testée. Malheureusement, elle ne fonctionne pas pour la feuille 1 avec le no. de facture dans U5 et pour la feuille 13 avec le no. de facture dans W2. Par contre elle fonctionne pour tous les autres feuilles avec le no, de facture dans C11.
Je ne sais plus quoi faire. J'ai même essayer de la faire fonctionner avec seulement le 1er If avec la feuille 1 et U5 sans les ElseIf et ça n'a pas fonctionné et j'ai aussi essayé la même chose avec la feuille 13 et W2.
Je dois avouer que la feuille 1 à une macro qui y est attachée (qui a été bâtie par quelqu'un d'autre) et je me demandais si cette macro prenait le dessus de ma Sub macro à l'impression. J'ai même vérifié dans cette macro si elle touchait à la cellule U5 et la réponse est non. Même à ça, la feuille 13 et W2 n'a pas fonctionné et il n'y a pas de macro attachée à cette feuille.
Pouvez-vous encore m'aider, s'il-vous-plaît?
Je vous remercie encore à l'avance.
Danièle