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 Sub

Est-ce que vous pourriez m'aider s'il vous plaît ?

Merci et bonne journée !

82023-test.zip (151.73 Ko)

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 !

dans mon vrai fichier je n'en ai que 9 sur les 100 à imprimer donc à mettre à jour pour les entêtes.
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 Sub

Oh 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 Sub

il 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
image

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

Rechercher des sujets similaires à "appliquer code vba mise forme entete onglets exce"