Tableau croisé dynamique avec colonnes variables Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
T
Tsubi
Jeune membre
Jeune membre
Messages : 33
Inscrit le : 14 mai 2014
Version d'Excel : 2013

Message par Tsubi » 24 février 2015, 08:58

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.
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 413
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 24 février 2015, 09:44

Bonjour,

Dans la mesure où tu demandes une réponse de principe ... c'est Oui ... :wink:

Ta macro doit simplement intégrer le fait de définir dynamiquement la plage qui servira de base de données à ton TCD ...
A+

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
T
Tsubi
Jeune membre
Jeune membre
Messages : 33
Inscrit le : 14 mai 2014
Version d'Excel : 2013

Message par Tsubi » 24 février 2015, 14:22

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.
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 413
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 24 février 2015, 14:32

Re,

Les colonnes se gèrent comme les lignes ...

Sans ta macro ... difficile de t'aider précisément ... :wink:

Peux-tu joindre ton fichier avec ta macro ...????
A+

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
T
Tsubi
Jeune membre
Jeune membre
Messages : 33
Inscrit le : 14 mai 2014
Version d'Excel : 2013

Message par Tsubi » 24 février 2015, 14:53

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
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 413
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 24 février 2015, 15:10

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

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
T
Tsubi
Jeune membre
Jeune membre
Messages : 33
Inscrit le : 14 mai 2014
Version d'Excel : 2013

Message par Tsubi » 24 février 2015, 15:31

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?
T
Tsubi
Jeune membre
Jeune membre
Messages : 33
Inscrit le : 14 mai 2014
Version d'Excel : 2013

Message par Tsubi » 24 février 2015, 16:38

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.
Avatar du membre
James007
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'007
Appréciations reçues : 413
Inscrit le : 30 août 2014
Version d'Excel : 2007 EN

Message par James007 » 24 février 2015, 17:15

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 ... :wink:
A+

:)

Quand on n’a qu’un marteau, tous les problèmes deviennent des clous…
T
Tsubi
Jeune membre
Jeune membre
Messages : 33
Inscrit le : 14 mai 2014
Version d'Excel : 2013

Message par Tsubi » 24 février 2015, 18:13

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
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message