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 ...

Rechercher des sujets similaires à "tableau croise dynamique colonnes variables"