Tableau Croisé Dynamique - Affichage spécifique

Bonjour,

J'ai un onglet d'input où je saisies des quantités par année sur une ligne. Et je voudrais les afficher en output en colonne.

Mes inputs sont dans un Tableau, donc je voulais créer le lien pour une actualisation en exportant le premier tableau en tableau croisé dynamique sur un autre onglet.

Malheureusement je n'arrive pas à transformer mon tableau en ligne dans un tableau où les dates sont en lignes et le résultat sur chacune de ses lignes. Je ne sais même pas si c'est réellement possible dans un tableau croisé dynamique.

Comme je suppose que ma demande est pas clair j'ai fait un fichier qui démontre mon problème:

8demonstration.xlsx (27.00 Ko)

Bonjour,

Es-tu sur mac ou win ?

As-tu accès à PowerQuery ?

Salut !

Je suis Windows 10, j'ai jamais utiliser PowerQuery mais je dois y avoir accès oui. Quel est ton idée ?

Car en cherchant une solution j'ai réussi quelque chose mais qui n'est pas pratique à l'utilisation, sans compter le temps d'exécution qui est long même pour un petit tableau.

Je passe par un tableau intermédiaire qui répète les informations du input, mais je passe par le VBA qui fait ralentir et supprime la vrai liaison entre le premier tableau et le dernier.

3demonstration.xlsb (49.52 Ko)

Je suis à l'écoute de toutes suggestions.

Merci d'avance.

D'autres pourront te guider mieux que moi avec PowerQuery.

Ce que j'allais te proposer est en effet une mise en forme différente comme tu l'as fait, mais avec une célérité bien supérieure en passant par un array. Je vais partir de ta macro et le faire.

Après j'ai regardé PowerQuery pour faire le lien entre le tableau de l'onglet Input et mon tableau intermédiaire cela peut être une solution très adapté et rapide.

Malheureusement je ne connais pas assez bien cela pour crée une nouvelle colonne "Année" et "QTY" qui prend le header et la valeur à la ligne désirée, je vais me pencher la dessus à partir d'une requête et de la table.

Merci beaucoup de ton aide en tout cas.

Ton tableau intermédiaire sera instantané, tout est transféré dans un array appelé result

Option Explicit

Sub Creation_Tableau()

Dim tbl As ListObject
Set tbl = Sheets("Tableau intermédiaire").ListObjects(1)
If Not tbl.DataBodyRange Is Nothing Then tbl.DataBodyRange.Delete

Dim result(), n As Long, i, j, k
n = 0
With Sheets("input").ListObjects(1)
    For i = 1 To .ListRows.Count
        n = n + 1
        ReDim Preserve result(1 To 7, 1 To n)
        For j = 1 To 5
            result(j, n) = .DataBodyRange(i, j)
        Next
        j = 6
            result(6, n) = .DataBodyRange(0, j)
            result(7, n) = .DataBodyRange(i, j)
        For j = 7 To 16
            n = n + 1
            ReDim Preserve result(1 To 7, 1 To n)
            For k = 1 To 5
                result(k, n) = result(k, n - 1)
            Next
            result(6, n) = .DataBodyRange(0, j)
            result(7, n) = .DataBodyRange(i, j)
        Next
    Next
End With

Sheets("Tableau intermédiaire").Cells(2, 1).Resize(UBound(result, 2), UBound(result)) = Application.Transpose(result)

End Sub

Explication : result, c'est comme la page sauf qu'il est inversé car le redimensionnement d'un tableau ne peut se faire que sur la dernière dimension, donc ici la "colonne" de result sert donc de "ligne"

En final on transpose pour intervertir "lignes" et "colonnes" de result que l'on colle dans la page.

On peut encore accélérer le traitement en englobant le tableau input dans un array data

Et rendre le tout transparent en masquant la feuille intermédiaire et en déclenchant sa mise à jour à l'activation de la feuille TCD

4demonstration.xlsm (39.17 Ko)

Je vais tester cela mais merciiii ! Trop bien donc plus qu'à ajouter dans la macro l'actualisation du tableau croisé dynamique comme cela en 1 bouton on a le résultat dans le tableau croisé dynamique.

C'est instantané même dans les énormes tableaux ? Car dans mon vrai fichier j'ai environ 160 lignes pour 40 années et je m'inquiète un peu.

Sinon j'ai tester avec Power Query, j'ai réussi à faire la même chose sauf que j'ai plusieurs problèmes :

- l'utilisateur est obligé de faire 2 fois Actualiser tout pour que cela marche

- Impossible de faire cette actualisation par le VBA

- Et le lien dans Power Query est écrit en dure et j'arrive pas à mettre le path du workbook de façon dynamique. Donc si on bouge de répertoire cela ne marche plus.

image
4demonstration.xlsb (50.13 Ko)

Merci de ton aide en tout cas je vais comparer les deux solutions pour prendre la meilleure. Je ferme pas le sujet au cas où quelqu'un connaissant Power Query passe par là pour m'aider.

Je vais tester cela mais merciiii ! Trop bien donc plus qu'à ajouter dans la macro l'actualisation du tableau croisé dynamique comme cela en 1 bouton on a le résultat dans le tableau croisé dynamique.

et c'est même fait sans bouton dans le dernier fichier envoyé !

Pour PowerQuery, tu sembles déjà plus avancé que moi. N'hésite pas à refaire un topic avec cette question spécifique en mettant PowerQuery en titre, tu auras des super spécialistes !

Je te remercie pour tout je vais essayer de comprendre ta fonction avec le

ReDim Preserve result(1 To 7, 1 To n) 

que je connais pas. Mais je devrais me débrouiller afin de l'adapter dans mon véritable tableau plus grand avec beaucoup plus de données.

Merci de ta rapidité. Je clos le topic et j'en crée un autre pour le Power Query afin de comparer les deux ensuite.

Bonne continuation et peut être à la prochaine.

PS : je connaissais même pas la possibilité de le faire avec Power Query ce midi c'est vraiment très intuitif donc vu tes compétences si tu voulais tu pourrais très vite l'apprendre ;)

Edit:

Petite question juste un tableau en VBA donc result dans notre exemple s'ajoute des colonnes de façon dynamique, dans mon exemple il n'y avait que 17 noms/prénoms et 11 années ce qui donne 186 colonnes à la fin ; si le nombre augmente est-ce qu'il y a un risque de dépasser le nombre de colonne maximal supporté ?

Exemple : 160 noms avec 20 dates donc 3 200 colonnes enregistrées dans notre variable result avant de le coller en transposé dans "Tableau Intermédiaire" ?

Rechercher des sujets similaires à "tableau croise dynamique affichage specifique"