Sélection d'éléments dans un segment grâce à VBA
Bonjour,
Je rencontre une problématique assez complexe pour laquelle je n'ai malheureusement pas encore trouvé de solution. Permettez-moi de vous expliquer :
Je dispose de deux segments principaux dans mon tableau de bord. Le premier permet de sélectionner un processus de mon entreprise, et le second correspond aux services. Mon objectif est que, lorsqu'un processus est sélectionné, les services associés soient automatiquement sélectionnés dans le deuxième segment.
Pour savoir quels services sont liés à chaque processus, j'utilise un tableau croisé dynamique (TCD) qui recense les services que VBA doit ensuite sélectionner dans le deuxième segment. J’ai déjà écrit la macro suivante, qui fonctionne jusqu’à l’étape où les services doivent être sélectionnés. Cependant, cette sélection ne se fait pas correctement.
Le problème est que plusieurs services peuvent être sélectionnés, et je dois être en mode de sélection multiple. Actuellement, le code s'arrête lorsque tous les éléments sont sélectionnés, alors que je souhaite uniquement que les services associés au processus sélectionné, et qui figurent dans le TCD, soient retenus. Excel parvient à identifier et à ajouter les services à la "collection", comme l'indiquent les messages box qui s'affichent et montrent bien les noms des services ajoutés.
Si quelqu'un sait comment résoudre ce problème en VBA, je lui en serais très reconnaissant.
Merci beaucoup et bonne journée !
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
' Si c'est le TCD des processus qui est mis à jour
If Target.Name = "Segment" Then
On Error GoTo ErrorHandler
' Définir les objets nécessaires
Dim wsSegment As Worksheet
Set wsSegment = ThisWorkbook.Sheets("Segment") ' Feuille Segment
Dim segmentServices As slicerCache
On Error Resume Next
Set segmentServices = ThisWorkbook.SlicerCaches("Segment_Services") ' Segment des services
On Error GoTo ErrorHandler
' Vérifier si le segment existe
If segmentServices Is Nothing Then
MsgBox "Le segment des services n'existe pas.", vbCritical
Exit Sub
End If
' Dernière ligne des services dans la colonne A de la feuille "Segment"
Dim lastRowServices As Long
lastRowServices = wsSegment.Cells(wsSegment.Rows.count, "A").End(xlUp).Row
MsgBox "Dernière ligne des services : " & lastRowServices, vbInformation
If lastRowServices < 2 Then
MsgBox "Le TCD des services est vide !", vbCritical
Exit Sub
End If
' Récupérer le processus sélectionné directement depuis la cellule L4 de la feuille "Segment"
Dim selectedProcess As String
selectedProcess = wsSegment.Range("L4").Value ' La cellule L4 contient le processus sélectionné
If selectedProcess = "" Then
MsgBox "Aucun processus sélectionné dans la cellule L4 !", vbCritical
Exit Sub
End If
' Annonce du processus sélectionné pour vérification
MsgBox "Processus sélectionné depuis L4 : " & selectedProcess, vbInformation
' Déclarer une collection pour stocker les services associés au processus
Dim associatedServices As New Collection
Dim serviceRow As Long
' Parcourir les services dans la colonne A (à partir de A2) pour récupérer ceux associés au processus
For serviceRow = 2 To lastRowServices ' En partant de la ligne 2 (les services commencent à A2)
' Ajouter directement le service à la collection
associatedServices.Add wsSegment.Cells(serviceRow, "A").Value ' Ajouter le service (colonne A)
MsgBox "Service ajouté : " & wsSegment.Cells(serviceRow, "A").Value, vbInformation ' Afficher le service ajouté
Next serviceRow
' Si aucun service associé n'est trouvé
If associatedServices.count = 0 Then
MsgBox "Aucun service associé au processus sélectionné !", vbCritical
Exit Sub
End If
' **Sélectionner uniquement les services associés au processus**
MsgBox "Sélectionner uniquement les services associés au processus.", vbInformation
Dim serviceName As Variant
For Each slicerItem In segmentServices.slicerItems
slicerItem.Selected = False ' D'abord désélectionner tous les services
Next slicerItem
' Sélectionner les services associés au processus
For Each serviceName In associatedServices
Dim found As Boolean
found = False
' Parcourir les éléments du segment pour trouver ceux qui correspondent à notre liste
For Each slicerItem In segmentServices.slicerItems
If slicerItem.Caption = serviceName Then
slicerItem.Selected = True ' Sélectionner le service associé
MsgBox "Service sélectionné : " & slicerItem.Caption, vbInformation ' Afficher le service sélectionné
found = True
End If
Next slicerItem
If Not found Then
MsgBox "Service non trouvé dans le segment : " & serviceName, vbExclamation
End If
Next serviceName
End If
Exit Sub
ErrorHandler:
' Afficher le message d'erreur et la ligne de code où cela a échoué
MsgBox "Erreur : " & Err.Description, vbCritical
End SubEDIT Modo : merci d'utiliser les balises de codes disponibles dans le menu en cliquant sur l'icone </> et en collant vos codes dans la fenêtre.
Bonjour
Par défaut seuls les éléments disponibles d'un segment de niveau 2 sont utilisés par défaut en fonction du niveau 1
Il suffit de défiltrer le niveau 2 lors du changement de niveau 1
Les boucles sur les filtres sont à éviter car très lentes...
Bonjour, merci pour votre retour.
Serait-il possible de donner la priorité à un TCD par rapport à un autre pour le segment de niveau 2 ?
Avec votre méthode, j’ai bien pu sélectionner trois services pour un processus en me connectant à un seul TCD. Cependant, lorsque je me connecte à un TCD qui regroupe tous les services, les trois services ne sont plus les seuls à être sélectionnés. J’aimerais qu’ils demeurent les seuls sélectionnés. En connectant ce segment au deuxième TCD, l’ensemble des services sont à nouveau sélectionnés dans mon segment de niveau 2 et ainsi la sélection réduite ne fonctionne plus.
Pouvez-vous m'éclairer à ce sujet ?
Je vous souhaite une bonne journée.
Bonjour
Tant qu'on parle dans le flou sans savoir comment sont structuré les TCD et leur source, on n'avancera pas...