MAcro sur un Tableau croisé dynamique
Bonjour,
J'ai un tableau croisé dynamique sur lequel je voudrais appliquer une macro qui permettrait de faire une sélection en automatique en fonction de la valeur d'une cellue.
Voici mon code :
Sub Macro2()
'
' Macro2 Macro
' Macro enregistrée le 21/11/2012 par Nicolas Baudry
'
'sur la feuille TCD 1 prendre la valeur de la cellule C2
N°_Commande = Range("C2").Value
'sélectionner la feuille TCD 2 où l'on souhaite modifier un des filtres du tableau croisé dynamique
Sheets("TCD 2").Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Commande")
.PivotItems(N°_Commande).Visible = True
End With
Range("A6").Select
End SubIl me met une erreur exécution 1004 : Impossible de lire la propriété PivotItems de la classe PivotField
Est ce que quelqu'un peut m'aider ?
Par avance merci
Nini
Bon, je crois avoir compris pourquoi il me mettais cette erreur. J'avais deux TCD qui avait le même nom a priori.
Après modification voici mon code :
Sub Macro2()
'
' Macro2 Macro
' Macro enregistrée le 21/11/2012 par Nicolas Baudry
'
'sur la feuille TCD 1 prendre la valeur de la cellule C2
Dim N°_Commande As String
N°_Commande = Range("C2").Value
'sélectionner la feuille TCD 2 où l'on souhaite modifier un des filtres du tableau croisé dynamique
Sheets("TCD2").Select
With ActiveSheet.PivotTables("TCD2").PivotFields( _
"Commande")
.PivotItems(N°_Commande).Visible = True
End With
Range("A6").Select
End SubProblème c'est que la macro fait rien sur le TCD. Le filtre "Commande" n'est pas modifié par la valeur N°_Commande ?????
Est ce que quelqu'un peut m'aider SVP ?
Merci par avance
Nini
Bonjour,
Le mieux serait de voir ton fichier pour visualiser les dispositions dans ton TCD
Si je comprends bien tu veux définir la valeur du numéro de commande dans C2 puis adapter ton TCD en fonction
A te relire
Bonjour Dan et merci pour la prise en compte de ma demande
Voici le fichier
Nini
P.S. : J'ai mis très peu de données pour l'exemple
Bonsoir,
Ci-joint fichier à tester et à adapter à tes besoins.
Ce code est à améliorer pour une automatisation plus générale (lors d'une création de TCD en VBA)
Bonne digestion
nb; j'ai mis ta cellule C2 de la feuille TCD1 en liste déroulante (voir code)
Cdlt.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sH As Worksheet
Dim Cde As String
If Target.Cells.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range("C2")) Is Nothing Then
Set sH = Worksheets("TCD1")
Cde = sH.Cells(2, 3).Value
Affichage_Commande "Commande", Cde
End If
End Sub
Private Sub Affichage_Commande(Field As String, Item As String)
Dim pvtField As PivotField
Dim pvtItem As PivotItem
Dim pvtItems As PivotItems
On Error GoTo ShowInPivot_EH
'On réinitialisee le champ
For Each pvtItem In Worksheets("TCD2").PivotTables("TCD2").PivotFields(Field).PivotItems
pvtItem.Visible = True
Next
'On applique le filtre désiré
For Each pvtItem In Worksheets("TCD2").PivotTables("TCD2").PivotFields(Field).PivotItems
If pvtItem.Name = Item Then
pvtItem.Visible = True
Else
pvtItem.Visible = False
End If
Next
Exit Sub
ShowInPivot_EH:
Debug.Print "Error(" & Err.Number & "): " & Err.Description
Exit Sub
End Sub
Cela me semble bien mais il va falloir que je le bosse car je ne suis pas un expert
PAr contre je ne vois pas comment la liste déroulante (parfaite par ailleus) a été créée ?
Comment elle se met à jour d'ailleurs car les n° de commandes à afficher sont ceux se trouvant de A11 jusqu'à Ax (x=total) (sur la feuille TCD1) ?
Suis je clair ?
Je l'espère
Je regarde pour le reste mais en tout cas je te remercie déjà pour ton aide
Nini
Re,
Pout ton information, mais je pense que tu crains une crise de foie
Dans le fichier, la mise à jour est manuelle avec la procédure "DonnéesValidation". Elle se met alors à jour avec les nouvelles données enregistrées dans ta base de données. Je pense qu'il y a plus simple
Cdlt
'Attribute VB_Name = "DonneesValidation"
'créer à partir d'une plage en colonne une liste de validation
'sans doublons (équivalent de Données\Validation... autoriser -> liste)
Public Sub DonnéesValidation()
'Iznogood, mpfe
Dim sH_1 As Worksheet, sH_2 As Worksheet
Dim derLigne As Integer
Dim Plage As Range
Dim t() As Variant
Dim r As Range
Dim i As Long
Dim flag As Boolean
Dim Formule As String
Application.ScreenUpdating = False
Set sH = Worksheets("Données")
Set sH_2 = Worksheets("TCD1")
sH.Activate
With sH
derLigne = .Range("A" & Rows.Count).End(xlUp).Row
Set Plage = .Range(Cells(4, 1), Cells(derLigne, 1))
ReDim t(0)
For Each r In Plage
flag = True
For i = 1 To UBound(t)
If t(i) = r Then flag = False
Next i
If flag Then
ReDim Preserve t(UBound(t) + 1)
t(UBound(t)) = r
End If
Next r
For i = 1 To UBound(t)
Formule = Formule & t(i) & ","
Next i
End With
With sH_2.Cells(2, 3).Validation
.Delete
.Add Type:=xlValidateList, Formula1:=Formule
End With
End SubBonjour,
C'est parfait, j'ai réussi à travailler sur les codes et j'obtiens ce que je voulais
Encore merci pour votre aide
nini
Bonsoir,
A tester.
Code à copier dans le module de la feuille 'Tableau de bord'.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [C12]) Is Nothing Then
If Target.Count > 1 Then Exit Sub
Worksheets("Pivot").PivotTables(1).PivotFields("CodeProjet").CurrentPage = Target.Value
End If
End SubMerci beaucoup Jean-Eric,
Je n'arrive même pas à l'essayer. Quand je remplace le texte par celui que vous m'avez conseillé et bien je supprime le nom de la macro et donc je n'arrive plus à la retrouver et à "lier" mon bouton... une idée? me sens naze-là