XL 2013 TCD - Afficher valeur en colonne

rudymagny

XLDnaute Occasionnel
Bonjour à tous,
Avant de vous solliciter, j'ai cherché un peu sur le net et je n'ai pas trouvé de réponse ou plutôt je penses que je n'ai pas compris :-(

J'ai un TCD avec en colonne des champs...
Je voudrais que dans les cellules de ces colonnes soient affichées le contenu d'un autre paramètre de ma colonne ... Je ne suis pas clair donc je met un fichier en pj.

Merci d'avance pour l'aide que vous pourriez m'apporter.
 

Pièces jointes

  • exemple TCD.xlsx
    12.1 KB · Affichages: 55

Dranreb

XLDnaute Barbatruc
Bonjour.
Et s'il y avait plusieurs Dossiers Maille Site Tranche différents dans quel ordre les faudrait-il ?
Parce que là, avec une seule, sur 2 lignes 5 colonnes, validé par Ctrl+Maj+Entrée :
Code:
=TRANSPOSE(F$5:$G$9)
donne le résultat.
Sinon je ne sais pas faire les TCD mais pour VBA j'ai une Function Gigogne qui permet l'ordonner des données pour en sortir facilement tous les rapports souhaités.
 

Dranreb

XLDnaute Barbatruc
La fonction Gigogne sait classer et organiser les valeurs d'une plage dans une collection d'objets de type SsGr qui s'explorer par For Each Membre In Gigogne(LaPlage, 1, 2, 3 … )
Les membres en question pouvant eux mêmes être de type SsGr et donc s'explorer par For Each SousMembre In Membre.Co.
 

Pièces jointes

  • GigIdx.xlsm
    56.3 KB · Affichages: 55

Dugenou

XLDnaute Barbatruc
Bonjour,
je suis sidéré que tu ne manipules pas les TCD Bernard !
Alors pour le fun : un petit bricolage pour obtenir le résultat demandé.
Le TCD n'affiche que des données chiffres au croisement ligne/colonne : j'ajoute donc aux données une colonne avec une valeur chiffrée, j'affiche cette valeur dans le TCD et avec un format exotique je remets soldé ou en cours.
Ne fonctionne que si :
  • on n'a pas deux valeurs différentes pour la même ligne
  • on n'a que 2 valeurs possible (3 au max avec le 0)
  • on ne fait pas de calcul ensuite car le mot affiché est un format et pas une valeur
Cordialement
 

Pièces jointes

  • rudymagny.xlsx
    12.8 KB · Affichages: 73

Dranreb

XLDnaute Barbatruc
Bonjour Dugenou.
Je ne veux pas m'y intéresser pour des tas de raisons.

Cette procédure Essai produit le rapport voulu :
VB:
Option Explicit

Sub Essai()
Dim DicTit As Dictionary, L As Long, C As Long, TRés(1 To 500, 1 To 12), _
   Doss As SsGr, Maille As SsGr, Site As SsGr, Tranche As SsGr, Détail
Set DicTit = GigIdx.DicInvent(Feuil1.[A5:G9], 6, 6)
L = 1
For C = 1 To 6: TRés(L, C) = Choose(C, "Étiquette de ligne", "Maille", "Site", "Tranche", "Titre DA"): Next C
VerserTitres TRés, DicTit
For Each Doss In GigIdx.Gigogne(Null, 1, 2, 3, 4)
   For Each Maille In Doss.Co
      For Each Site In Maille.Co
         For Each Tranche In Site.Co
            L = L + 1
            TRés(L, 1) = Doss.ID
            TRés(L, 2) = Maille.ID
            TRés(L, 3) = Site.ID
            TRés(L, 4) = Tranche.ID
            TRés(L, 5) = Tranche.Co(1)(5)
            For Each Détail In Tranche.Co
               TRés(L, DicTit(Détail(6))) = Détail(7)
               Next Détail, Tranche, Site, Maille, Doss
Feuil1.[A30].Resize(500, 12).Value = TRés
End Sub

Sub VerserTitres(T(), ByVal D As Dictionary)
Dim TK(), K As Long, DC As Long
TK = D.Keys: DC = D(TK(0))
For K = 0 To UBound(TK): T(1, K + DC) = TK(K): Next K
End Sub
Remarque: la Sub VerserTitres fera partie intégrante de la prochaine version de la fourniture GigIdx.
 

chris

XLDnaute Barbatruc
Bonjour
...
Ne fonctionne que si :
  • on n'a pas deux valeurs différentes pour la même ligne
  • on n'a que 2 valeurs possible (3 au max avec le 0)
  • on ne fait pas de calcul ensuite car le mot affiché est un format et pas une valeur
....
En combinant un format nombre sur le champ du TCD et une MFC on peut avoir 5 états différents et probablement plus en utilisant plusieurs MFC.

Mais cela ne lève pas la dernière contrainte qui est une valeur unique par essai dans l'élément de la hiérarchie.

De ce fait on est dans un pseudo TCD (un vrai TCD contient des stats) et la solution de Dranreb, dont j'ai pu voir la puissance sur d'autres fils (sans tout comprendre du code :oops:), est effectivement plus conforme à une simple redistribution de données textuelles.
 

Dugenou

XLDnaute Barbatruc
Re à tous,
Je ne doute pas une seconde de la puissance et de l'efficacité des outils proposés par Dranreb. Je suis simplement incapable de m'en servir je ne comprends même pas les explications,
organiser les valeurs d'une plage dans une collection d'objets de type SsGr qui s'explorer par For Each Membre In Gigogne(LaPlage, 1, 2, 3 … )
Les membres en question pouvant eux mêmes être de type SsGr et donc s'explorer par For Each SousMembre In Membre.Co.
alors le code ....

J'avais bien écrit "pour le fun" car en effet utiliser un TCD pour simplement réafficher des données texte c'est pas le top!
 

Dranreb

XLDnaute Barbatruc
Je serais vraiment très intéressé par une ébauche d'explication qui serait plus facile à comprendre par n'importe qui. Comment faudrait-il que j'explique ça ?

La présentation de la fonction dans l'aide GigIdx commence par :
Renvoie une collection d'éléments de type SsGr. Vous devrez donc déclarer des variables As SsGr pour l'explorer.
Ces éléments ont une propriété Id As Variant et une autre Co As Collection. Vous aurez à les utiliser aussi dans votre code.
Il suit plein d'explication détaillées, avec des modèles de structures algorithmiques.
Par quoi de plus clair pourrait-on remplacer ces explications ?
Y aurait-il déjà un écueil conceptuel, juste un bout de proposition, sur lequel tout le monde coince, et qui nécessiterait un préambule ou simplement une explication complémentaire ?
 
Dernière édition:

chris

XLDnaute Barbatruc
Dranreb

En ce moment c'est un peu l'apnée mais si tu es là en juillet et prêt à répondre à mes questions qui seront sans doute parfois horripilantes, cela m'intéresserait de creuser et comprendre ta gigogne et de tenter d'en formaliser les principes et le mode d'emploi pour des béotiens...
 

rudymagny

XLDnaute Occasionnel
Bonjour à tous et merci pour vos réponses et vos échanges ;-) Bon je vais essayer de comprendre ta fonction gigogne Dranreb ;-) et en parallèle je vais voir aussi la solution de Dugenou ;-) Je vous tient au courant et merci encore
 

rudymagny

XLDnaute Occasionnel
Dranreb, Je voudrais essayer ton bout de code ci dessous mais j'ai une erreur de compilation au niveau du Sub VerserTitres "Type défini par l'utilisateur non défini" :-(

J'ai bien installé la fonction Gigogne et je l'ai cochée dans les références...

Help.

Merci

Bonjour Dugenou.
Je ne veux pas m'y intéresser pour des tas de raisons.

Cette procédure Essai produit le rapport voulu :
VB:
Option Explicit

Sub Essai()
Dim DicTit As Dictionary, L As Long, C As Long, TRés(1 To 500, 1 To 12), _
   Doss As SsGr, Maille As SsGr, Site As SsGr, Tranche As SsGr, Détail
Set DicTit = GigIdx.DicInvent(Feuil1.[A5:G9], 6, 6)
L = 1
For C = 1 To 6: TRés(L, C) = Choose(C, "Étiquette de ligne", "Maille", "Site", "Tranche", "Titre DA"): Next C
VerserTitres TRés, DicTit
For Each Doss In GigIdx.Gigogne(Null, 1, 2, 3, 4)
   For Each Maille In Doss.Co
      For Each Site In Maille.Co
         For Each Tranche In Site.Co
            L = L + 1
            TRés(L, 1) = Doss.ID
            TRés(L, 2) = Maille.ID
            TRés(L, 3) = Site.ID
            TRés(L, 4) = Tranche.ID
            TRés(L, 5) = Tranche.Co(1)(5)
            For Each Détail In Tranche.Co
               TRés(L, DicTit(Détail(6))) = Détail(7)
               Next Détail, Tranche, Site, Maille, Doss
Feuil1.[A30].Resize(500, 12).Value = TRés
End Sub

Sub VerserTitres(T(), ByVal D As Dictionary)
Dim TK(), K As Long, DC As Long
TK = D.Keys: DC = D(TK(0))
For K = 0 To UBound(TK): T(1, K + DC) = TK(K): Next K
End Sub
Remarque: la Sub VerserTitres fera partie intégrante de la prochaine version de la fourniture GigIdx.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG