Appliquer un code VBA de mise en forme de l'entête à plusieurs onglets exce
Bonjour,
Je suis toute novice en VBA, j'ai réussi à récupérer sur le net des bouts de code que j'ai réussi à mettre en place pour un de mes onglets mais je ne parviens pas à le faire sur les autres onglets.
1er code : mise à jour des TCD des 2 onglets lors du changement de sélection de liste déroulante en B1 de l'onglet "TCD 1" (en jaune, nommée "Choix") => OK ça fonctionne
2ème code : mise à jour de l'entête et du pied de page des 2 onglets "TCD 1" et "TCD 2" en fonction de la valeur de la cellule G1 (en bleu) => ça ne fonctionne que pour l'onglet "TCD 1"... Mon besoin est que l'entête soit renseigné avec la valeur de G1 et que le pied de page soit "page 1/n" pour les onglets TCD dans le cas présent "page 1/2" pour l'onglet "TCD 1" et "page 2/2" pour l'onglet "TCD 2".
Voici le code :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("Choix")) Is Nothing Then Exit Sub
PivotTables("TCD 1").PivotCache.Refresh
If Intersect(Target, Range("Choix")) Is Nothing Then Exit Sub
With ActiveSheet.PageSetup
'en-tête de page
.LeftHeader = ""
.CenterHeader = "&26&B" & Range("entete")
.RightHeader = ""
'pied de page
.LeftFooter = ""
.CenterFooter = "page " & "&P/&N"
.RightFooter = ""
End With
End SubEst-ce que vous pourriez m'aider s'il vous plaît ?
Merci et bonne journée !
Bonjour,
Si j'ai bien compris
Cdlt
Bonjour,
Merci beaucoup pour votre réponse mais l'idée est de ne modifier "Choix" que dans l'onglet "TCD 1" pour que les deux TCD soient mis à jour (ça, ça fonctionne avec mon code) et que les entêtes des deux onglets se mettent à jour automatiquement lors de la modification de sélection de "Choix" dans "TCD 1".
Je pense que je vais devoir effectivement recopier le code dans l'autre onglet en essayant de lier à "Choix" de TCD1... J'espère que je vais y arriver
Merci en tout cas !
Bonne journée
Alors,
J'ai un gentil collègue qui m'a trouvé ça :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("Choix")) Is Nothing Then Exit Sub
PivotTables("TCD 1").PivotCache.Refresh
If Intersect(Target, Range("Choix")) Is Nothing Then Exit Sub
Dim x As Byte
For x = 1 To Sheets.Count
With Sheets(x).PageSetup
'en-tête de page
.LeftHeader = ""
.CenterHeader = "&26&B" & Range("entete")
.RightHeader = ""
'pied de page
.LeftFooter = ""
.CenterFooter = "page " & "&P/&N"
.RightFooter = ""
End With
Next x
End Subça marche très bien MAIS sur mon vrai fichier qui contient environ 100 onglets c'est super long !
Je voudrais que la macro ne mette à jour qu'une liste d'onglets (dans mon vrai fichier je n'en ai que 9 sur les 100 à imprimer donc à mettre à jour pour les entêtes).
Si vous avez une idée, merci beaucoup et bonne journée !
Quels est le nom de ces 9 onglets?
Bonjour,
Les noms des onglets dans mon fichier sont un peu rébarbatifs
Dans mon fichier exemple je ne veux modifier que les onglets "TCD 1" et "TCD 2", pas les onglets "Janvier" et "Février".
Vous auriez une idée ?
Merci
Oui, un exemple;
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Byte
On Error GoTo Sortie
Application.EnableEvents = False
If Not Intersect(Target, Range("Choix")) Is Nothing Then
PivotTables("TCD 1").PivotCache.Refresh
For x = 1 To Sheets.Count
If Sheets(x).Name = "TCD 1" Or Sheets(x).Name = "TCD 2" Then
With Sheets(x).PageSetup
'en-tête de page
.LeftHeader = ""
.CenterHeader = "&26&B" & Range("entete")
.RightHeader = ""
'pied de page
.LeftFooter = ""
.CenterFooter = "page " & "&P/&N"
.RightFooter = ""
End With
End If
Next x
End If
Sortie:
Application.EnableEvents = True
End SubOh Super !
ça marche nickel sur mon fichier exemple, je teste dans mon "vrai fichier".
Mille mercis !!!
Euh, nouvelle petite question, je peux remplacer le nom des onglets par le n° de la feuille ?
Comme ces onglets ont des noms à rallonge, ça serait plus simple
Et dernière question, on ne peut pas indiquer une liste d'onglet plutôt que répéter avec des "or" ?
Une truc comme "if worksheet in (liste) then..." ? mais comme je n'y connais rien en VBA, j'écris peut-être n'importe quoi
On peut faire plus simple, si toutes les feuilles concernées commencent par TCD alors, on ne teste que les 3 premiers caractères du nom de la feuille, comme dans l'exemple ci-dessous:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Byte
On Error GoTo Sortie
Application.EnableEvents = False
If Not Intersect(Target, Range("Choix")) Is Nothing Then
PivotTables("TCD 1").PivotCache.Refresh
For x = 1 To Sheets.Count
If Left(Sheets(x).Name, 3) = "TCD" Then
With Sheets(x).PageSetup
'en-tête de page
.LeftHeader = ""
.CenterHeader = "&26&B" & Range("entete")
.RightHeader = ""
'pied de page
.LeftFooter = ""
.CenterFooter = "page " & "&P/&N"
.RightFooter = ""
End With
End If
Next x
End If
Sortie:
Application.EnableEvents = True
End Subil y a plusieurs façons de procéder, mais il faut connaître le fichier, sa structure (comment est agencé l'ordre des feuilles), le nom des feuilles à traiter. Partant de là, on adopte une attitude plutôt qu'une autre.
Merci Arturo,
Le soucis c'est que les noms de mes onglets dans le vrai fichier sont assez longs
J'ai voulu changer le code en mettant le numéro de la feuille mais ça ne fonctionne pas (je pense que c'est lié à .name=xxx)
Les onglets à mettre à jour sont les jaunes dans la capture écran ci-dessous
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Byte
On Error GoTo Sortie
Application.EnableEvents = False
If Not Intersect(Target, Range("Choix")) Is Nothing Then
PivotTables("GROUPE_TOP20+").PivotCache.Refresh
For x = 1 To Sheets.Count
If Sheets(x).Name = "Feuil27" Or Sheets(x).Name = "Feuil29" Or Sheets(x).Name = "Feuil30" Or Sheets(x).Name = "Feuil32" Or Sheets(x).Name = "Feuil35" Or Sheets(x).Name = "Feuil36" Or Sheets(x).Name = "Feuil39" Or Sheets(x).Name = "Feuil41" Or Sheets(x).Name = "Feuil42" Then
With Sheets(x).PageSetup
'en-tête de page
.LeftHeader = ""
.CenterHeader = "&26&B" & Range("entete")
.RightHeader = ""
'pied de page
.LeftFooter = ""
.CenterFooter = "page " & "&P/&N"
.RightFooter = ""
End With
End If
Next x
End If
Sortie:
Application.EnableEvents = True
End Sub
Vouloir traiter en boucle en jouant sur le N° de chaque feuille n'est pas possible puisque elles ne se suivent pas.
Je pense que pour simplifier au maximum le problème, il vous faut renommer toutes les feuilles que vous voulez imprimer en leur ajoutant en début de nom une valeur commune à toutes comme je vous l'avais fait précédemment pour le feuilles qui commençaient par"TCD". Eh bien, il faut partir sur la même idée, conservez le nom de chaque feuille mais avec l'adjonction d'une valeur commune telle par exemple "IMP_"
Ainsi cela donnerait pour certaines:
IMP_DSO 324 + 501 (2)
IMP_Groupe comparatifs échus + imp
IMP_DSO 501 (2)
Et dans le code que j'avais fourni en dernier, remplacez "TCD" par "IMP"
Merci beaucoup Arturo
J'ai fait comme ça et ça fonctionne très bien!
Merci pour votre temps