Création de slicer

Hello,

Je cherche à créer des slicers sur VBA (plusieurs), mais je ne comprends pas vraiment la différence entre :

  • SlicerCaches
  • SlicerCache
  • Slicers
  • Slicer
...au sens où pour les créer ça va, mais pour les supprimer lors de mise à jour de TCDs, ça ne fonctionne pas.
Dim i As SlicerCaches
Dim j As Slicers
Dim k As SLICER
    Set i = ActiveWorkbook.SlicerCaches
    Set j = i.Add(wsPT.PivotTables("TCD_one"), "MONTH", "title").Slicers
    Set k = j.Add(wsPT, , "title", "MONTH", 0, 300, 150, 200)
    Set j = i.Add(wsPT.PivotTables("TCD_two"), "MONTH", "title2").Slicers
    Set k = j.Add(wsPT, , "title2", "MONTH", 280, 300, 150, 200)

Je pense ne pas avoir bien compris comment articuler et définir les CacheS, et/ou les "Cache" (au singulier).

Merci d'avance.

Bonjour,

Un peu de lecture pour débuter la journée.

https://www.jkp-ads.com/Articles/slicers00.asp

Cdlt.

Bonjour,

Quand tu as le s du pluriel il s'agit de la collection des objets.

Slicers est donc une collection constituée de x Slicer.

Tout comme Worksheets (l'ensemble des feuilles) est la collection de x Worksheet (chaque feuille)

eric

bonjour

salut Jean-Eric, eriiic

ben...

un slicer ça se crée au clavier/souris une fois au départ, et ensuite on s'en sert.

si tu penses que tu dois les recréer souvent, c'est que tu n'as pas bien réfléchi à ton appli

donne-nous des indications sur son fonctionnement : origine des données, traitement, destination des résultats...

Bonne journée

Merci pour vos réponses,

J'avais compris en effet la distinction et le sens de singulier/pluriel pour ces objets. Mais ce que j'ai écris ne semble pas juste pour autant.

Je ne sais comment faire référence aux slicers pour les supprimer lorsaue je remets à jour les TCDs.

Sub Pivot_Table()

Application.ScreenUpdating = False

Dim wsData As Worksheet
Dim wsPT As Worksheet
Dim lastCol As Long, LastRow As Long
Dim rngPT As Range
Dim PCache, PCache1 As PivotCache
Dim PT, PT2, PT3 As PivotTable

Dim i As SlicerCaches
Dim h As SlicerCache
Dim j As Slicers
Dim k As SLICER

    Set wsData = Worksheets("Combined Table")
    Set wsPT = Worksheets("Calculation")

    With wsData
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row - 1
        Set rngPT = .Cells(2, 1).Resize(LastRow, 61)
    End With

    For Each PT In wsPT.PivotTables
        PT.TableRange2.Clear
    Next PT

    'For Each h In ActiveWorkbook.SlicerCaches
        'h.ClearManualFilter
    'Next h

    wsData.Activate

        Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngPT.Address)
        Set PT = PCache.CreatePivotTable(TableDestination:="Calculation!R1C1", TableName:="TCD_1")

        Set PCache2 = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngPT.Address)
        Set PT2 = PCache2.CreatePivotTable(TableDestination:="Calculation!R20C1", TableName:="TCD_2")

        Set PCache3 = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngPT.Address)
        Set PT3 = PCache3.CreatePivotTable(TableDestination:="Calculation!R40C1", TableName:="TCD_3")

    With PT

        '.AddFields RowFields:="Technical Service Creator"
        With .PivotFields("Technical Service Creator")
            .Orientation = xlRowField
            .Position = 1
            .PivotItems("(blank)").Visible = False
        End With

        With .PivotFields("MONTH")
            .Orientation = xlPageField
            EnableMultiplePageItems = True
        End With

        With .PivotFields("Request ID")
            .Orientation = xlDataField
            .Function = xlCount
        End With

    End With

    Set i = ActiveWorkbook.SlicerCaches
    Set j = i.Add(wsPT.PivotTables("TCD_1"), "MONTH", "title").Slicers
    Set k = j.Add(wsPT, , "title", "MONTH", 0, 300, 150, 200)

    With PT2

        '.AddFields RowFields:="AES Tech Supp/ AES Others"
        With .PivotFields("AES Tech Supp/ AES Others")
            .Orientation = xlRowField
            .Position = 1
            .PivotItems("(blank)").Visible = False
        End With

        With .PivotFields("MONTH")
            .Orientation = xlPageField
            EnableMultiplePageItems = True
        End With

        With .PivotFields("YEAR")
            .Orientation = xlPageField
            EnableMultiplePageItems = True
        End With

        With .PivotFields("Request ID")
            .Orientation = xlDataField
            .Function = xlCount
        End With

    End With

    Set j = i.Add(wsPT.PivotTables("TCD_2"), "MONTH", "title2").Slicers
    Set k = j.Add(wsPT, , "title2", "MONTH", 280, 300, 150, 200)

    With PT3

        '.AddFields RowFields:="AES Tech Supp/ AES Others"
        With .PivotFields("AOG")
            .Orientation = xlRowField
            .Position = 1
        End With

        With .PivotFields("MONTH")
            .Orientation = xlPageField
            EnableMultiplePageItems = True
        End With

        With .PivotFields("YEAR")
            .Orientation = xlPageField
            EnableMultiplePageItems = True
        End With

        With .PivotFields("AES Tech Supp/ AES Others")
            .Orientation = xlPageField
            EnableMultiplePageItems = True
        End With

        With .PivotFields("Request ID")
            .Orientation = xlDataField
            .Function = xlCount
        End With

    End With

wsPT.Activate

Application.ScreenUpdating = True

End Sub

Ici entre autres :

    'For Each h In ActiveWorkbook.SlicerCaches
        'h.ClearManualFilter
    'Next h

Merci.

ps: la journée est bien entamée pour moi ( 14h30)

un slicer ça se crée au clavier/souris une fois au départ, et ensuite on s'en sert.

si tu penses que tu dois les recréer souvent, c'est que tu n'as pas bien réfléchi à ton appli

Je veux pas "recréer des slicers" pour recréer des slicers x fois... C'est pas que j'ai pas bien réfléchi... : c'est que je suis débutant !

J'ai des TCD qui seront mis à jour plusieurs fois. Or je constate que le slicer fait buger la macro à chaque mise à jour de TCD, si le slicer a déjà été créée auparavant. Je suppose donc qu'il faut, comme pour les TCDs , faire un truc du genre :

    For Each PT In wsPT.PivotTables
        PT.TableRange2.Clear
    Next PT

...mais pour les slicers.

Je suppose donc qu'il faut que je cherche une solution similaire.

Cependant, si il y a une autre façon de faire je suis preneur.

Re,

Et si avant de te lancer dans la création de segments en VBA, tu réussissais à créer correctement tes TCDs ?

Je titile !...

Cdlt.

Re,

Et si avant de te lancer dans la création de segments en VBA, tu réussissais à créer correctement tes TCDs ?

Je titile !...

Cdlt.

C'est à dire ?

Au temps pour moi,

En tout cas à présent oui j'arrive correctement à les créer.

Re,

Pourquoi 3 caches différents si la source est identique ?

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngPT.Address)
        Set PT = PCache.CreatePivotTable(TableDestination:="Calculation!R1C1", TableName:="TCD_1")
        Set PT2 = PCache.CreatePivotTable(TableDestination:="Calculation!R20C1", TableName:="TCD_2") 
        Set PT3 = PCache.CreatePivotTable(TableDestination:="Calculation!R40C1", TableName:="TCD_3")

Sinon, reprends ce que j'ai envoyé et modifie en conséquence.

Cdlt.

Cela je l'ai déjà modifié. Est-ce que je peux mieux faire ?

        Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngPT.Address)
        Set PT = PCache.CreatePivotTable(TableDestination:="Calculation!R1C1", TableName:="TCD_1")

        Set PT2 = PCache.CreatePivotTable(TableDestination:="Calculation!R20C1", TableName:="TCD_2")

        Set PT3 = PCache.CreatePivotTable(TableDestination:="Calculation!R40C1", TableName:="TCD_3")

        Set PT4 = PCache.CreatePivotTable(TableDestination:="Calculation!R60C1", TableName:="TCD_4")

        Set pT5 = PCache.CreatePivotTable(TableDestination:="Calculation!R80C1", TableName:="TCD_5")

        Set PT6 = PCache.CreatePivotTable(TableDestination:="Calculation!R100C1", TableName:="TCD_6")

        Set PT7 = PCache.CreatePivotTable(TableDestination:="Calculation!R120C1", TableName:="TCD_7")

Pour en revenir au topic, que faire au niveau du slicer lorsque je mets à jour les TCD ?

Question de synchronisation, ou de mise à jour plutôt, ou bien je supprime les existants (comment faire....?) ?

Merci

J'ai des TCD qui seront mis à jour plusieurs fois. Or je constate que le slicer fait buger la macro à chaque mise à jour de TCD, si le slicer a déjà été créée auparavant.

re

solution radicale et hyper simple : actualiser les TCD (et leurs segments par la même occasion) par clic droit et "Actualiser"

pas de VBA, rien, nada !

pourquoi mettre une macro quand Excel te fournit une fonction simple

nota : si tu as 10 TCD (1 analyse par clients, une par mois, une par marché, une par ligne de prod, une de rentabilité... tous bien différents) alors il est plus que temps de passer à Power BI Desktop gratuit

nota 2 : un TCD est toujours mis à jour plusieurs fois. Sinon à quoi il sert ?

bonne journée

pourquoi mettre une macro quand Excel te fournit une fonction simple

Parce que je veux apprendre, comprendre et savoir aller plus loin que ce que je pourrais savoir déjà faire.

nota 2 : un TCD est toujours mis à jour plusieurs fois. Sinon à quoi il sert ?

Bien évidemment, mais c'était pour faire comprendre que c'est lors de la re-création des TCDs que le slicer pose problème.

Je ne veux pas le contourner le problème : j'aimerais le Résoudre.

solution radicale et hyper simple : actualiser les TCD (et leurs segments par la même occasion) par clic droit et "Actualiser"

pas de VBA, rien, nada !

Merci du tuyau, mais si le range double avec des données rajoutées, le TCD le prend en compte ou bien faut paramétrer ça aussi ?

Merci

re

c'est bien de vouloir apprendre.

mais si tu veux travailler sur Excel, il y a d'abord d''autres choses à apprendre : les Tableaux et les TCD, Power Query, Power Pivot (oui, c'est dans Excel)

sans parler de Power BI Desktop gratuit ,à essayer de toute urgence. Les TCD ont trouvé mieux, plus rapide, plus beau, plus interactif, plus tout !

si tu veux apprendre des langages de programmation, il y en a d'autres C++/C#, Python, R...

VBA n'est pas considéré comme un "bon" langage.

tout dépend de ton but, mais dans tous les cas VBA n'est pas une priorité

(je fais du dév Excel et tableurs depuis plus de 20 ans, aucun besoin de VBA)

mais si tu veux à tout prix VBAiser, il y a des spécialistes sur ce forum

bon travail, bon apprentissage

Merci de l'info,

Effectivement tout est dit.

Aujourd'hui j'ai un topic précis sur un problème précis, donc je me focus là-dessus, quand bien même je sais pertinemment que d'autres solutions/méthodes existent...

Donc encore une fois, je reviens au sujet principal du topic : comment travailler avec un slicer déjà créé lorsque les TCD sont recréés, avec d'après ce que j'ai compris, quelque chose sous la forme suivante mais avec l'action ClearManualFilter :

    For Each pt In wsPT.PivotTables
        pt.TableRange2.Clear
    Next pt

Bonjour

VBA ne fait qu'automatiser l'existant : il faut donc avant de coder connaitre parfaitement et comprendre la logique de fonctionnement des classe d'objets que l'on manipule.

Un chirurgien est censé parfaitement connaître l'anatomie avant de nous "recréer"...

Pour ma part je ne comprends pas ce que tu appelles "recréer un TCD" : on le crée, on l'actualise on en change éventuellement la source ou les paramètres mais on ne recrée pas : rien ne se crée, tout se transforme...

Bonjour,

Bon messieurs dames j'apprécie vraiment vos réponses et votre intérêt pour la façon dont on peut travailler sur Excel. J'ai bien compris qu'il y a plusieurs façons de faire (oui oui sans trop de vba, d'accord). Seulement je n'ai pas envie d'écrire un pavé pour réexpliquer encore une fois que je demande une question précise sur un sujet précis, que j'ai l'impression de faire le modérateur à revenir sur le topic (précis) du sujet (bien que vos remarques sont intéressantes je le souligne encore une fois), et je n'ai pas envie d'expliquer pourquoi je fais du VBA, là. Peu importe en fait, je veux :

Supprimer des slicers --> comment fait-on...(?)

La question est simple, et si personne n'a la réponse, dites le moi que je ferme le topic. Car (oui oui bien évidemment comme beaucoup de monde) j'ai besoin de ça pour le boulot, et je perds 24h à poser la même question pour une vingtaine de messages, c'est dommage. J'ai toujours apprécié grandement ce forum pour votre réactivité et vos conseils, c'est pour ça que je compte sur vous pour m'aiguiller car je débute.

Je vais pas révolutionner mon service, ni les méthodes de mes chefs (et oui je sais qu'il y a Power BI dekstop, j'approuve à 100%, mais stagiaire que je suis c'est compliqué de se faire installer de nouveaux softwares...), et je pense que créer un topic sur les slicers (oui c'était "création" mais dans l'explication du problème cela vient avec la suppression ...) devrait se confiner... à parler des slicers (ou ce qui en est grandement proche).

Bref.

Pour le reste c'est très intéressant mais c'est mieux d'en parler dans un autre topic, vous ne pensez pas ?Je vous remercie de votre compréhension, et par pitié que personne se vexe (je ne blame personne)

Donc, au regard des différents objets (slicercaches, slicercache), j'ai tenté cela mais ça ne fonctionne pas :

Dim i As SlicerCaches
Dim h As SlicerCache
Dim j As Slicers
Dim k As SLICER

    For Each h In ThisWorkbook.SlicerCaches
        h.ClearManualFilter
    Next h

    Set i = ActiveWorkbook.SlicerCaches
    Set j = i.Add(wsPT.PivotTables("TCD_1"), "MONTH", "Slicer").Slicers
    Set k = j.Add(wsPT, , "title", "MONTH", 0, 300, 150, 200)

Je souhaite supprimer des slicers (2ème paragraphe) avant de pouvoir en recréer librement. (Ok ça sert à rien entre guillemets, mais aujourd'hui je souhaite résoudre ce problème).

Merci bien encore une fois.

Re,

En l'occurrence j'ai trouvé un code qui fonctionne mais, dans mon insatiable envie de comprendre le VBA je ne comprends pas pourquoi ce dernier fonctionne.

For Each shp In ActiveSheet.Shapes
    If shp.Type = msoSlicer Then shp.Delete
Next shp

...dans la mesure où les slicers sont liés à ces variables ci :

Dim i As SlicerCaches
Dim h As SlicerCache
Dim j As Slicers
Dim k As SLICER

...et que le code qui fonctionne (1er code) utilise des objets de type shapes (?)

Merci d'avance.

Bonjour,

Tu veux apprendre, mais si tu as de mauvaises pratiques où s'il y a mieux tu préfères rester dans l'ignorance.

Il n'y a pas un paradoxe là ?

Tu veux savoir comment supprimer et le titre de ta question est Création de slicers ???

Après tu te plains de perdre 24h ?

Je vais pas révolutionner mon service, ni les méthodes de mes chefs

A qui veux-tu faire croire que ce sont eux qui t'imposent de supprimer pour recréer ?

C'est toi qui développe, c'est toi qui fait les choix du cheminement non ? Tu ne leur demandes pas quel type de boucle ils préfèrent à chaque fois que tu en crée une...

Spoiler

Dire qu'il faut s'intéresser au modèle objet d'excel, connaitre leur hiérarchie. Et si on ne connait pas on peut explorer via la fenêtre espion ou l'explorateur d'objets fait-il partie des choses qu'il ne faut pas dire ? Que tu préfères également ignorer cela car ce n'est pas la question que tu as posées ?

Ok. Vu que les objets sont organisés en collection (faut-il ou pas le dire ?) on peut très facilement la vider. Donc :

    For Each slc In ThisWorkbook.SlicerCaches
        slc.Delete
    Next slc
Ne pas lire non plus, ne répond pas directement à la question posée

Seulement là ils sont tous supprimés. A toi de t'intéresser à ses propriétés pour ne supprimer que ceux qui t'intéressent.

SlicerCache de tel pivottable de telle feuille par exemple.

Ou bien qui a tel nom ou telle source de donnée, etc

eric

Tu veux savoir comment supprimer et le titre de ta question est Création de slicers ???

Après tu te plains de perdre 24h ?

Un titre c’est une chose, pour le reste il faut lire les messages, je pense que cela va de soit qu’un titre en 3 mots peut difficilement résumer le détail et l’évolution éventuel de la solution attendue. Il me semble clair qu’au fil de la discussion la question est très clairement orientée vers la suppression de slicers afin d’en recréer à nouveau.

Moi 1er message :

Je cherche à créer des slicers sur VBA (plusieurs), mais je ne comprends pas vraiment la différence entre :

  • SlicerCaches
  • SlicerCache
  • Slicers
  • Slicer
...au sens où pour les créer ça va, mais pour les supprimer lors de mise à jour de TCDs, ça ne fonctionne pas

Jmd 4eme message :

« si tu penses que tu dois les recréer souvent, c'est que tu n'as pas bien réfléchi à ton appli »

Moi 5eme message :

Je ne sais comment faire référence aux slicers pour les supprimer lorsaue je remets à jour les TCDs

Encore Moi :

Pour en revenir au topic, que faire au niveau du slicer lorsque je mets à jour les TCD ?

Question de synchronisation, ou de mise à jour plutôt, ou bien je supprime les existants (comment faire....?) ?

Dire en plus de cela :

Et si on ne connait pas on peut explorer via la fenêtre espion ou l'explorateur d'objets fait-il partie des choses qu'il ne faut pas dire ? Que tu préfères également ignorer cela car ce n'est pas la question que tu as posées.

C'est pas honnête dans la mesure où j'ai maintes fois précisé apprécié et prendre en compte vos avis et conseils, pas besoin de se vexer.

Aussi dire :

Vu que les objets sont organisés en collection (faut-il ou pas le dire ?) on peut très facilement la vider.

Je ne demande que des précisions justement !

Il y a des priorités et je pense que répondre à un sujet est des plus logiques. Si par la suite on propose d’autres façons de faire c’est très bien. J’ai bien précisé qu’il ne sert à rien de se vexer. Pas besoin d’être binaire :

Tu veux apprendre, mais si tu as de mauvaises pratiques où s'il y a mieux tu préfères rester dans l'ignorance.

Il n'y a pas un paradoxe là ?

C’est juste question de priorité..Je changerais la façon de faire plus tard si j’ai du temps. Là je dois travailler avec des choses déjà faites donc je pose juste une question précise pour laquelle j’attends une réponse précise. Si il y a plus, merci Beaucoup, mais c’est pas en priorité temporellement parlant, c’est logique non (quand bien même ça peux paraitre évident pour certains de faire absolument autrement) ?

Merci (encore une fois......). Je clos ce sujet afin d'éviter une effervescence de quiproquos.

Rechercher des sujets similaires à "creation slicer"