[Excel] Tableau croisé dynamique avec macro

Résolu
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.

4 réponses

  1. Contributeur
    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
    1. Contributeur
      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
      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
    2. 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
      1. 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
    3. Contributeur
      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