Ventilation avec 2 colonnes via TCD

Guy_M

XLDnaute Occasionnel
Bonjour,

Je ne sais pas si le titre est adéquat.

J'ai un tableau (voir exemple) qui pour chaque nom contient 2 fois une colonne année et montant (une fois pour le début, une fois pour la fin). Nom peut apparaître plusieurs fois et pour chaque ligne année début <= année fin.

Je voudrait produire avec un TCD un tableau qui pour chacun des noms fait la somme des montants par année (montant début de l'année + montant fin de l'année).

Pour que ce soit plus clair, je vous joints un fichier avec les données source, un TCD qui ne me satisfait pas ((ça marche très bien avec une paire montant/année mais pas avec 2) et un tableau bourré de somme.si.ens qui montre le résultat que je cherche à obtenir mais qui n'est pas assez dynamique à mon goût : il m’oblige à gérer manuellement les noms.

L'intérêt d'une TCD est que l'on peut facilement manipuler le résultat, par exemple trier sur n'importe quelle colonne.

En espérant que cela vous inspirera, par avance, je vous remercie de vos réponses.
 

Pièces jointes

  • Ventilation 2 colonnes.xlsx
    15.5 KB · Affichages: 57

chris

XLDnaute Barbatruc
Bonjour
Coucou Dranreb :)

Tu as parfaitement produit le tableau demandé.

Cependant il y a quelque chose qui m'interpelle dans la logique de ce tableau qui m'avait retenue de répondre.

Si Caca (pour reprendre les appellations de Guy_M) a 2 euros au début en 2014 et 8 euros à la fin en 2018, pourquoi on omet ces sommes (lesquelles au demeurant ?) en 2015, 2016 et 2018 ?
 

Dranreb

XLDnaute Barbatruc
Bonjour chris
A moi aussi la présence d'une date de début et d'une date de fin m'a tout d'abord induit l'idée d'un reconduction chaque année. Mais les explications n'en parlaient pas et le calcul effectué tel qu'expliqué correspondait au modèle donné.

Y a t'il moyen de reproduire ça avec le monstre bien caché (le mien au moins se montre) à savoir les TCD ?
 

chris

XLDnaute Barbatruc
Re
...
Y a t'il moyen de reproduire ça avec le monstre bien caché (le mien au moins se montre) à savoir les TCD ?

Pas avec la source en l'état : les TCD ne fonctionnent très bien que sur une source type BD.
Il faudrait donc Nom, année, somme avec 2 lignes pour remplacer une ligne actuelle.

Mais s'il fallait intégrer une notion de durée, de 2014 à 2018 par exemple, pour une même somme, il faudrait 5 lignes et dans ce cas prévoir une source avec Nom, année début, année fin, somme et une requête pour croiser avec un calendrier générant autant de lignes que d'années concernées.
Et là, la somme changeante, je ne saurai quoi en faire comme indiqué dans mon post précédent...
 

Guy_M

XLDnaute Occasionnel
Bonjour,
Merci DranReb et chris de vous être penché sur mon problème.

Malheureusement, la solution proposée par DranReb ne marchait pas : si j'ajoute une ligne à la source, j'ai une erreur "l'indice n'appartient pas à la sélection." dans Worksheet_Change, normal "Détail(3)" est vide.
Je me suis permis une petite modification :
VB:
      If Not IsEmpty(Détail(3)) Then C = Détail(3) - AnDéb + 2: TRés(L, C) = TRés(L, C) + Détail(2)
      If Not IsEmpty(Détail(5)) Then C = Détail(5) - AnDéb + 2: TRés(L, C) = TRés(L, C) + Détail(4)
(la compilation a bloqué sur PlgUti dans TabCols)
Ça marche, je suis impressionné ! J'ai compris dans les grandes lignes le fonctionnement reste à comprendre les détails pour mettre en œuvre (je l'utiliserais avec un tableau de destination qui ne sera pas dans la même feuille que la source).

Je vous prie de m'excuser pour la confusion qu'a pu provoquer "Année début" et "Année fin", il n'y a pas de continuité entre les années.

Un peu déçu que cela ne soit pas possible avec un TCD. Il est difficile de changer la source car le tableau sur lequel je travaille contient d'autres données et une transformation en BD le rendrait illisible (a moins d'avoir une feuille qui me reconstruise l'ensemble.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Boujour.
Bien vu la correction.
Désolé d'avoir oublié de conditionner la compilation à PlgUtiInstallé dans TabCols comme je l'ai fait dans GroupOrg.
C'est la conséquence d'une évolution en cours visant à faire disparaître un module séparé contenant les fonctions PlgUti et ColUti pourtant bien pratiques mais que les demandeurs ne paraissent pas enclins à utiliser pour d'autres choses.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
En fait pour les prochaines demandes, dans ma source (OutIdx.xlsm) je supprime dans les procédures le conditionnement, mais j'ajoute à la fin du module MClassement:
VB:
#If PlgUtiInstallé = 0 Then
Private Function PlgUti(ByVal PlageDép As Range, Optional ByVal PlagExam As Range = Nothing, _
  Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Dim LMax As Long, CMax As Long, NbL As Long, NbC As Long
On Error GoTo RienTrouvé
If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
LMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
CMax = PlagExam.Find("*", PlagExam.Cells(1, 1), xlValues, xlWhole, xlByColumns, xlPrevious).Column
On Error GoTo 0
NbL = LMax - PlageDép.Row + 1: If NbL < LMin Then NbL = LMin
NbC = CMax - PlageDép.Column + 1: If NbC < CMin Then NbC = CMin
If NbL < 1 Or NbC < 1 Then GoTo CEstToutVide
Set PlgUti = PlageDép.Resize(NbL, NbC)
Exit Function
RienTrouvé: Resume CEstToutVide
CEstToutVide: Set PlgUti = Nothing
End Function
Private Function ColUti(ByVal PlageDép As Range, Optional ByVal LMin As Long, Optional ByVal CMin As Long) As Range
Set ColUti = PlgUti(PlageDép, Intersect(PlageDép.Worksheet.UsedRange, PlageDép.EntireColumn), LMin, CMin)
End Function
#End If
 

Discussions similaires

Réponses
1
Affichages
259