IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Créer et connecter deux segments à plusieurs tableaux croisés dynamiques


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 273
    Par défaut Créer et connecter deux segments à plusieurs tableaux croisés dynamiques
    Bonjour,

    Mon problème fait suite au sujet que j'ai ouvert il y a quelque jours et qui est maintenant résolu.

    J'ai dans mon classeur trois tableaux croisés dynamiques (TCD) sur trois feuilles distinctes mais TCD_AGE, TCD_COUT et TCD_SALAIRE tous
    issus d'une même source(feuille "Table source").

    Je souhaiterai rajouter sur ma feuille "RECAP" via VBA deux segments "PAYS" et "NOM" connectés aux trois TCD.
    Pour ce faire, j'essaye d'abord manuellement afin de me servir ensuite de l'enregistreur de macro, mais je ne
    parviens à rajouter que deux segments connectés uniquement à seul TCD à la fois mais pas aux deux autres.

    Serait-ce impossible à faire ? faut -il absolument que les 3 TCD soient dans une feuille ?
    Auriez-vous des pistes à me proposer ?

    Je vous joints mon fichier.

    Merci d'avance de votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pourquoi autant de tableaux croisés dynamiques pour obtenir ce résultat ?
    Nom : pvt_0.png
Affichages : 267
Taille : 5,3 Ko

    Avec un seul cela suffit

    Nom : Pvt.png
Affichages : 268
Taille : 33,8 Ko

    Petit conseil
    : Utilisez les tableaux structurés au lieu d'une plage classique pour la source de données
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour répondre à vos questions
    Je souhaiterai rajouter sur ma feuille "RECAP" via VBA deux segments "PAYS" et "NOM" connectés aux trois TCD.
    Pour ce faire, j'essaye d'abord manuellement afin de me servir ensuite de l'enregistreur de macro, mais je ne
    parviens à rajouter que deux segments connectés uniquement à seul TCD à la fois mais pas aux deux autres.
    Nul besoin de VBA pour connecter un ou plusieurs segments à plusieurs Tcd
    Il suffit de sélectionner le segment, faire un clic droit et on clique sur la commande Connexion de rapports et on doit visualiser tous les tableaux croisés dynamiques créés dans le classeur
    Je ne sais pas comment vous avez créé vos tcd mais effectivement les autres tcd ne sont pas visibles. Je n'ai pas approfondi la question

    Serait-ce impossible à faire ? faut -il absolument que les 3 TCD soient dans une feuille ?
    Auriez-vous des pistes à me proposer ?
    Non on peut avoir les tcd placés dans des feuilles séparées
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 273
    Par défaut
    Bonjour Philippe,

    Merci pour votre réponse.
    Désolé je n'ai pas indiqué le lien de la discussion à laquelle mon sujet fait suite :

    https://www.developpez.net/forums/d2...rmules-codees/


    Le tableau de l'onglet "RECAP" doit être alimenté via du code car mes TCD ont vocation à changer régulièrement. C'est pour
    cette même raison que je veux créer mes Slicers via du code également.

    Je comprends de votre réponse que nul besoin d'avoir les 3 TCD sur une même feuille pour qu'ils soient tous connectés
    aux mêmes segments. je vais continuer à chercher sur cette direction.

    Merci encore.

    Cordialement,

    Kedmard

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je comprends de votre réponse que nul besoin d'avoir les 3 TCD sur une même feuille pour qu'ils soient tous connectés
    aux mêmes segments. je vais continuer à chercher sur cette direction.
    Voici, en pièce jointe, un classeur Excel illustrant la création d'un Dashboard basé sur des TCD et segments connectés

    Celui-ci contient quatre feuilles
    1. Base 0 - Stage sportif : contient la source de données sous forme de tableau structuré
    2. Synthèse_1 : contient deux tcd, l'un en somme, l'autre en moyenne
    3. Synthèse_2 : contient un tcd calculant le % par colonne
    4. Dashboard : contient deux graphiques basés l'un sur le tcd Somme, l'autre % de la colonne. La feuille est protégée sans mot de passe

    Les trois feuilles numérotées 2, 3 et 4 comportent chacune deux segments identiques, qui sont connectés entre eux. La feuille 1 qui contient la source, dispose également de deux segments basés sur les même champs mais ceux-ci ne sont évidemment pas liés aux TCD.


    Illustration de la feuille DashBoard

    Nom : pvt_StagesSportifs.png
Affichages : 262
Taille : 72,5 Ko
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 273
    Par défaut
    Merci Philippe de votre aide,

    Il me reste donc à comprendre pourquoi seul un TCD n'est visible dans mon fichier quand je veux établir la connexion avec mes segments; ensuite j'essaierai de reproduire le processus (création + connexion des segments aux 3 TCD) en utilisant l'enregistreur de macros.


    Cordialement,

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    En passant la "table" contenant les données en tableau (Ruban insertion, tableau ou Ctr+L) et en modifiant la source de chaque TCD pour qu'ils pointent tous sur ce tableau.
    Ça permet d'obtenir la liste de tous les TCD raccrochés au tableau dans "Connexions de rapport"

    [Edit]
    On dirait un bug, en fait si tu réaffectes aux 3 TCD la plage de données (sans la passer en tableau, juste en "modifiant" la source des données et remettre 'Table source'!$A$1:$F$7), ça fonctionne.... Surement un problème lié à la création des TCD via Macro.
    [/Edit]

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 273
    Par défaut
    Salut Qwazerty,

    Merci pour ton aide, effectivement en "changeant" (car la plage de cellules sélectionnées reste la même qu'avant) la source des TCD
    j'arrive à tous les voir dans mes choix de TCD.
    Aurais-je omis quelque chose dans mon code de création de ces TCD ?

    Pour info, j'ai utilisé l'enregistreur de macro pour les créés voici en substance, ci-dessous le code utilisé.
    Je dois absolument les générer en code car mon traitement doit être automatisé.

    Toute aide serait la bienvenue.

    Merci encore.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        Sheets.Add
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
            "Table source!R1C1:R7C6", Version:=8).CreatePivotTable TableDestination:= _
            "Feuil1!R3C1", TableName:="Tableau croisé dynamique3", DefaultVersion:=8
        Sheets("Feuil1").Select
        Cells(3, 1).Select
        With ActiveSheet.PivotTables("Tableau croisé dynamique3")
            .ColumnGrand = True
            .HasAutoFormat = True
            .DisplayErrorString = False
            .DisplayNullString = True
            .EnableDrilldown = True
            .ErrorString = ""
            .MergeLabels = False
            .NullString = ""
            .PageFieldOrder = 2
            .PageFieldWrapCount = 0
            .PreserveFormatting = True
            .RowGrand = True
            .SaveData = True
            .PrintTitles = False
            .RepeatItemsOnEachPrintedPage = True
            .TotalsAnnotation = False
            .CompactRowIndent = 1
            .InGridDropZones = False
            .DisplayFieldCaptions = True
            .DisplayMemberPropertyTooltips = False
            .DisplayContextTooltips = True
            .ShowDrillIndicators = True
            .PrintDrillIndicators = False
            .AllowMultipleFilters = False
            .SortUsingCustomLists = True
            .FieldListSortAscending = False
            .ShowValuesRow = False
            .CalculatedMembersInFilters = False
            .RowAxisLayout xlCompactRow
        End With
        With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotCache
            .RefreshOnFileOpen = False
            .MissingItemsLimit = xlMissingItemsDefault
        End With
        ActiveSheet.PivotTables("Tableau croisé dynamique3").RepeatAllLabels _
            xlRepeatLabels
        With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("DT_ARRI" _
            )
            .Orientation = xlColumnField
            .Position = 1
        End With
        ActiveSheet.PivotTables("Tableau croisé dynamique3").AddDataField ActiveSheet. _
            PivotTables("Tableau croisé dynamique3").PivotFields("COUT"), "Somme de COUT", _
            xlSum
        With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("NOM")
            .Orientation = xlPageField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("PAYS")
            .Orientation = xlPageField
            .Position = 1
        End With
    End Sub

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comme je l'ai signalé dans ma première intervention (Post #2), et que Quaz a rappelé également, utilisez les tableaux structurés comme table source.
    Que ce soit manuellement ou avec le VBA, c'est bien plus simple et pérenne.
    Avantage d'utiliser cet objet. Si l'on ajoute des lignes et des colonnes à la source. Une simple actualisation suffit. Alors qu'avec une plage "classique", il faut redéfinir son périmètre.
    De plus en VBA, nul besoin de savoir dans quelle feuille où à partir de quelle cellule débute le tableau.

    Pour en savoir plus, je ne peux que conseiller la lecture de ces deux tutoriels de Pierre Fauconnier
    1. Apprendre à utiliser les tableaux structurés Excel : création, manipulations et avantages
    2. Excel: Les tables de données en VBA


    Je conseille également d'utiliser des variables objets. Cela facilite grandement la maintenance
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Voila qui devrait être mieux...
    A placer dans un Module de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    Option Explicit 
     
    Sub Macro1()
    Dim NewSh As Worksheet
    Dim NewPC As PivotCache
    Dim NewTCD As PivotTable
     
     
        'On crée un nouvelle onglet qu'on pointe à l'aide d'une variable
        Set NewSh = Sheets.Add
     
            'On ajoute et on pointe le Cache dans une variable
            'Set NewPC = ThisWorkbook.PivotCaches.Create(xlDatabase, "Tab_Data", 8)
     
            'Ton problème vient d'ici, il ne faut pas créer un cache... il faut utiliser un cache commun à tous tes tableaux, sinon il concidère que les sources sont différentes
            Set NewPC = Feuil1.PivotTables("TCD_COUT").PivotCache
     
            'On ajoute le TCD avec un nom qui varie en fonction du nom de la feuille
            Set NewTCD = NewPC.CreatePivotTable(NewSh.Range("A3").Address(ReferenceStyle:=xlR1C1, External:=True), "TCD_" & NewSh.Name, 8)
     
     
            With NewTCD
                .ColumnGrand = True
                .HasAutoFormat = True
                .DisplayErrorString = False
                .DisplayNullString = True
                .EnableDrilldown = True
                .ErrorString = ""
                .MergeLabels = False
                .NullString = ""
                .PageFieldOrder = 2
                .PageFieldWrapCount = 0
                .PreserveFormatting = True
                .RowGrand = True
                .SaveData = True
                .PrintTitles = False
                .RepeatItemsOnEachPrintedPage = True
                .TotalsAnnotation = False
                .CompactRowIndent = 1
                .InGridDropZones = False
                .DisplayFieldCaptions = True
                .DisplayMemberPropertyTooltips = False
                .DisplayContextTooltips = True
                .ShowDrillIndicators = True
                .PrintDrillIndicators = False
                .AllowMultipleFilters = False
                .SortUsingCustomLists = True
                .FieldListSortAscending = False
                .ShowValuesRow = False
                .CalculatedMembersInFilters = False
                .RowAxisLayout xlCompactRow
     
                With NewPC
                    .RefreshOnFileOpen = False
                    .MissingItemsLimit = xlMissingItemsDefault
                End With
     
                .RepeatAllLabels xlRepeatLabels
     
                With .PivotFields("DT_ARRI")
                    .Orientation = xlColumnField
                    .Position = 1
                End With
     
                .AddDataField .PivotFields("COUT"), "Somme de COUT", xlSum
     
                With .PivotFields("NOM")
                    .Orientation = xlPageField
                    .Position = 1
                End With
     
                With .PivotFields("PAYS")
                    .Orientation = xlPageField
                    .Position = 1
                End With
     
            End With
    End Sub
    Ton code créait un nouveau cache de données pour chaque TCD ajouté.
    Hors si le cache est différent entre 2 TCD, c'est comme si la source de données était différente...

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 273
    Par défaut
    Bonjour Qwazerty

    Vraiment désolé pour ce retour plus que tardif, je n'étais pas en mesure de le faire plus tôt ...

    Merci pour ta piste piste c'est bien ce qui posait problème, j'ai modifié mon code en m'inspirant du tien et
    mes 3 TCD sont désormais visibles au moment de la création des segments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    Sub ProcTCD()
    Dim NewSh As Worksheet
    Dim WS As Worksheet
    Dim pivotRange As Range
    Dim NewPC As PivotCache
    Dim NewTCD As PivotTable
    Dim lastR, lastC As Long
    Dim PARAM As Variant
     
     
      Set WS = ThisWorkbook.Sheets("Table source")
      lastR = WS.Range("A" & WS.Rows.Count).End(xlUp).Row
      lastC = WS.Cells(1, WS.Columns.Count).End(xlToLeft).Column
     
      Set pivotRange = WS.Range(WS.Cells(1, 1), WS.Cells(lastR, lastC))
      Set NewPC = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=pivotRange)
     
     
     
      For Each cell In Range(WS.Cells(1, 4), WS.Cells(1, 6))
      PARAM = cell.Value
     
      Set NewSh = Sheets.Add
      ActiveSheet.Name = "TCD_" & PARAM
     
      Set NewTCD = NewPC.CreatePivotTable(NewSh.Range("A3").Address(ReferenceStyle:=xlR1C1, External:=True), "TCD_" & PARAM, 8)
      With NewTCD
          .ColumnGrand = True
                .HasAutoFormat = True
                .DisplayErrorString = False
                .DisplayNullString = True
                .EnableDrilldown = True
                .ErrorString = ""
                .MergeLabels = False
                .NullString = ""
                .PageFieldOrder = 2
                .PageFieldWrapCount = 0
                .PreserveFormatting = True
                .RowGrand = True
                .SaveData = True
                .PrintTitles = False
                .RepeatItemsOnEachPrintedPage = True
                .TotalsAnnotation = False
                .CompactRowIndent = 1
                .InGridDropZones = False
                .DisplayFieldCaptions = True
                .DisplayMemberPropertyTooltips = False
                .DisplayContextTooltips = True
                .ShowDrillIndicators = True
                .PrintDrillIndicators = False
                .AllowMultipleFilters = False
                .SortUsingCustomLists = True
                .FieldListSortAscending = False
                .ShowValuesRow = False
                .CalculatedMembersInFilters = False
                .RowAxisLayout xlCompactRow
     
                With NewPC
                    .RefreshOnFileOpen = False
                    .MissingItemsLimit = xlMissingItemsDefault
                End With
     
                .RepeatAllLabels xlRepeatLabels
     
                With .PivotFields("DT_ARRI")
                    .Orientation = xlColumnField
                    .Position = 1
                End With
     
                .AddDataField .PivotFields(PARAM), "Somme de " & PARAM, xlSum
     
                With .PivotFields("NOM")
                    .Orientation = xlPageField
                    .Position = 1
                End With
     
                With .PivotFields("PAYS")
                    .Orientation = xlPageField
                    .Position = 1
                End With
     
     
     
      End With
     
    Next cell
     
    End Sub
    Pour la connexion des segments avec les TCD j'ai concocté le code ci-dessous qui renvoie un message d'erreur

    Nom : Cap_error.png
Affichages : 187
Taille : 7,3 Ko

    Plus précisement sur la ligne en rouge


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Sub AJ_CONNEC_SEG()
      
     Dim CurrentWb As Excel.Workbook
     Dim SheetRCP As Excel.Worksheet
     Dim WSTCD As Excel.Worksheet
     Dim WS As Excel.Worksheet
     Dim SC As SlicerCache
     Dim MonTCD As PivotTable
     Dim k, col As Integer
     Dim Pvt As PivotTable
     Dim SH As Worksheet
     
     Set CurrentWb = ThisWorkbook
     Set SheetRCP = CurrentWb.Worksheets("RECAP")
     Set WS = CurrentWb.Sheets("Table source")
     
     SheetRCP.Range("A1").EntireRow.RowHeight = 83
     WS.Range(WS.Cells(1, 2), WS.Cells(1, 3)).Copy
     SheetRCP.Range(SheetRCP.Cells(1, 1), SheetRCP.Cells(1, 2)).PasteSpecial Paste:=xlPasteValues
      
     
     For k = 1 To SheetRCP.Range(SheetRCP.Cells(1, 1), SheetRCP.Cells(1, 2)).Columns.Count
         SheetRCP.Range(SheetRCP.Cells(1, k), SheetRCP.Cells(1, k)).EntireColumn.ColumnWidth = 23
     Next k
     SEGVAL = WS.Cells(1, 4).Value
     
     
     Set WSTCD = CurrentWb.Worksheets("TCD_" & SEGVAL)
     Set MonTCD = WSTCD.PivotTables("TCD_" & SEGVAL)
     Set SheetRCP = CurrentWb.Worksheets("RECAP")
    
     For col = 1 To SheetRCP.Range(SheetRCP.Cells(1, 1), SheetRCP.Cells(1, 2)).Columns.Count
      With Cells(1, col)
        namecol = .Value
        x = .Left
        y = .Top
        w = .Width
        h = .Height
      End With
      
    CurrentWb.SlicerCaches.Add2(MonTCD, namecol).Slicers.Add SheetRCP, , namecol, namecol, y, x, w, h
    
     Next col
      
     For Each SC In ActiveWorkbook.SlicerCaches
         For Each SH In ActiveWorkbook.Worksheets
             For Each Pvt In SH.PivotTables
                 SC.PivotTables.AddPivotTable Pvt
             Next Pvt
         Next SH
     Next
    End Sub
    Toute piste serait la bienvenue.

    Merci d'avance.

  12. #12
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Alors pour le début du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Sub AJ_CONNEC_SEG()
     
     Dim CurrentWb As Excel.Workbook
     Dim SheetRCP As Excel.Worksheet
     Dim WSTCD As Excel.Worksheet
     Dim WS As Excel.Worksheet
     Dim sc As SlicerCache
     Dim MonTCD As PivotTable
     Dim k, col As Integer
     Dim Pvt As PivotTable
     Dim SH As Worksheet
     
        Set CurrentWb = ThisWorkbook
        Set SheetRCP = CurrentWb.Worksheets("RECAP")
        Set WS = CurrentWb.Sheets("Table source")
        'Plutôt que de recréer des variable, tu peux aussi utiliser les codenames des feuilles (par défaut Feuil1, Feuil2,... mais tu peux les remplacer dans les propriété des feuilles)
     
     
        SheetRCP.Range("A1").EntireRow.RowHeight = 83
        ' WS.Range(WS.Cells(1, 2), WS.Cells(1, 3)).Copy
        ' SheetRCP.Range(SheetRCP.Cells(1, 1), SheetRCP.Cells(1, 2)).PasteSpecial Paste:=xlPasteValues
     
        ' For k = 1 To 2 'SheetRCP.Range(SheetRCP.Cells(1, 1), SheetRCP.Cells(1, 2)).Columns.Count
        '     SheetRCP.Range(SheetRCP.Cells(1, k), SheetRCP.Cells(1, k)).EntireColumn.ColumnWidth = 23
        ' Next k
     
        With SheetRCP.Range("A1:A2")
            .Value = WS.Range("A1:A2").Value
            .EntireColumn.ColumnWidth = 23
        End With
     
        'Penses à déclarer tes variables
        SEGVAL = WS.Cells(1, 4).Value
     
     
        Set WSTCD = CurrentWb.Worksheets("TCD_" & SEGVAL)
        Set MonTCD = WSTCD.PivotTables("TCD_" & SEGVAL)
        'Set SheetRCP = CurrentWb.Worksheets("RECAP") 'Déjà fait au début
     
        For col = 1 To 2 'SheetRCP.Range(SheetRCP.Cells(1, 1), SheetRCP.Cells(1, 2)).Columns.Count 'de la colonne 1 à la colonne 2, le résultat sera 2 colonnes
            With SheetRCP.Cells(1, col) ' attention ici, tu n'as pas préciser la feuille sur laquelle tu travailles, par défaut c'est l'onglet actif qui sera utilisé
                namecol = .Value
                x = .Left
                y = .Top
                w = .Width
                h = .Height
            End With
     
            Set sc = CurrentWb.SlicerCaches.Add2(MonTCD, namecol)
            sc.Slicers.Add SheetRCP, , namecol, namecol, y, x, w, h
     
        Next col
    Quelques allégements de code. (je n'ai rien testé, y'aura sans doute des retouches à faire)

    Quand il y a un problème avec une ligne à rallonge, un conseil, découpe là.
    De toutes façon, c'est rarement une bonne idée de mettre des choses derrière un appel à une fonction.
    Il vaut mieux récupérer le contenu qu'elle retourne, tester s'il est valide (rien que de regarder si elle ne retourne pas Nothing) et ensuite faire les autres opérations. Je sais que l'enregistreur le fait mais c'est une mauvaise pratique.

    Alors plusieurs problèmes possible...
    Déjà le nom qu'on donne à un SlideCache est unique... donc "AGE", c'est pas une bonne idée, il faut mettre un truc en lien avec ton tableau, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set sc = CurrentWb.SlicerCaches.Add2(MonTCD, "segment_" & namecol & "_" & MonTCD.Name)
    Quand Excel crée un SlideCache, il commence toujours par segment_, autant faire comme lui, ça peut servir de guide un jour.

    Ensuite quand ton code va arriver au .add(...)
    C'est pareil, le nom du Slicer est unique..., donc soit tu laisses vide le paramètre Name, soit tu lui donnes un nom en relation avec ton tableau... Je te laisse voir mais c'est des fois pas mal d'avoir un nom reconnaissable et reconstructible surtout. NomChamp_NomTableau, ça se reconstruit vite.



    Pour la boucle de fin, tu cherches à lier les Slicers entre eux en plaçant tous les pivotTables dans tous les SliderCaches.
    Je n'utilise jamais ces objets, il faudrait que je regarde en détaille cette partie là et que je fasse des essais pour voir s'il n'y a pas plus simple.

    Dans la boucle précédente, au moment de la création de chaque SliderCache, c'est peut-être là qu'il faut intervenir.
    Je dirais de faire une collection de PivotTable en début de code, contenant l'ensemble des pivotTables du classeur. (l'équivalent de ta boucle de fin, sauf que tu mets chaque pivotTable dans une collection une fois pour toute)
    Puis après la création d'un SliderCache avec Add2, tu boucles sur ta collection de PivotTables pour lui faire ingurgiter ceux qu'elle contient.

    Ça limite l'imbrication de 2 niveaux. Mais il y a peut-être mieux....je ne sais pas.




    Fait des essais avec les modifications de nommage et dis moi si ça va mieux.
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 273
    Par défaut
    Salut Qwazerty,

    J'ai apporté la modification ci-dessous et ça marche très bien. Je vais tout de même prendre en compte ta remarque le nom du Slicercache.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    With SheetRCP
       For col = 1 To 2
           With .Cells(1, col)
             namecol = SheetRCP.Cells(1, col).Value
                   x = .Left
                   y = .Top
                   w = .Width
                   h = .Height
           End With
     
           CurrentWb.SlicerCaches.Add2(MonTCD, namecol).Slicers.Add SheetRCP, , namecol, namecol, y, x, w, h
       Next col
    End With
    Grand merci pour ton aide.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/10/2017, 00h53
  2. Réponses: 2
    Dernier message: 12/04/2017, 00h28
  3. Clustering/Segmentation et tableaux croisés dynamiques
    Par cedou83 dans le forum SAS STAT
    Réponses: 4
    Dernier message: 04/02/2016, 19h38
  4. [XL-2010] VBA : Automatiser plusieurs tableaux croisés dynamiques sur une même page
    Par damoko dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/07/2015, 12h52
  5. [XL-2007] Optimiser actualisation auto de plusieurs Tableaux croisés dynamique
    Par Stobbart dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 21/07/2010, 21h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo