oguruma
XLDnaute Occasionnel
Bonjour le Forum,
Afin de mieux documenter les TCD qui comportent des segments il peut être confortable d'afficher l'élément sélectionné dans le segment ou dans certains cas il peut être nécessaire d'intervenir dynamiquement sur la valeur à affecter au segment. Je vous présente une façon d'y parvenir. Si les membres chevronnés du Forum ont d'autres solutions je suis preneur, merci 🙂.
1. Identifier l'élément sélectionné dans le segment
Cette méthode est certainement connue par un bon nombre de membres du Forum mais autant le rappeler pour les nouveaux venus.
Les éléments sélectionnés sont ESPAGNE pour le segement PAYS_ORIGINE et IMPORT pour le segment ETAT_PRODUCTION.
On les retrouve donc sous cette forme et les récupérer pour les afficher sous cette forme
Comment y parvenir ?
Dans un "coin caché" du classeur on construit un TCD comportant comme seule et unique colonne le champ du segment comme ceci
La cellule "TOUS" en colonne contient donc la formule qui va identifier la valeur du segment sélectionné. Bien entendu le segment
doit être rattaché au TCD
==> le TCD N°2
La valeur sélectionnée est déterminée par la formule : =SI(NBVAL(M5:M6)>1;"TOUS";M5) qui s'explique assez facilement.
2. Modifier dynamiquement la valeur d'un segment (en d'autres termes intervenir sur un segment)
Pour diverses raisons donc, il peut être nécessaire de piloter les sélections dans le segment en fonction de certains événements ou besoins contextuels du classeur selon les données traitées.
Deux méthodes pour y parvenir avec deux variantes pour chacune.
Méthode 1
On va construire une liste de valeurs dans une cellule. La liste doit correspondre aux éléments du segment.
Puis modifier la valeur du segment on fera appel à une MACRO en VBA
:: Modification d'un élément dans ETAT PROD ::
Optional hParam As String ==> sera utilisé pour la méthode 2 afin de ne pas dupliquer le code
Ici c'est assez simple car le segment ne comporte que deux valeurs. Il suffit donc de les alterner en fonction de la valeur demandée dans la liste de choix.
On gère également où on ne positionne pas de filtres avec la valeur TOUS sélectionnée. La valeur sélectionnée doit être positionnée à TRUE en 1ère instance.
Pour activer la modification on actionne la macro par le bouton
:: Modification d'un élément dans PAYS_ORIGINE :: (un segment comportant plus de 2 éléments)
En revanche cela peut se compliquer si le segment comporte plusieurs valeurs. Là ici pour 4 valeurs on pourrait encore appliquer la méthode ci-dessus.
Voici donc une manière de gérer dynamiquement les modifications dans un segment quelque soit le nombre d'éléments.
En premier lieu on affecter la valeur TRUE à l'élément recherché puis on affecter FALSE aux autres. Pour y parvenir on va boucler sur les items du segment en prenant de ne pas mettre à FALSE la valeur sélectionnée. Dans le cas contraire on considère que l'on désactive tous les filtres. Puis on fait appel au bouton pour mettre à jour le segment :
Méthode 2
On va tout simplement se passer des deux boutons macro en faisant appel aux procédures événementielles de la feuille
Call MODIFIER_SEGMENT_ETAT("CHOIX_ETAT2") :==> c'est là qu'intervient le paramètre afin de ne pas dupliquer le code pour l'exemple démontré. Pour votre utilisation cela ne sera peut-être pas nécessaire.
::-:: SYNTHESE ::-::
Afin de mieux documenter les TCD qui comportent des segments il peut être confortable d'afficher l'élément sélectionné dans le segment ou dans certains cas il peut être nécessaire d'intervenir dynamiquement sur la valeur à affecter au segment. Je vous présente une façon d'y parvenir. Si les membres chevronnés du Forum ont d'autres solutions je suis preneur, merci 🙂.
1. Identifier l'élément sélectionné dans le segment
Cette méthode est certainement connue par un bon nombre de membres du Forum mais autant le rappeler pour les nouveaux venus.
Les éléments sélectionnés sont ESPAGNE pour le segement PAYS_ORIGINE et IMPORT pour le segment ETAT_PRODUCTION.
On les retrouve donc sous cette forme et les récupérer pour les afficher sous cette forme
Comment y parvenir ?
Dans un "coin caché" du classeur on construit un TCD comportant comme seule et unique colonne le champ du segment comme ceci
La cellule "TOUS" en colonne contient donc la formule qui va identifier la valeur du segment sélectionné. Bien entendu le segment
doit être rattaché au TCD
La valeur sélectionnée est déterminée par la formule : =SI(NBVAL(M5:M6)>1;"TOUS";M5) qui s'explique assez facilement.
2. Modifier dynamiquement la valeur d'un segment (en d'autres termes intervenir sur un segment)
Pour diverses raisons donc, il peut être nécessaire de piloter les sélections dans le segment en fonction de certains événements ou besoins contextuels du classeur selon les données traitées.
Deux méthodes pour y parvenir avec deux variantes pour chacune.
Méthode 1
On va construire une liste de valeurs dans une cellule. La liste doit correspondre aux éléments du segment.
Puis modifier la valeur du segment on fera appel à une MACRO en VBA
:: Modification d'un élément dans ETAT PROD ::
VB:
Sub MODIFIER_SEGMENT_ETAT(Optional hParam As String)
Dim sChoix As String
If hParam = "" Then sChoix = Range("CHOIX_ETAT").Value Else sChoix = Range(hParam).Value
If sChoix = "IMPORT" Then
With ActiveWorkbook.SlicerCaches("Segment_ETAT_PRODUCTION")
.SlicerItems("IMPORT").Selected = True
.SlicerItems("LOCAL").Selected = False
End With
End If
If sChoix = "LOCAL" Then
With ActiveWorkbook.SlicerCaches("Segment_ETAT_PRODUCTION")
.SlicerItems("LOCAL").Selected = True
.SlicerItems("IMPORT").Selected = False
End With
End If
If sChoix = "TOUS" Then
ActiveWorkbook.SlicerCaches("Segment_ETAT_PRODUCTION").ClearManualFilter
End If
End Sub
Optional hParam As String ==> sera utilisé pour la méthode 2 afin de ne pas dupliquer le code
Ici c'est assez simple car le segment ne comporte que deux valeurs. Il suffit donc de les alterner en fonction de la valeur demandée dans la liste de choix.
On gère également où on ne positionne pas de filtres avec la valeur TOUS sélectionnée. La valeur sélectionnée doit être positionnée à TRUE en 1ère instance.
Pour activer la modification on actionne la macro par le bouton
:: Modification d'un élément dans PAYS_ORIGINE :: (un segment comportant plus de 2 éléments)
En revanche cela peut se compliquer si le segment comporte plusieurs valeurs. Là ici pour 4 valeurs on pourrait encore appliquer la méthode ci-dessus.
Voici donc une manière de gérer dynamiquement les modifications dans un segment quelque soit le nombre d'éléments.
VB:
Sub MODIFIER_SEGMENT_PAYS(Optional hParam As String)
Dim vItem As Variant
Dim sChoix As String
If hParam = "" Then sChoix = Range("CHOIX_PAYS").Value Else sChoix = Range(hParam).Value
If sChoix <> "TOUS" Then
With ActiveWorkbook.SlicerCaches("Segment_PAYS_ORIGINE")
.SlicerItems(sChoix).Selected = True
For Each vItem In .SlicerItems
If vItem.Name <> sChoix Then vItem.Selected = False
Next
End With
Else
ActiveWorkbook.SlicerCaches("Segment_PAYS_ORIGINE").ClearManualFilter
End If
End Sub
En premier lieu on affecter la valeur TRUE à l'élément recherché puis on affecter FALSE aux autres. Pour y parvenir on va boucler sur les items du segment en prenant de ne pas mettre à FALSE la valeur sélectionnée. Dans le cas contraire on considère que l'on désactive tous les filtres. Puis on fait appel au bouton pour mettre à jour le segment :
Méthode 2
On va tout simplement se passer des deux boutons macro en faisant appel aux procédures événementielles de la feuille
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("CHOIX_ETAT2")) Is Nothing Then
Call MODIFIER_SEGMENT_ETAT("CHOIX_ETAT2")
End If
If Not Application.Intersect(Target, Range("CHOIX_PAYS2")) Is Nothing Then
Call MODIFIER_SEGMENT_PAYS("CHOIX_PAYS2")
End If
End Sub
Call MODIFIER_SEGMENT_ETAT("CHOIX_ETAT2") :==> c'est là qu'intervient le paramètre afin de ne pas dupliquer le code pour l'exemple démontré. Pour votre utilisation cela ne sera peut-être pas nécessaire.
::-:: SYNTHESE ::-::