[Excel] Tableau croisé dynamique avec macro

Résolu/Fermé
Arn's Messages postés 23 Date d'inscription lundi 17 août 2009 Statut Membre Dernière intervention 26 août 2009 - 19 août 2009 à 22:33
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 - 8 oct. 2009 à 07:43
Bonjour à tous,

Je cherche à faire un tableau croisé dynamique à l'aide d'une macro.
Mais un message d'erreur s'affiche lorsque j'exécute le code fourni par l'enregistreur de macros (je sais que c'est mal).

Ci-joint le fichier (simple) qui pose problème :

http://www.cijoint.fr/cjlink.php?file=cj200908/cijITG1Saz.xls

et voici le code fourni par l'enregistreur (il est aussi dans le fichier) :

Sub TestTCD()
'
' TestTCD Macro
' Macro enregistrée le 19/08/2009 par LIBGR15
'
'
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
        "Feuil1!C1:C7").CreatePivotTable TableDestination:="", TableName:= _
        "Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
    ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
    ActiveSheet.Cells(3, 1).Select
    With ActiveSheet.PivotTables("Tableau croisé dynamique1")
        .ColumnGrand = False
        .RowGrand = False
    End With
    ActiveSheet.PivotTables("Tableau croisé dynamique1").AddFields RowFields:= _
        Array("TITRE", "Données")
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("SALAIRE" _
        )
        .Orientation = xlDataField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("SALAIRE" _
        )
        .Orientation = xlDataField
        .Caption = "Somme de SALAIRE2"
        .Function = xlSum
    End With
    Range("B3").Select
    With ActiveSheet.PivotTables("Tableau croisé dynamique1").DataPivotField
        .Orientation = xlColumnField
        .Position = 1
    End With
End Sub

Merci d'avance pour vos réponses, et bon courage.
A voir également:

4 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
19 août 2009 à 22:46
bonjour

Tu devrais vérifier ceci
"Feuil1!C1:C7"
car il me semble qu'il n'y a pas toutes les données que tu veux utiliser ensuite.

Il est toujours préférable en plus de nommer ta plage de données du TCD avec DECALER pour qu'elle suive les modifications d'ajout et suppression.
2
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
7 oct. 2009 à 23:13
bonjour

"DJ!c1:c2290" n'a pas grand chose de commun avec "DJ!A1:N2000" car tu n'as mis qu'une colonne.

Faudrait aussi supprimer le premier ordre "Feuil1!C1:C7" qui fait tout planter probablement.
1
Merci gbinforme,

en effet, ca n'avait pas grand chose à voir!

Je cherche à créer un bouton (1 par ligne) qui me permet de copier les informations de 5 cellulles d'une ligne (B3; F3;G3;H3 et J3) dans 5 cellulles d'un autre fichier excel (B7 à B11).

Ca doit etre facile, mais pour moi c est titanesque!

Merci pour vos idées,
Guillaume
0
Arn's Messages postés 23 Date d'inscription lundi 17 août 2009 Statut Membre Dernière intervention 26 août 2009 7
20 août 2009 à 10:19
Merci beaucoup gbinforme, c'était donc ça. Je comprends pas pourquoi l'enregistreur s'est planté. J'ai recommencé en sélectionnant les colonnes A à G, comme la première fois, et dans le code j'obtiens toujours C1 à C7. Mais en modifiant cette plage à la main, tout rentre dans l'ordre.
0
Bonjour,

pourrai tu m'expliquer comment tu as résolu ton probleme, j'ai exactement le meme probleme mais je ne m'y connais pas, j'ai essayé de modifier "DJ!C1:C14" qui correspiond àu nombre de colonnes de mon tableau par "DJ!A1:N2000" (l'ensemble de mon tableau) sans succes

Merci pour la réponse,
Guillaume

PS: Voici mon code


Sub Tableau_croisé()
'
' Tableau_croisé Macro
' Macro enregistrée le 01/10/2009 par VIGUERARD Stéphane
'
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Feuil1!C1:C7").CreatePivotTable TableDestination:="", TableName:= _
"Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select

'
Cells.Select
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"DJ!c1:c2290").CreatePivotTable TableDestination:="", TableName:=
"Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields( _
"Degres-jours (base T C int.) COSTIC"), _
"Nombre de Degres-jours (base T C int.) COSTIC", xlCount
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Mois")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Année")
.Orientation = xlRowField
.Position = 1
End With
Range("A3").Select
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Nombre de Degres-jours (base T C int.) COSTIC").Function = xlSum
Sheets("Feuil1").Select
Sheets("Feuil1").Name = "TABLEAU DJ"
Sheets("CONSOMMATIONS").Select
Cells.Select
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"CONSOMMATIONS!C1:C16").CreatePivotTable TableDestination:="", TableName:= _
"Tableau croisé dynamique2", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
"Identification compteur")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Mois")
.Orientation = xlColumnField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields("Année")
.Orientation = xlColumnField
.Position = 1
End With
ActiveSheet.PivotTables("Tableau croisé dynamique2").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique2").PivotFields("Consommation"), _
"Nombre de Consommation", xlCount
Range("A3").Select
ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
"Nombre de Consommation").Function = xlSum
ActiveWindow.SmallScroll Down:=-3
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
"Unite d'enregistrement")
.Orientation = xlRowField
.Position = 1
End With
Sheets("Feuil2").Select
Sheets("Feuil2").Name = "TABLEAU CONSOMMATIONS"
End Sub
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
8 oct. 2009 à 07:43
bonjour

Ca doit etre facile, mais pour moi c est titanesque

Facile non, titanesque oui car faire un bouton par ligne c'est plus compliqué et plus long que de faire un seul bouton qui traite la ligne sélectionnée.

Avec cette macro, dans ta feuille concernée tu copie la ligne que tu veux, sans bouton, simplement avec un double clis sur une des cellules de la ligne.
Private Sub Worksheet_BeforeDoubleClick(ByVal sel As Range, Cancel As Boolean)
Dim dest As Range
    Set dest = Workbooks("classeur1").Sheets("copie").Range("B7")
    Cancel = True
    Cells(sel.Row, "B").Copy Destination:=dest
    Cells(sel.Row, "F").Copy Destination:=dest.Offset(1, 0)
    Cells(sel.Row, "G").Copy Destination:=dest.Offset(2, 0)
    Cells(sel.Row, "H").Copy Destination:=dest.Offset(3, 0)
    Cells(sel.Row, "J").Copy Destination:=dest.Offset(4, 0)
End Sub

Bien sûr tu remplaces les valeurs en gras par les tiennes propres et si tu veux tu peux choisir le classeur de copie avec une fenêtre de sélection.
0