Pied de page variable
Bonjour,
Je souhaite ajouter à mon document un pied de page (ou un en-tête) variable, c'est à dire que pour chaque page il affiche le premier et le dernier mot du tableau de la page (dans l'idée: faire comme un dictionnaire où en haut de la page on voit le premier et le dernier mot de la page).
Sauriez-vous m'aider?
D'avance merci.
Bonjour. Bienvenue sur le forum
Merci de joindre lors de tes futures demandes, un fichier Excel en exemple de ce que tu souhaites.
Un exemple de Code pour insérer en entête le contenu de A1 et L20 de chaque Feuille du classeur
Code dans un Module
Option Explicit
Sub Entetes()
Dim Ws As Worksheet
Application.ScreenUpdating = False
For Each Ws In Worksheets
Ws.Select
ActiveSheet.PageSetup.CenterHeader = Range("A1").Value & " " & Range("L20").Value
Next Ws
End SubCordialement
Tout d'abord merci.
Mais est-il possible que l'en-tête soit différent pour chaque page du fichier (c'est un bloc, pas des feuilles).
Du principe:
Si numero_page == 1 { afficher dans l'en-tête les cellules A1 et L20 }
Ou Si numero_page == 2 { la suite }
Ou Si numero_page == 3 { la suite }
etc
(Je n'ai pas de fichier explicite, qui soit clair
Bonjour
Tu peux définir pour chaque Feuille
Sub Entetes()
Application.ScreenUpdating = False
Sheets("Feuil1").Activate
ActiveSheet.PageSetup.CenterHeader = Range("A1").Value & " " & Range("L20").Value
Sheets("Feuil2").Activate
ActiveSheet.PageSetup.CenterHeader = Range("A6").Value & " " & Range("L25").Value
Sheets("Feuil3").Activate
ActiveSheet.PageSetup.CenterHeader = Range("B2").Value & " " & Range("J16").Value
End SubCordialement
Et si l'on utilise pas de feuilles?
Bonjour
Et si l'on utilise pas de feuilles?
On n'a plus de problème à règler puisqu'on n'a plus de pied de page, ni d'entête!
Cordialement
Ce que je veux dire, c'est que je n'utilise pas de feuilles. Mon fichier est composé de plusieurs pages qui se suivent, mais je n'utilise pas de feuilles. Or si j'ai bien compris ta solution, il faut qu'il y ai des feuilles non?
Bonjour
Je commençais à sombrer dans l'humour...
Le quiproquo est limpide et non signalé au premier exemple.
Si personne ne se penche sur ton sujet, je m'y remettrai..voir si..
Cordialement
Merci, et d'avance encore merci.
Bonjour,
Ce code devrait répondre à ta demande :
Sub ImprPageSetupPerso()
Dim rPremCell As Range, rDernCell As Range
Dim LigDeb As Long, LigFin As Long, ColDeb As Long, ColFin As Long
Dim l As Long, c As Long, Sh As Worksheet, lPage As Long
Set Sh = ActiveSheet
Sh.PageSetup.OddAndEvenPagesHeaderFooter = False ' Pied de page différent pour la première page
Sh.PageSetup.DifferentFirstPageHeaderFooter = False ' Pide de page différent entre les pages paires et impaires
Set rPremCell = Sh.Range(Split(Sh.PageSetup.PrintArea, ":")(0)) ' Première cellule de la zone d'impression
Set rDernCell = Sh.Range(Split(Sh.PageSetup.PrintArea, ":")(1)) ' Dernière cellule de la zone d'impression
Select Case ActiveSheet.PageSetup.Order
Case xlDownThenOver ' Impression vers le bas puis la droite
For c = 1 To Sh.VPageBreaks.Count + 1
If c = 1 Then ColDeb = rPremCell.Column Else ColDeb = Sh.VPageBreaks(c - 1).Location.Column ' Colonne de début de la page
If c = Sh.VPageBreaks.Count + 1 Then ColFin = rDernCell.Column Else ColFin = Sh.VPageBreaks(c).Location.Offset(0, -1).Column ' Colonne de fin de la page
For l = 1 To Sh.HPageBreaks.Count + 1
If l = 1 Then LigDeb = rPremCell.Row Else LigDeb = Sh.HPageBreaks(l - 1).Location.Row ' Ligne de début de page
If l = Sh.HPageBreaks.Count + 1 Then LigFin = rDernCell.Row Else LigFin = Sh.HPageBreaks(l).Location.Offset(-1, 0).Row ' Ligne de fin de page
lPage = lPage + 1
' Ligne à personnaliser en fonction de tes besoins
Sh.PageSetup.LeftFooter = "De " & Sh.Cells(LigDeb, ColDeb) & " à " & Sh.Cells(LigFin, ColDeb)
Sh.PrintOut lPage, lPage
Next l
Next c
Case Else ' Impression vers la droite puis le bas
For l = 1 To Sh.HPageBreaks.Count + 1
If l = 1 Then LigDeb = rPremCell.Row Else LigDeb = Sh.HPageBreaks(l - 1).Location.Row ' Ligne de début de page
If l = Sh.HPageBreaks.Count + 1 Then LigFin = rDernCell.Row Else LigFin = Sh.HPageBreaks(l).Location.Offset(-1, 0).Row ' Ligne de fin de page
For c = 1 To Sh.VPageBreaks.Count + 1
If c = 1 Then ColDeb = rPremCell.Column Else ColDeb = Sh.VPageBreaks(c - 1).Location.Column ' Colonne de début de la page
If c = Sh.VPageBreaks.Count + 1 Then ColFin = rDernCell.Column Else ColFin = Sh.VPageBreaks(c).Location.Offset(0, -1).Column ' Colonne de fin de la page
lPage = lPage + 1
' Ligne à personnaliser en fonction de tes besoins
Sh.PageSetup.LeftFooter = "De " & Sh.Cells(LigDeb, ColDeb) & " à " & Sh.Cells(LigFin, ColDeb)
Sh.PrintOut lPage, lPage
Next c
Next l
End Select
End SubLe programme se comporte différemment en fonction de l'ordre des pages (Mise en page/Feuille/Ordre des pages), c'est la raison pour laquelle il y a deux boucles inversées.
A+
Benoît Marchand
[Benead]
Bonjour tout le monde
@ Benoît
Je me suis intéressé à ce sujet dès le début et j’ai enfin eu le temps de tester ton code. Parfois il fonctionne sans problème et parfois, selon différents essais, il ne génère plus les résultats attendus.
C’est assez rageant car je n’arrive pas à définir à quelles conditions exactes ça créé des problèmes et je ne sais trop comment t’expliquer cela.
Par exemple si je rajoute ou que j’enlève des lignes et que je corrige la zone d’impression avant de lancer le code - dans cet exemple ma feuille à finalement 3 pages - j’ai parfois la page 1 qui est imprimée avec son pied de page correct, la page 2 avec le pied de page qui indique la première cellule de la page 2 suivi de la dernière cellule de la page 3 (!) et la page 3 n’est pas imprimée.
Parfois j’ai aussi eu d’anciens pieds de page qui étaient restés comme bloqués, qui n’étaient pas renouvelés en fonction de la nouvelle zone d’impression inscrite manuellement.
Tu verras dans le code du fichier ci-joint que j’ai également fait l'essai de supprimer l’ancien pied de page afin d’en forcer le renouvellement (pas très concluant) et l'essai d’actualiser automatiquement la zone d’impression (pas très concluant non plus). A propos de ce dernier essai, aurais-tu une idée afin de mettre en place cette option ?
A te relire.
Bonjour Yvouille,
Désolé pour le retard.
J'ai regardé et je pense avoir trouvé. Le problème numéro un est que dès que l'on touche à l'impression, à la mise en page on fait appel au pilote d'impression qui gère implicitement les sauts de page, les marges... Et là je t'avoue que cela devient très compliqué.
Pour répondre à ta problématique, d'après mes tests, et aussi bizarre que cela puisse paraître, le fait d'imprimer un nombre de pages qui semble aléatoire dépend principalement de l'emplacement de la cellule active, si elle est positionnée sur la première page, la macro n'imprime que la première page, si elle est sur la seconde, on imprime les 2 premières pages....
Un autre problème qui a certainement perturbé tes tests d'impression, est que tu avais mis la macro ImprPageSetupPerso dans l'événement Workbook_BeforePrint, elle devenait donc récursive si tu lançais le programme d'impression via le bouton.
Quand on imprime avec le bouton imprimer, Excel me sort deux fois l'impression une fois avec la macro + plus une fois car tu n'as pas arrêté l'évenement après l'exécution de la macro d'impression. Il faut mettre un Cancel=True la ligne suivante du Call dans l'événement Workbook_BeforePrint.
Voici le fichier corrigé :
Tu verras, pour que la macro fonctionne correctement, on change simplement la vue (vue des sauts de pages) pour qu'Excel charge dans les PageBreaks tous les sauts de page ; je ne sais pas trop pourquoi on est obligé de faire cela mais je pense que c'est en relation avec le pilote d'impression.
A+
Benoît Marchand
[Benead]
Salut Benoît et merci d'être revenu à la charge sur ce fil pour répondre à mes questions.
Je suis actuellement en vacances dans un chalet sans imprimante, mais je me réjouis de pouvoir effectuer des tests dès la semaine prochaine. Si nécessaire, je me permettrai de te contacter à nouveau.
Encore merci et bonne continuation.