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 :

Slicer ajouter enlever des connexions via une boucle [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut Slicer ajouter enlever des connexions via une boucle
    Bonjour,

    J'ai un classeur avec pleins de TCD basés sur la même source, avec également pleins de slicer connectés à tous ces TCD.
    Ajoutant des informations (colonnes) à ma source de données je dois modifier la source de mes TCD
    Or si je modifie un par un mes sources de TCD j'ai une erreur a cause des connexions aux slicers.
    Sachant que je ne sais pas modifier la source de tout les TCD en même temps (Est-ce possible ?) je dois donc enlever toutes les connexions avant de faire la maj puis de les remettres, vu le nombre de tableau et de segment c'est hors de question de le faire a la main, donc j'essaye de le faire par une boucle, et vous vous doutez bien que je poste ici c'est que je n'y arrive pas.
    Voici ce que m'as donné l'enregistreur de macro pour la suppression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            ActiveSheet.Shapes.Range(Array("b")).Select
            ActiveWorkbook.SlicerCaches("Segment_b").PivotTables.RemovePivotTable ( _
            ActiveSheet.PivotTables("Tableau croisé dynamique1"))
    (remplacer RemovePivotTable par AddPivotTable pour l'ajout)

    Voici l'une des boucles que j'ai tenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim pvt As PivotTable, sh As Worksheet
    For Each sh In ThisWorkbook.Worksheets
        For Each pvt In sh.PivotTables
            ThisWorkbook.SlicerCaches("Segment_a").PivotTables.AddPivotTable (sh.PivotTables(pvt.Name))
        Next
    Next
    Mais j'obtient une erreur 424 objet requis sur la ligne 4.
    Si quelqu'un a une solution je suis preneur
    Merci d'avance.

    edit:
    Au cas où quelqu'un chercherais en même temps que moi, j'ai trouvé ça sur stackoverflow, ça a l'air d'être exactement ce que je recherche, je confirmerais après test
    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
    Sub ManageSlicers(Connect_Disconnect As String)
    'feed in *connect* or *disconnect* accordingly to get it applied to all slicers in *Board*.
    Dim oSlicer As Slicer
    Dim oSlicercache As SlicerCache
    '
    Dim wks As Worksheet
    Dim pt As PivotTable
     
    For Each oSlicercache In ActiveWorkbook.SlicerCaches
        For Each oSlicer In oSlicercache.Slicers
            If oSlicer.Shape.BottomRightCell.Worksheet.Name = "Board" Then
                For Each wks In Worksheets
                    For Each pt In wks.PivotTables
                        If Connect_Disconnect = "connect" Then
                            oSlicer.SlicerCache.PivotTables.AddPivotTable (Sheets(wks.Name).PivotTables(pt.Name))
                        ElseIf Connect_Disconnect = "disconnect" Then
                            oSlicer.SlicerCache.PivotTables.RemovePivotTable (Sheets(wks.Name).PivotTables(pt.Name))
                        Else
                            MsgBox "Macro ManageSlicers fucked up."
                        End If
                    Next
                Next
            End If
        Next
    Next
     
    Set oSlicer = Nothing
    Set oSlicercache = Nothing
    Set pt = Nothing
    Set wks = Nothing
    End Sub
     
    Sub UpdatePivotCache()
    'update pivottables cache
    Dim wks As Worksheet
    Dim pt As PivotTable
     
    For Each wks In ActiveWorkbook.Worksheets
        For Each pt In wks.PivotTables
            If lIndex = 0 Then
                pt.ChangePivotCache _
                    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
                                                    SourceData:=Sheets("Data").Range("A1").CurrentRegion.Address(ReferenceStyle:=xlR1C1))
                Set ptMain = pt
                lIndex = 1
            Else
                pt.CacheIndex = ptMain.CacheIndex
            End If
        Next pt
    Next wks
    End Sub
     
    Sub RefreshSlicersAndPivots()
    ThisWorkbook.RefreshAll
    Call ManageSlicers("disconnect")
    Call UpdatePivotCache
    Call ManageSlicers("connect")
    End Sub
    edit2: je confirme ça marche très bien sur mon classeur test
    Problème résolu.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  2. #2
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 420
    Points : 16 264
    Points
    16 264
    Par défaut
    Bonjour

    Si la source est sous forme de tableau, ce problème n'existe pas.

    Le fait d'ajouter des colonnes à une source montre une mauvaise conception : une source de TCD doit être une table et comme toute table de base de données ne doit pas voir sa structure évoluer au fil de temps mais simplement le nombre d’enregistrements (ligne) évoluer.

    En ne respectant pas la norme, on est effectivement amené a devoir compenser par du code...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 661
    Points : 5 785
    Points
    5 785
    Par défaut
    Si la source est sous forme de tableau, ce problème n'existe pas.
    C'est vrai, je traine des mauvaises habitudes dont j'ai du mal à me séparer, notamment sur la non utilisation des tableaux (et pourtant je le conseille aux autres), je m'y met petit à petit.

    Citation Envoyé par 78chris Voir le message
    Le fait d'ajouter des colonnes à une source montre une mauvaise conception : une source de TCD doit être une table et comme toute table de base de données ne doit pas voir sa structure évoluer au fil de temps mais simplement le nombre d’enregistrements (ligne) évoluer.
    La par contre je ne suis pas du tout d'accord, j'ai mis à disposition un outil qui reprend X données, l'outil plaît bien on me demande de rajouter des données supplémentaires, je ne vois pas en quoi c'est un problème de conception, je vois ça plutôt comme un enrichissement et je trouve que c'est une bonne chose et au contraire un machin figé dans le marbre incapable d'évoluer, là j'y vois un problème de conception.
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  4. #4
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 420
    Points : 16 264
    Points
    16 264
    Par défaut
    RE

    Une base de données c'est 80% de conception, 20% de réalisation : on doit avoir analysé en détail avant afin de tout prévoir et éviter que la structure évolue.

    Là tu travailles avec Excel qui n'est pas une base de données même si la logique évolue de plus en plus vers cela.

    Dans une entreprise, si tu as un BD avec des relations, des données opérationnelles enregistrées, pour changer la structure il faut arrêter tout pendant des jours, souvent décharger les données, changer la structure, et recharger si c'est compatibles, ceci après avoir tester sur une base beta.

    J'ai eu le cas : un développeur n'avait pas respecté mon cahier des charges parce qu'il ne savait pas faire et n'avait pas voulu parler de son problème.
    Ni vu ni connu jusqu'au jour où les utilisateurs ont commencé à se plaindre d'incohérences et où j'ai découvert le pot au roses : cela a bien pénalisé le fonctionnement des services...

    Une bonne structure de BD c'est comme un mécanisme d'horlogerie (à l'ancienne) si tous les rouages sont nickels, ça tourne sinon c la mer..e

    Alors j'essaie d'avoir la même approche avec Excel et, comme je m'en porte très bien, je la conseille...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/01/2018, 14h39
  2. Ajouter des UserControls dans une boucle
    Par treuse dans le forum C#
    Réponses: 1
    Dernier message: 17/12/2014, 20h54
  3. Compresser des fichiers via une connexion HTTP
    Par cisnake dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 27/01/2014, 22h59
  4. [CR 10] Génerer des sous-rapports via une boucle
    Par Marco94 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 11/08/2009, 15h30
  5. Impossible d'ajouter des enregistrements via une requête
    Par roman33 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/06/2009, 21h20

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