XL 2010 Création et mise à jour d'un TCD tableau croisé dynamique avec macro VBA

Demha_2022

XLDnaute Nouveau
Bonjour,

Je suis débutant en VBA , je crée manuellement un TCD dans excel en utilisant deux fichiers, je récupère les données dans le premier fichier, pour les déposer dans le deuxième fichier, afin de créer le TCD et mettre à jour le TCD existant quand ya de nouvelles données importées dans ce deuxième fichier. Ce process manuel me prends du temps énorme, j'ai donc décidé d'automatiser la création du TCD ainsi que la mise à jour du TCD existant quand ya de nouvelles données qui sont importées à partir de la macro VBA, .

Que fait ma macro dans le fichier ci-joint:

Ma macro active le premier fichier qui contient le TCD , elle sélectionne la plage de données qui sert de créer le TCD, ensuite supprime le contenu.

Puis elle va dans le répertoire qui contient le deuxième fichier , pour sélectionner le fichier et l'ouvrir , après ouverture , elle copie les données et les colles dans le premier fichier , pour créer le TCD et faire des filtrages sur différents champs.

Mon problème: 1- J'arrive pas à filtrer le champ Spécificité par vide en utilisant cette macro , pourtant les méthodes utilisées me semblent correctes
Code:
ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Type Spécificité").ClearAllFilters
    ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Type Spécificité").CurrentPage = "(blank)"

2- J'arrive pas à déposer le champ service au niveau de la zone colonne en utilisant cette macro , et si je le fais manuellement dans excel , ça m'affiche cette erreur : un rapport de tableau croisé dynamique ne peut pas chevaucher un tableau ou un mappage XML
VB:
 With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields("Service" _
        )
        .Orientation = xlColumnField
        .Position = 1
    End With
3- Mon troisième problème: comment est ce que je dois procéder pour mettre à jour le TCD à chaque fois que j'importe de nouvelles données dans le premier fichier?

Svp quelqu'un pourrait m'aider à résoudre ces problèmes ?

svp suis débutant et je dois réaliser cette automatisation urgemment en entreprise

En vous remerciant d'avance veuillez trouver ci-joint les deux fichiers : le premier (Analyse des résultats Perfs) contient la macro du TCD dans l'onglet : Feuil5

et le deuxième fichier(Perf dans DHW") est celui que j'utilise pour copier les données et les coler dans le premier fichier (onglet Feuil5).

J'arrive pas à vous joindre les deux fichier, voici tout de même ma macro :
VB:
Sub mise_a_jour_TCD()
'
' Automatisation de la mise à jour du fichier Analyse résultats PERF

   ' ThisWorkbook.Activate
    Dim MyApplication As Object
    Dim premier_fichier As String
    Dim deuxieme_fichier As String
    Dim chemin_deuxieme_fichier As String
    Dim file_open As String
   
     ' assignation permettant de créer un objet , ensuite d'ouvrir le fichier
   
    Set MyApplication = CreateObject("Shell.Application")
   
     premier_fichier = "Analyse résultats PERF DEV s08.xlsm"
   
     deuxieme_fichier = "Perf dans DWH hs risq - 2022_s9.xlsx"
     chemin_deuxieme_fichier = "C:\Users\csad\OneDrive - Cooperactions\Documents\Perf dans DWH hs risq - 2022_s9.xlsx"
   
     Workbooks("Analyse résultats PERF DEV s08").Activate
     Sheets("Feuil5").Activate
   
     Range("M5:AW5").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Range("M5").Select
   
    'ouverture du deuxième fichier
    MyApplication.Open (chemin_deuxieme_fichier)
   ' Workbooks("deuxieme_fichier").Activate
   'attendre un instant 5s wait
   
     Worksheets("Page1_1").Activate
     Range("A3:AK3").Select
     Range(Selection, Selection.End(xlDown)).Select
     Selection.Copy
   
     Workbooks(premier_fichier).Activate
     Sheets("Feuil5").Activate
     Range("M5").Select
     ActiveCell.PasteSpecial Paste:=xlPasteValues
 
     ' Parcourir chaque fichier du dossier à travers le for each
   
   
    ''''''''''''''''''''''''''''''''Début de la création du TCD''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
       Dim monCache As PivotCache
       Dim monTCD As PivotTable

       ' Set monCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:="base_de_données")
     
       Set monCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="base_de_données")
     
        Set monTCD = monCache.CreatePivotTable(Range("A1"), "mon tableau croisé dynamique")

        With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields("Type Spécificité")
             .Orientation = xlRowField
             .Position = 1
         End With
   

            With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields( _
                "Métier du Commercial")
                .Orientation = xlRowField
                .Position = 2
            End With
            With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields("Unite")
                .Orientation = xlRowField
                .Position = 3
            End With
            With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields("Service" _
                )
                .Orientation = xlRowField
                .Position = 4
            End With
    With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields( _
        "Libellé du Groupe Perf")
        .Orientation = xlRowField
        .Position = 5
    End With
   
    'classement dans la zone filtre du rapport
    With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields( _
        "Type Spécificité")
        .Orientation = xlPageField
        .Position = 1
    End With
 
    With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields( _
        "Métier du Commercial")
        .Orientation = xlPageField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields("Unite")
        .Orientation = xlPageField
        .Position = 1
    End With
 
    'positionnement dans la zone valeur
    ActiveSheet.PivotTables("mon tableau croisé dynamique").AddDataField ActiveSheet. _
        PivotTables("mon tableau croisé dynamique").PivotFields( _
        "Conso Cumulée sur l'année"), "Nombre de Conso Cumulée sur l'année", xlCount
       
    With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields( _
        "Nombre de Conso Cumulée sur l'année")
        .Caption = "Somme de Conso Cumulée sur l'année"
        .Function = xlSum
    End With
   
 
    ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields("Service"). _
        Orientation = xlHidden
       
        '''''''''''''''''''''''''''''''''filtrage des trois champs de la zone filtre du rapport ''''''''''''''''''''''''''''''''''
 
    With ActiveSheet.PivotTables("mon tableau croisé dynamique").PivotFields("Service" _
        )
        .Orientation = xlColumnField
        .Position = 2
    End With
   
    '''''''''''''''''''''''''''' filtrage du premier tableau croisé dynamique '''''''''''''''''''''''''''''''''''''
    'filtrage de trois champs par vide
   
    ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Type Spécificité").ClearAllFilters
    ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Type Spécificité").CurrentPage = "(blank)"
   
    ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Métier du Commercial").ClearAllFilters
    ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Métier du commercial").CurrentPage = "(blank)"
   
    ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Unite").ClearAllFilters
    ActiveSheet.pivotables("mon tableau croisé dynamique").pivofields("Unite").CurrentPage = "(blank)"
   
 
  ' filtre champs Linellé du Groupe Perf
  With ActiveSheet.PivotTables("Tableau croisé dynamique4").PivotFields( _
        "Libellé du Groupe Perf")
        .PivotItems("Prev PP globale").Visible = True
        .PivotItems("Val Désirio").Visible = True
        .PivotItems("Val Epargne Vie").Visible = True
        .PivotItems("Val Gestion Préconisée").Visible = True
        .PivotItems("Val Ret ind.").Visible = True
    End With
       
       

     
End Sub
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour

Si tu as la possibilité d'installer l'add on PowerQuery (totalement intégré à Excel à partir de 2016) cela éviterait le code et permettrait une compilation simple par TCD

Edit : Merci de lire la charte qui précise qu'il ne faut pas multiposter
 
Dernière édition:

Discussions similaires