Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Mise en forme de TCD par une macro

2 réponses
Avatar
VIB
Bonjour.

Je suis nouveau sur ce forum, je vais essayer de faire de bons débuts...

Voici ma problématique:

Je dispose d'un tableau de données dans Excel, qui concerne n personnes (une
des colonnes contient le nom des personnes, chaque personne ayant de
nombreuses entrées dans le tableau).
Je dois créer un nouveau fichier Excel pour chaque personne ayant des
données dans la base, puis pour chaque base individuelle extraite, créer un
TCD présentant certains champs de cette base.

J'ai la macro jusqu'à ce stade, mais mon souci est le suivant :

- Comment conserver la mise en forme des cellules de la base dans le TCD
(par exemple, j'ai un champ en % qui perd son format). Comment intégrer la
mise en forme dans la macro?
- J'ai 2 champs de données dans mon TCD, je veux les présenter en colonne et
pas en ligne. Or la macro crée les TCD avec ces 2 champs en ligne. Comment
intégrer le fait de les mettre en colonne dans la macro?
- J'ai besoin d'ajuster la largeur de mes colonnes automatiquement par la
macro.
- Enfin, et je sépare ce point car je ne sais pas s'il conserve directmeent
ce forum (lien entre Excel et Outlook), comment ajouter à la macro la
création dans Outlook d'un mail à chaque personne de la liste avec le
fichier Excel de la personne concernée en pièce jointe?

J'espère avoir été à peu près clair!

Merci pour votre aide.

Cordialement,

Vincent

2 réponses

Avatar
Trirème
Bonjour Vincent,

Sans répondre directement à ta question, je te conseille avant tout d'utiliser
l'enregistreur de macro dans un 1er temps, puis d'éliminer ce qu'il y a de verbeux et de
redondant dans le code dans un 2ème temps.
Mais déjà, quelques pistes...

La création du TCD générera ce genre de code selon la version d'Excel :

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Feuil1!R1C1:R11C4").CreatePivotTable TableDestination:="", TableName:= _
"Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:¬tiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select ' peut être supprimé

Tu peux y changer le nom du TCD (ici Tableau croisé dynamique1)
... changer la plage, bien sûr

Ensuite, plusieurs lignes ressembleront à :
ActiveSheet.PivotTables("Tableau croisé dynamique1").etc1 etc1 etc1
ActiveSheet.PivotTables("Tableau croisé dynamique1").etc2 etc2 etc2
ActiveSheet.PivotTables("Tableau croisé dynamique1").etc3 etc3 etc3

Tu encadres ces lignes dans un bloc 'With' en simplifiant les lignes comme ceci :
With ActiveSheet.PivotTables("Tableau croisé dynamique1")
.etc1 etc1 etc1 (ligne 1)
.etc2 etc2 etc2 (ligne 2)
.etc3 etc3 etc3 (ligne 3)
End With
Ça va pas plus vite mais c'est plus facile à lire et à maintenir.

- Comment conserver la mise en forme des cellules de la base dans le TCD
(par exemple, j'ai un champ en % qui perd son format). Comment intégrer la
mise en forme dans la macro?
Il faut préciser le format dans la macro (cf plus bas). Attention, tu auras peut être des

difficultés avec le séparateur décimal et le séparateur des milliers (j'ai une version
d'Excel dont l'enregistreur de macro prend le format "# ###,##" et à l'exécution de la
macro il met n'importe quoi. Par contre si je corrige la macro par "#,###.##" j'ai bien ce
que je voulais initialement)

- J'ai 2 champs de données dans mon TCD, je veux les présenter en colonne et
pas en ligne. Or la macro crée les TCD avec ces 2 champs en ligne. Comment
intégrer le fait de les mettre en colonne dans la macro?
L'enregistreur donne ce code (ici 'Nom' représente un de tes champs):

ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:= _
Array("Nom", "Données")
Pour avoir directement les données en colonne sans avoir à les déplacer par la suite (même
par macro) tu peux ajouter le champ colonne :
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:= _
"Nom", ColumnFields:="Données"
Si tu as déjà mis un champ en colonne, par exemple "Produit", tu corriges par :
ColumnFields:=Array("Produit", "Données")
Array est un tableau, il y a ici 2 valeurs mais tu peux en ajouter.

- J'ai besoin d'ajuster la largeur de mes colonnes automatiquement par la
macro.
Columns("B:Q").EntireColumn.AutoFit ' Adapter les colonnes


- Enfin, et je sépare ce point car je ne sais pas s'il conserve directmeent
ce forum (lien entre Excel et Outlook), comment ajouter à la macro la
création dans Outlook d'un mail à chaque personne de la liste avec le
fichier Excel de la personne concernée en pièce jointe?
Excel et Outlook... tout un poême. Va voir ici http://www.rondebruin.nl/

ou dans Excelabo.


Tu pourrais en fin de compte avoir ce genre de code :
Sub ConstruireTCD()
'
'
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Feuil1!R1C1:R11C4").CreatePivotTable TableDestination:="", TableName:= _
"MonTCD", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:¬tiveSheet.Cells(3, 1)

With ActiveSheet.PivotTables("MonTCD")
.AddFields RowFields:="Nom", ColumnFields:="Données"

With .PivotFields("Val1") ' Val1 est le nom d'un de tes champs
.Orientation = xlDataField ' C'est un champ de la zone de données
' même si les "Données" ont été mises en colonne
.Position = 1 ' A supprimer, c'est le rang d'affichage dans le TCD
.NumberFormat = "# ##0" ' C'est ici que tu mets ton format
End With
With .PivotFields("Val2") ' écriture plus complète, avec en plus un calcul (bidon)
.Orientation = xlDataField
.Caption = "La Moyenne de val2" ' Pour changer le nom dans le TCD
.Function = xlAverage ' Par défaut la formule est xlSum (synthèse
avec une ' somme)
.Calculation = xlPercentDifferenceFrom
.BaseField = "mois"
.BaseItem = "(précédent)"
.NumberFormat = "0,0%" ' C'est ici que tu mets ton format
End With
' With autre champ
' End With

End With

Columns("B:B").EntireColumn.AutoFit

End Sub

Je ne doute pas que tu repasseras demander des précisions. J'aurais pu n'avoir rien
compris à ta question. N'hésite surtout pas, en plus c'est le Week-end.

Cordialement,
Trirème

Avatar
VIB
Bonjour Trirème.

Merci pour ta réponse. Je te tiens au courant de l'avancement de la
résolution de mon problème. Je ne doute pas que tes indications me seront
très utiles!

Cordialement,
Vincent

"Trirème" a écrit dans le message de news:

Bonjour Vincent,

Sans répondre directement à ta question, je te conseille avant tout
d'utiliser l'enregistreur de macro dans un 1er temps, puis d'éliminer ce
qu'il y a de verbeux et de redondant dans le code dans un 2ème temps.
Mais déjà, quelques pistes...

La création du TCD générera ce genre de code selon la version d'Excel :

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Feuil1!R1C1:R11C4").CreatePivotTable TableDestination:="",
TableName:= _
"Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:¬tiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select ' peut être supprimé

Tu peux y changer le nom du TCD (ici Tableau croisé dynamique1)
... changer la plage, bien sûr

Ensuite, plusieurs lignes ressembleront à :
ActiveSheet.PivotTables("Tableau croisé dynamique1").etc1 etc1 etc1
ActiveSheet.PivotTables("Tableau croisé dynamique1").etc2 etc2 etc2
ActiveSheet.PivotTables("Tableau croisé dynamique1").etc3 etc3 etc3

Tu encadres ces lignes dans un bloc 'With' en simplifiant les lignes comme
ceci :
With ActiveSheet.PivotTables("Tableau croisé dynamique1")
.etc1 etc1 etc1 (ligne 1)
.etc2 etc2 etc2 (ligne 2)
.etc3 etc3 etc3 (ligne 3)
End With
Ça va pas plus vite mais c'est plus facile à lire et à maintenir.

- Comment conserver la mise en forme des cellules de la base dans le TCD
(par exemple, j'ai un champ en % qui perd son format). Comment intégrer
la mise en forme dans la macro?
Il faut préciser le format dans la macro (cf plus bas). Attention, tu

auras peut être des difficultés avec le séparateur décimal et le
séparateur des milliers (j'ai une version d'Excel dont l'enregistreur de
macro prend le format "# ###,##" et à l'exécution de la macro il met
n'importe quoi. Par contre si je corrige la macro par "#,###.##" j'ai bien
ce que je voulais initialement)

- J'ai 2 champs de données dans mon TCD, je veux les présenter en colonne
et pas en ligne. Or la macro crée les TCD avec ces 2 champs en ligne.
Comment intégrer le fait de les mettre en colonne dans la macro?
L'enregistreur donne ce code (ici 'Nom' représente un de tes champs):

ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields
RowFields:= _
Array("Nom", "Données")
Pour avoir directement les données en colonne sans avoir à les déplacer
par la suite (même par macro) tu peux ajouter le champ colonne :
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields
RowFields:= _
"Nom", ColumnFields:="Données"
Si tu as déjà mis un champ en colonne, par exemple "Produit", tu corriges
par :
ColumnFields:=Array("Produit", "Données")
Array est un tableau, il y a ici 2 valeurs mais tu peux en ajouter.

- J'ai besoin d'ajuster la largeur de mes colonnes automatiquement par la
macro.
Columns("B:Q").EntireColumn.AutoFit ' Adapter les colonnes


- Enfin, et je sépare ce point car je ne sais pas s'il conserve
directmeent ce forum (lien entre Excel et Outlook), comment ajouter à la
macro la création dans Outlook d'un mail à chaque personne de la liste
avec le fichier Excel de la personne concernée en pièce jointe?
Excel et Outlook... tout un poême. Va voir ici http://www.rondebruin.nl/

ou dans Excelabo.


Tu pourrais en fin de compte avoir ce genre de code :
Sub ConstruireTCD()
'
'
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Feuil1!R1C1:R11C4").CreatePivotTable TableDestination:="",
TableName:= _
"MonTCD", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:¬tiveSheet.Cells(3, 1)

With ActiveSheet.PivotTables("MonTCD")
.AddFields RowFields:="Nom", ColumnFields:="Données"

With .PivotFields("Val1") ' Val1 est le nom d'un de tes champs
.Orientation = xlDataField ' C'est un champ de la zone de données
' même si les "Données" ont été mises
en colonne
.Position = 1 ' A supprimer, c'est le rang
d'affichage dans le TCD
.NumberFormat = "# ##0" ' C'est ici que tu mets ton format
End With
With .PivotFields("Val2") ' écriture plus complète, avec en plus un
calcul (bidon)
.Orientation = xlDataField
.Caption = "La Moyenne de val2" ' Pour changer le nom dans le TCD
.Function = xlAverage ' Par défaut la formule est xlSum
(synthèse avec une ' somme)
.Calculation = xlPercentDifferenceFrom
.BaseField = "mois"
.BaseItem = "(précédent)"
.NumberFormat = "0,0%" ' C'est ici que tu mets ton format
End With
' With autre champ
' End With

End With

Columns("B:B").EntireColumn.AutoFit

End Sub

Je ne doute pas que tu repasseras demander des précisions. J'aurais pu
n'avoir rien compris à ta question. N'hésite surtout pas, en plus c'est le
Week-end.

Cordialement,
Trirème