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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
| Sub ReadAndReport_SlicersSelectionTo2ndSlicersGroup(Pt_Updated As PivotTable, Pt_2nd As PivotTable)
Dim tcd As PivotTable
Dim TcdFields As PivotFields
Dim CurPivotfield As PivotField
Dim ColSlicer As Slicers
Dim CurSlicer As Slicer
Dim ItSlicer As SlicerItem
Dim ColSlicer2nd As Slicers
Dim CurSlicer2nd As Slicer
Dim SlicerItem2nd As SlicerItem
Dim tblo()
Dim it As Variant
Dim SlicerImpacté As String
Dim TrueIts As Collection: Set TrueIts = New Collection
'Dim CurSlicerC As SlicerCache
Dim ListeItSlicer As String
Dim Décalage As Integer
Const départ As String = "A1"
Const départ2 As String = "A3"
Dim Err_Objectif As Boolean: Err_Objectif = False
Dim Err_Refacst As Boolean: Err_Refacst = False
'PrecCalculationMode = Application.Calculation
'Application.Calculation = xlCalculationManual
Set tcd = Pt_Updated
Set TcdFields = tcd.PivotFields
Set ColSlicer = tcd.Slicers
'Set ColSlicer2nd = Pt_2nd.Slicers
For Each CurSlicer In ColSlicer
'Chargement du champs du tcd cible pour utiliser la propriété #AllItemsVisible#
On Error Resume Next
Set CurPivotfield = TcdFields(CurSlicer.SlicerCache.SourceName)
On Error GoTo 0
Erase tblo
If LinkedSlicers(CurSlicer, tblo) Then
For i = 0 To UBound(tblo, 2)
SlicerImpacté = tblo(0, i)
If SlicerImpacté = "" Then
'si il n'y a aucun slicer commun alors on ne peut faire correspondre le filtre
If Sheets("config-").Range("B25").Value = "Mode Avec Objectifs" Then
MsgBox "Le programme n'a pas trouvé de liaison paramétrer dans 'Vh-LiaisonsSlicers' pour le slicer" & CurSlicer.Name, vbCritical, "_DEV"
Err_Objectif = True
'GoTo ErrorHandler
End If
Else
If UCase(SlicerImpacté) = "X" Then 'il s'agit d'un contrôle pour ne pas ignorer l'absence d'un champs de la source impacté et donc invalider les affichages provenants de cette source, puisque l'on ne peut pas filtrer correctement
'il faut paramétrer X dans le slicer impacté manaquant et preciser la source devant être impactée...
If UCase(tblo(1, i)) Like "*REFACST*" Then
If CurPivotfield.AllItemsVisible = False Then
'on invalide les données de la source visée car il y a un filtre sur le slicer qui n'a pas d'équivalent sur la source
Err_Refacst = True
End If
End If
Else
'recherche du slicer jumeau par son nom complété de l'indice #" 2"#
Set CurSlicer2nd = Nothing
On Error Resume Next
'Set CurSlicer2nd = ColSlicer2nd(SlicerImpacté)
Set CurSlicer2nd = GetSlicer(SlicerImpacté)
On Error GoTo 0
If CurSlicer2nd Is Nothing Then
'si il n'y a aucun slicer commun alors on ne peut faire correspondre le filtre
'CurSlicer2nd.SlicerCache.ClearManualFilter
If UCase(tblo(1, i)) Like "*OBJECTIF*" Then
If Err_Objectif = False Then
MsgBox "Le filtre sur le champ '" & CurSlicer.Caption & "' n'est pas applicable aux mesures N-1! " & Chr(10) _
& "Les coûts de l'année précédente et les objectifs sont donc nuls pour ce filtre.", vbExclamation, "Incohérence filtre Objectif"
Err_Objectif = True
End If
ElseIf UCase(tblo(1, i)) Like "*REFACST*" Then
Err_Refacst = True
End If
'GoTo ErrorHandler
Else
If CurPivotfield.AllItemsVisible Then
'libération du filtre si aucun filtre appliqué
If Slicer_AllItemsVisible(CurSlicer2nd.Name) = False Then
CurSlicer2nd.SlicerCache.ClearManualFilter
End If
Else
'si il y a un filtre appliqué alors l'on parcours tous les éléments de filtre
'#Optimisation
If CurSlicer2nd.SlicerCache.SlicerItems.Count > 5 Then Déconnecter_1Slicer CurSlicer2nd.SlicerCache.Name
For Each ItSlicer In CurSlicer.SlicerCache.SlicerItems
'chargement de l'élément de filtre
Set SlicerItem2nd = Nothing
On Error Resume Next
Set SlicerItem2nd = CurSlicer2nd.SlicerCache.SlicerItems(ItSlicer.Name)
On Error GoTo 0
'##### Application du filtre sur la seconde source
If ItSlicer.Selected And ItSlicer.HasData Then
If InCollection(TrueIts, ItSlicer.Name) = False Then
TrueIts.Add ItSlicer, ItSlicer.Name
End If
If SlicerItem2nd Is Nothing Then
'si l'élément sélectionné n'est pas présent alors on ne peut faire correspondre le filtre
If UCase(CurSlicer2nd.SlicerCache.WorkbookConnection.Name) Like "*OBJECTIF*" Then
If Err_Objectif = False Then
CurSlicer2nd.SlicerCache.ClearManualFilter
Err_Objectif = True
MsgBox "Le filtre '" & ItSlicer.Name & "' sur le champ '" & CurSlicer.Caption & "' n'est pas applicable aux mesures N-1! " & Chr(10) _
& "Les coûts de l'année précédente et les objectifs sont donc nuls pour ce filtre.", vbExclamation, "Incohérence filtre Objectif"
End If
'GoTo ErrorHandler
ElseIf UCase(CurSlicer2nd.SlicerCache.WorkbookConnection.Name) Like "*REFACST*" Then
Err_Refacst = True
End If
Else
SlicerItem2nd.Selected = True
End If
Else
'on ne déselectionne sur la 2nd source que lorqu'on ne trouve une correspondance (PARTIEL)
If Not SlicerItem2nd Is Nothing Then SlicerItem2nd.Selected = False
End If
Next
'déselection des autres éléments sur objectifs
For Each ItSlicer In CurSlicer2nd.SlicerCache.SlicerItems
If InCollection(TrueIts, ItSlicer.Name) = False And ItSlicer.Selected Then ItSlicer.Selected = False
Next
'#Optimisation
If CurSlicer2nd.SlicerCache.SlicerItems.Count > 5 Then Reconnecter_1Segment CurSlicer2nd.SlicerCache.Name
End If 'CurPivotfield.AllItemsVisible
End If 'CurSlicer2nd = Nothing
End If 'SlicerImpacté
End If 'SlicerImpacté = "X"
Next
End If ' LinkedSlicers = true or false
Next
If Err_Objectif Then
Sheets("config-").Range("B20") = "Mesure N-1 et Objectif non disponibles"
Else
'Libération de l'affichage des objectifs
Sheets("config-").Range("B20") = vbNullString
End If
If Err_Refacst Then
Sheets("config-").Range("B27") = "INDISPONIBLE"
Else
Sheets("config-").Range("B27") = vbNullString
End If
Exit Sub
End Sub |
Partager