Tableau croisé dynamique : plage variable

valou

XLDnaute Nouveau
Bonjour à tous,

Je souhaite pouvoir modifier la plage de valeur de mon tableau dynamique grâce à une macro VBA.
A partir d'une date de début et une date de fin, il faudrait que la macro soit capable de reconnaitre l'intervalle à considérer dans le tableau.

Voici mon code pour le moment :

Code:
Sub test1()

Dim iX As Integer
Dim iY As Integer

For iX = 2 To 2000
    If Range("A" & iX).Value = Range("D1") Then
    iX = Deb
    End If
    Next iX
    
For iY = 2 To 2000
    If Range("A" & iX).Value = Range("D2") Then
    iY = Fin
    End If
    Next iY
    

    ActiveSheet.PivotTables("Tableau croisé dynamique1").ChangePivotCache _
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "C:\Users\valou\Desktop\[Exemple-forum.xlsm]Feuil1!R" & Deb & "C1:R" & Fin & "C2", Version:= _
        xlPivotTableVersion14)
    
  
End Sub

Etant novice, j'arrive a peu prés à concevoir un algorythme mais je ne connais pas assez le language VBA pour venir à bout de mon projet.

Merci à tous pour l'aide que vous sauriez me donner.

Valou
 

Pièces jointes

  • Exemple-forum.xlsm
    44.8 KB · Affichages: 42
  • Exemple-forum.xlsm
    44.8 KB · Affichages: 61
  • Exemple-forum.xlsm
    44.8 KB · Affichages: 62

valou

XLDnaute Nouveau
Re : Tableau croisé dynamique : plage variable

Bonjour JCGL,

Comment ça passer en Tableau ? Tu veux dire en format A1 ? C'est déjà le cas, mais le bout de macro que j'ai enregistré pour changer la plage du Tableau Dynamique m'a sorti du R1C1..
Je suis complètement perdu... :(
Merci pour ton aide
 

Pierrot93

XLDnaute Barbatruc
Re : Tableau croisé dynamique : plage variable

Bonjour,
Salut Jean-Claude:)

Avec 2010 une autre approche en passant par un segment :
Code:
Option Explicit
Sub test()
Dim s As SlicerItem
ActiveWorkbook.SlicerCaches.Add(ActiveSheet.PivotTables(1), "Date").Slicers.Add _
        ActiveSheet, , "Date", "Date", Range("C10").Top, Range("C10").Left, 130, 180
For Each s In ActiveWorkbook.SlicerCaches("Segment_Date").SlicerItems
    s.Selected = Not (CDate(s.Value) < Range("D1").Value Or CDate(s.Value) > Range("D2").Value)
Next s
End Sub

Attention tout de même, ton fichier étant plein de cellules vides... pas top quand on veut automatiser, autant que les données soient propres...
 

JCGL

XLDnaute Barbatruc
Re : Tableau croisé dynamique : plage variable

Bonjour à tous,

Avec une colonne supplémentaire : tu choisis ton mois ou tes mois.
Un bout de code pour la mise en forme du TCD à 10 items

A+ à tous
 

Pièces jointes

  • JC Exemple-forum.xlsm
    54.4 KB · Affichages: 44

valou

XLDnaute Nouveau
Re : Tableau croisé dynamique : plage variable

Merci pour ta réponse.

Mon tableau sera lié à un calendrier, dont cellules liées sont D1 et D2. C'est pourquoi je souhaite absolument partir de cette base.

Ci-joint mon tableau, sur lequel j'ai modifié le code VBA.
J'arrive pas tout a fait a obtenir ce que je veux pour les variables "iX" et "iY".. Voici le code :

Code:
Dim iX As Integer
Dim iY As Integer
Dim Deb As Integer
Dim Fin As Integer

For iX = 2 To 2000
    If Range("A" & iX).Value >= Range("D1").Value Then
    Deb = iX
    Range("D10").Value = iX
    
        For iY = 2 To 2000
        If Range("A" & iX).Value >= Range("D2").Value Then
        Fin = iY
        Range("D11").Value = iY
    
        Exit Sub
        
        
        Else: iY = iY + 1
        End If
        Next iY
        
    Else: iX = iX + 1
    End If
    Next iX

Ces variables correspondent au rang (mini et maxi) de la plage de la valeur que je souhaite afficher.
Je veux donc reprendre ces variables pour l'intervalle de mon TCD :


Code:
    ActiveSheet.PivotTables("Tableau croisé dynamique1").ChangePivotCache _
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "('Feul1'!R[" & Deb & "]C1:R[" & Fin & "]C2)", Version:= _
        xlPivotTableVersion14)

je pense me rapprocher du but, mais quel cassage de cerveau !

Valou
 

Pièces jointes

  • Exemple-forum.xlsm
    44.1 KB · Affichages: 45
  • Exemple-forum.xlsm
    44.1 KB · Affichages: 53
  • Exemple-forum.xlsm
    44.1 KB · Affichages: 44

valou

XLDnaute Nouveau
Re : Tableau croisé dynamique : plage variable

Je me noie moi même de messages lol. J'ai bien avancé :

-Les variables fonctionnent.
-Manque seulement à coder la partie sur le TCD
 

Pièces jointes

  • Exemple-forum.xlsm
    44.1 KB · Affichages: 49
  • Exemple-forum.xlsm
    44.1 KB · Affichages: 58
  • Exemple-forum.xlsm
    44.1 KB · Affichages: 56

chris

XLDnaute Barbatruc
Re : Tableau croisé dynamique : plage variable

Bonjour
Coucou JCGL :), Pierrot :)

Faire des TCD sur des plage sans titres est un non sens.

Comme Pierrot je partirais sur un segment justement prévu pour cela... Comme lui, je trouve que tes données pleines de trous ne facilitent pas l'analyse précise...

Sinon, un peu sur le même principe que JCGL (dont j'ai repris l'exemple), tu peux ajouter une colonne avec une formule qui donne 1 ou 0 selon que la date est ou non comprise entre celles de D1 et D2.

Cette colonne placée en zone de filtre des TCD, avec un filtre sur 1, prendra juste les lignes concernées pour le TCD.

Tes variables sont erronées car tu as des lignes en février au delà de la ligne 606.
 

Pièces jointes

  • JC_Exemple-forum_Chris.xlsm
    52.6 KB · Affichages: 49

Pierrot93

XLDnaute Barbatruc
Re : Tableau croisé dynamique : plage variable

Bonjour à tous

toujours sur la même idée, à placer dans le module de la feuille, se déclenche sur modif des cellules D1 D2...
Code:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim s As SlicerItem, c As SlicerCache
If Intersect(Target, Range("D1:D2")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Application
    .ScreenUpdating = False
    .EnableEvents = False
    For Each c In ActiveWorkbook.SlicerCaches
        c.Delete
    Next c
    Set c = ThisWorkbook.SlicerCaches.Add(Me.PivotTables(1), "Date")
    c.Slicers.Add Me, , "Date", "Date", Range("C10").Top, Range("C10").Left, 130, 180
    For Each s In c.SlicerItems
        s.Selected = Not (CDate(s.Value) < Range("D1").Value Or CDate(s.Value) > Range("D2").Value)
    Next s
    c.Delete
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

bonne journée
@+
 

Discussions similaires

Réponses
1
Affichages
515

Statistiques des forums

Discussions
312 177
Messages
2 085 973
Membres
103 073
dernier inscrit
MSCHOE16