Tableau croisé dynamique avec colonnes variables
Bonjour à tous,
Comme indiqué dans le titre je souhaiterai faire un TCD avec une plage variable.
Actuellement j'ai une macro qui après plusieurs action différentes arrive à un code qui me permet vis à vis du besoin de l'utilisateur d'ajouter ou non des données suite à l'utilisation d'un userform et de cases à cocher. Ces données se mettront dans les colonnes K,L ou M.
De base les informations sont réparties comme suit:
"TOTO" colonne K
"RIRI" colonne L
"Loulou" colonne M
Si l'utilisateur n'a pas coché les cases pour TOTO et RIRI, les colonnes "vides" sont supprimés pour que Loulou soit en M. C'était plus simple que de faire des if avec des conditions. Mais peut être pas la plus simple.
Juste après cette action, j'ai besoin de faire un TCD mais comme vous l'aurez compris, je peux avoir 0 à 3 colonnes supplémentaires dans mon fichier.
Les colonnes sélectionnées pour ce TCD sera de base G à J. Et vis à vis de l'action précédemment évoqué pourra être G à K, G à L ou G à M.
Est ce qu'il est possible de réalisé un TCD en vba avec cette problématique? si oui, comment?
S'il y a besoin d'un complément d'information, je peux les données.
D'avance merci.
Bonjour,
Dans la mesure où tu demandes une réponse de principe ... c'est Oui ...
Ta macro doit simplement intégrer le fait de définir dynamiquement la plage qui servira de base de données à ton TCD ...
Merci pour cette premiere réponse.
Mais je demandais "comment". Et j'avoue que c'était la partie clé de ma question.
J'arrive à gérer une partie variable en nombre de ligne, mais je ne sais pas comment gérer cette partie variable en terme de colonnes.
Comme tu le dis: comment définir cette partie dynamique de la plage.
Re,
Les colonnes se gèrent comme les lignes ...
Sans ta macro ... difficile de t'aider précisément ...
Peux-tu joindre ton fichier avec ta macro ...????
Malheureusement c'est un fichier pro donc je peux pas vraiment l'envoyer.
Je vais copier la partie de la macro sur laquelle je bloque. Enfin, la je suis arrivé à l'entourloupé.
Meme si j'ai des colonnes vides suites au choix fais dans l'user form, j'ai quand même le nom de la colonne: "Toto", "Riri" et "Loulou"
Donc au final mon tableau prend une plage fixe: H à M. Et ensuite je cache les colonnes vides.
Set SRef = Sheets("Données Article")
k = SRef.Range("A" & Rows.Count).End(xlUp).Row - 1
Sheets.Add after:=Sheets("Données Article")
ActiveSheet.Name = "Resultats"
SRef.Select
SRef.Columns("C:C").Select
Selection.Copy
SRef.Columns("J:J").Select
ActiveSheet.Paste
SRef.Select
SRef.Range("H1:M" & k).Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Données Article!R1C8:R[" & k & "]C13", Version:=xlPivotTableVersion12). _
CreatePivotTable TableDestination:="Resultats!R1C1", TableName:= _
"Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion12
Sheets("Resultats").Select
Cells(1, 1).Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"machine utilisée")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("toto")
.Orientation = xlRowField
.Position = 2
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("riri")
.Orientation = xlRowField
.Position = 3
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("loulou")
.Orientation = xlRowField
.Position = 4
End With
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields( _
"Nombre d'article utilisés"), "Somme de Nombre d'article utilisés", xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields( _
"Nombre de pièces fabriquées"), "Somme de Nombre de pièces fabriquées", xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("machine utilisée"). _
Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
False, False)
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("toto"). _
Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
False, False)
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("riri"). _
Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
False, False)
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("toto"). _
Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
False, False)
ActiveSheet.PivotTables("Tableau croisé dynamique1").RowAxisLayout xlTabularRow
If SRef.Range("K2") = "" Then
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("toto"). _
Orientation = xlHidden
End If
If SRef.Range("L2") = "" Then
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("riri"). _
Orientation = xlHidden
End If
If SRef.Range("M2") = "" Then
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("loulou"). _
Orientation = xlHidden
End If
Re,
Ton TCD utilise comme source :
SourceData:= _
"Données Article!R1C8:R[" & k & "]C13"
Donc... si tu en as besoin, ton code doit venir faire des ajustements sur cette instruction ...pour définir la plage dont tu as besoin ...
Oui mais après, j'ai mes différents nom de colonnes qui vont rentrer dans mon tableau?
exemple:
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"loulou")
.Orientation = xlRowField
.Position = 4
Si il y a des colonnes qui sont présentes ou non, la position n'est pas forcément la même. Et le pivotsfields("") je peux le définir via un range(dernierecolonne & "1").value?
Je suis arrivé à faire ca:
SRef.Select
SRef.Range("H1:" & lastone).Select
Set maplage = SRef.Range("H1:" & lastone)
vala = SRef.Cells(1, d - 2).Value
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
Selection, Version:=xlPivotTableVersion12). _
CreatePivotTable TableDestination:="Resultats!R1C1", TableName:= _
"Tableau croisé dynamique2", DefaultVersion:=xlPivotTableVersion12
Sheets("Resultats").Select
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
vala)
.Orientation = xlRowField
.Position = 1
End With
Qui me permet d'avoir une plage de selection variable.
J'arrive à nommer un pivotfield via une variable
Mais c'est facile quand on a qu'une donnée fixe à mettre.
Ce que je ne sais pas c'est si j'ai 1 à 3 colonnes supplémentaires à mette donc en position 2 à 4.
Re,
Félicitations pour ce que tu as déjà réalisé ...
J'ai l'impression que, ce qui pourrait t'aider, serait de dresser la liste complète de tous les cas possibles ... avec l'objectif de construire un Select Case ... qui puisse te donner toute la souplesse dont tu as besoin ...
Au final j'ai fait autrement, une solution toute bete: un bon vieux "if"
Et ca marche que je le souhaite, y a peut etre une solution plus "légère" mais celle la marche pour l'instant.
SRef.Select
SRef.Range("H1:" & lastone).Select
Set maplage = SRef.Range("H1:" & lastone)
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
Selection, Version:=xlPivotTableVersion12). _
CreatePivotTable TableDestination:="Resultats!R1C1", TableName:= _
"Tableau croisé dynamique2", DefaultVersion:=xlPivotTableVersion12
Sheets("Resultats").Select
val1 = SRef.Range("H1").Value
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
val1)
.Orientation = xlRowField
.Position = 1
End With
For j = 11 To d
val2 = SRef.Cells(1, j).Value
If SRef.Cells(1, j) <> "" Then
With ActiveSheet.PivotTables("Tableau croisé dynamique2").PivotFields( _
val2)
.Orientation = xlRowField
.Position = 2 + j - 11
End With
End If
Next
Bonjour,
Content que tu aies trouvé la solution ...