Microsoft 365 Remplir un tableau à l'aide d'onglets source

momo

XLDnaute Occasionnel
Bonjour à tous

Je voudrais remplir un tableau automatiquement (Via VBA ou via Formules) à l'aide d'informations recueillies à partir de deux onglets du fichier .

je voudrais que vous m'aidiez à obtenir le résultat tel que décrit sur l'onglet résultat

Je joins une feuille descriptive du résultat attendu .

Merci d'avance pour toutes les propositions à recevoir
 

Pièces jointes

  • Remplir un tableau à l'aide d'onglets source.xlsx
    17.7 KB · Affichages: 20
Solution
Bonjour.
Ayant maintenant compris que les écarts avec votre exemple venaient de seulement de ce que ce dernier n'était pas parfaitement conforme à ce qu'il aurait fallu, je propose une version avec quelques changements mineurs tenant compte de trois choses :
1 — Cette façon de calculer la colonne Montant Initial reçu revient en fait à y reproduire le Capital initial avant recalcul de la ligne. Alors si c'est bien ça, autant y mettre simplement ça.
2 — Bien que des apports postérieurs à la date d'arrêté ne seraient toujours plus reproduits non plus, seul un remboursement postérieur provoquerait l'apposition de cette date à la fin.
3 — Le remboursement restant peu être appliqué partiellement jusqu'à hauteur du capital.

Dranreb

XLDnaute Barbatruc
Bonjour.
Écoutez le coté le plus compliqué pour moi n'est peut être pas le même que pour vous.
Alors je le joins pas du tout fini est espérant que vous pourrez continuer la programmation, si ce que j'ai mis règle déjà le plus compliqué pour vous ;)
 

Pièces jointes

  • GigogneMomo.xlsm
    67.7 KB · Affichages: 8

momo

XLDnaute Occasionnel
Est ce normal que les remboursements dépassent les

En réalité, le Montant initial global peut s'encaisser par petit bout (Ca reste un choix). Par contre le remboursement se fait en fonction du montant global quelque soit le niveau d'encaisse deja effectué. C'est pourquoi lorsque le remboursement est supérieur au montant initial, on le limite au montant initial quitte a compenser lors de la prochaine échéance
 

Dranreb

XLDnaute Barbatruc
Qu'est ce qui vous manque pour reprendre la procédure ?
Ce n'est pas très compliqué : La fonction TableUnique met bout à bout les deux tableaux en ajoutant devant une colonne 0 valant 0 pour les données venant du 1er tableau et 1 pour celles venant du second.
La fonction Gigogne renvoie tout ça classé sur les colonnes 1 et 2 (après la 0 identifiant la source) et regroupé mais seulement sur la 1, en une collection d'éléments SsGr (voir le module de classe de ce nom, il y a juste 2 propriétés: Id et Co et quelques méthodes qui ne sont pas utilisées ici
Chaque Code.Id contient le code, chaque Code.Co contient la collection des lignes attachées à ce code, exploré par un For Each Détail In Code.Co.
Détail et un variant contenant un tableau des valeur de la lignes en plus du Détail(0) qui indique la source.
Est-ce plus clair ?
 

momo

XLDnaute Occasionnel
Qu'est ce qui vous manque pour reprendre la procédure ?
Ce n'est pas très compliqué : La fonction TableUnique met bout à bout les deux tableaux en ajoutant devant une colonne 0 valant 0 pour les données venant du 1er tableau et 1 pour celles venant du second.
La fonction Gigogne renvoie tout ça classé sur les colonnes 1 et 2 (après la 0 identifiant la source) et regroupé mais seulement sur la 1, en une collection d'éléments SsGr (voir le module de classe de ce nom, il y a juste 2 propriétés: Id et Co et quelques méthodes qui ne sont pas utilisées ici
Chaque Code.Id contient le code, chaque Code.Co contient la collection des lignes attachées à ce code, exploré par un For Each Détail In Code.Co.
Détail et un variant contenant un tableau des valeur de la lignes en plus du Détail(0) qui indique la source.
Est-ce plus clair ?
Oui c'est beaucoup plus clair

Merci vraiment
 

momo

XLDnaute Occasionnel
Bonjour Dranreb
J'ai essayé de continuer le code mais il en fonctionne pas sur certaines lignes,

J'insère le code que j'ai modifié. Il me semble que lorsque les colonnes sont vides, les formules ne marchent pas.
Code:
Option Explicit

Sub test()
Dim Arrêté As Date, TRés(), Code As SsGr, LaDate As Date, Montant As Currency, MtRçPréc As Currency, Détail, L&
Arrêté = [B1].Value
ReDim TRés(1 To 5000, 1 To 10)
L = -1
For Each Code In Gigogne(TableUnique(Feuil2.[A2:C2], Feuil3.[A2:C2]), 1, Null, 2)
   L = L + 1: MtRçPréc = 0
   For Each Détail In Code.Co
      LaDate = Détail(2)
      Montant = Détail(3)
      If LaDate > Arrêté Then Exit For
      L = L + 1
      TRés(L, 1) = Code.Id
      TRés(L, 2) = MtRçPréc
      If Détail(0) = 0 Then
         TRés(L, 3) = LaDate
         TRés(L, 4) = Montant
         MtRçPréc = MtRçPréc + Montant
      Else
         TRés(L, 5) = LaDate
         TRés(L, 6) = Montant
         TRés(L, 7) = IIf(TRés(L, 6) > TRés(L, 2), TRés(L, 2), TRés(L, 6))
         TRés(L, 8) = TRés(L, 2) + TRés(L, 4) - TRés(L, 7)
         TRés(L, 9) = TRés(L, 6) - TRés(L, 7) + TRés(L - 1, 8)
         TRés(L, 10) = IIf(TRés(L, 5) > Arrêté, Arrêté, "")
         MtRçPréc = MtRçPréc - Montant
         End If: Next Détail, Code
[L16].Resize(5000, 10).Value = TRés
End Sub
 

Dranreb

XLDnaute Barbatruc
Je ne comprends pas ce que vous voulez dire.
Il n'y a pas de cellule vide dans les données tandis que les postes d'une nouvelle ligne TRés(L, …) après L = L + 1 le sont toujours d'abord.
Reprenez de préférence la variable de départ quand elle existe comme Montant plutôt que Trés(L, 6).
Par exemple
VB:
TRés(L, 7) = IIf(Montant > MtRçPréc, MtRçPréc, Montant)
Me parait plus clair que
TRés(L, 7) = IIf(TRés(L, 6) > TRés(L, 2), TRés(L, 2), TRés(L, 6))
Vous pouvez aussi utiliser des variables différentes pour le montant de la source 0 et pour celui de l'autre.
La date d'arrêté ne peut pas être inscrite sur la dernière ligne car la condition ne peut être vraie à cause du If LaDate > Arrêté Then Exit For au début. Si vous voulez la mettre systématiquement le mieux c'est de changer la fin comme ça :
VB:
         MtRçPréc = MtRçPréc - Montant
         End If: Next Détail
      TRés(L, 10) = Arrêté
      Next Code
[L16].Resize(5000, 10).Value = TRés
End Sub
Mais alors, c'était juste ma façon de calculer ce MtRçPréc ? Pourtant à part pour le Code 001 je ne trouvai pas la même chose que dans votre exemple. C'est aussi en partie à cause de ça que j'ai laissé tomber en pensant que vous sauriez ce que vous voulez mieux que je ne saurais le comprendre.

Il me semble aussi vaguement que les TRés(L, 8) et TRés(L, 9) ne devrait pas être renseignés seulement quand Détail(0) = 1 mais dans tout les cas, à la fin, à partir de variables MtCapital et MtRembou, tous deux déclarés As Currency, dont vous réviseriez seulement les valeurs selon le Détail(0), car ils me paraissent procéder un peu de cumuls et d'un suivi tout au long des lignes qui se présentent.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 118
Messages
2 116 418
Membres
112 744
dernier inscrit
pat38070