Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

Pièces jointes

  • GigogneMomo.xlsm
    79.3 KB · Affichages: 11
Dernière édition:

momo

XLDnaute Occasionnel
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
Bonjour
Effectivement, et c'est avec le fichier de votre avant dernier post que je m'en suis moi même rendu compte.

je propose une version avec quelques changements mineurs tenant compte de trois choses :
Elle est top, et le code se laisse comprendre. Merci vraiment. Vous êtes top

Merci
 

momo

XLDnaute Occasionnel
Bonjour Bernard

Je me permets de relancer le fil aussi tard, parce que bien qu'ayant essayé d'intégrer dans la macro fournie, de nouveaux éléments je n'y arrive toujours pas.

Et lorsque je gère par les formules avec le nombre ligne Excel met beaucoup de temps à s'exécuter.

Je viens demander votre assistance pour pouvoir intégrer ces nouveaux éléments.

Je joins le fichier qui montre un peu les attentes

Merci par avance

PS: les nouveaux éléments à intégrer sur la macro portent sur les colonnes V à Z
 

Pièces jointes

  • GigogneMomo_Projet.xlsm
    64.4 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Bonsoir.
Qu'avez vous essayé ou n'avez su comment faire ?
Déjà il est possible de spécifier une 3ième source à TableUnique par :
VB:
For Each Code In Gigogne(TableUnique(Feuil2.[A2:C2], Feuil3.[A2:C2], Feuil4.[A2:C2]), 1, Null, 2)
Il faudra tester If Détail(0) = 2 pour reconnaitre une ligne de cette source si vous la spécifiez en 3ème position comme dans mon exemple, ce qui n'est pas forcément le plus pratique, notamment si vous avez besoin de connaître les infos avant le détail des remboursements pour un code donné …
Ah mais il y a une 4ème source !? Et avec des colonne pas dans le même ordre. Pour remettre le code en position 1 comme les autres vous pouvez utiliser TabCols(Feuil5.[A2:C2], 2, 1, 3)
 
Dernière édition:

momo

XLDnaute Occasionnel
Qu'avez vous essayé ou n'avez su comment faire ?
J'ai justement essayé de faire ajouter une troisième et même une quatrième source en procédant exactement comme vous venez de le faire.. Mais j'avais pas su aller maintenant chercher les infos et les placer dans la colonne voulue dans l'onglet "Résultat"

Je vais essayer comme vous avez dit et observer le résultat

Par contre il y a également les colonnes ou j'intègre directement des formules, j'ai bien essayé via la macro du module 1 mais j'y suis pas arrivé non plus.
 

Dranreb

XLDnaute Barbatruc
Ça devrait commencer comme ça :
VB:
   Dim Arrêté As Date, TRés(), L As Long, Code As SsGr, Capital As Currency, _
      Rembour As Currency, Détail, LaDate As Date, Montant As Currency, Pctage As Double, NbJrAn As Double
   Arrêté = [C1].Value
   ReDim TRés(1 To 5000, 1 To 26)
   L = -1
   For Each Code In Gigogne(TableUnique(Feuil4.[A2:C2], _
      TabCols(Feuil5.[A2:C2], 2, 1, 3), Feuil2.[A2:C2], _
      Feuil3.[A2:C2]), 1, Null, 2)
      L = L + 1: Capital = 0: Rembour = 0
      For Each Détail In Code.Co
         Select Case Détail(0)
            Case 0: Pctage = Détail(3)
            Case 1: NbJrAn = Détail(3)
            Case 2:
            Case 3:
            End Select
 

momo

XLDnaute Occasionnel
Quand j'insère le bout de code au début de mon code et que je lance la macro j'ai un message d'erreur juste après le "End Select"
Code:
Sub Test()
    Dim Arrêté As Date, TRés(), L As Long, Code As SsGr, Capital As Currency, _
      Rembour As Currency, Détail, LaDate As Date, Montant As Currency, Pctage As Double, NbJrAn As Double
   Arrêté = [C1].Value
   ReDim TRés(1 To 5000, 1 To 26)
   L = -1
   For Each Code In Gigogne(TableUnique(Feuil4.[A2:C2], _
      TabCols(Feuil5.[A2:C2], 2, 1, 3), Feuil2.[A2:C2], _
      Feuil3.[A2:C2]), 1, Null, 2)
      L = L + 1: Capital = 0: Rembour = 0
      For Each Détail In Code.Co
         Select Case Détail(0)
            Case 0: Pctage = Détail(3)
            Case 1: NbJrAn = Détail(3)
            Case 2:
            Case 3:
            End Select
         LaDate = Détail(2)
         If LaDate > Arrêté Then
            If Détail(0) = 2 Then TRés(L, 10) = Arrêté: Exit For
         Else
            Montant = Détail(3)
            L = L + 1
            TRés(L, 1) = Code.Id
            TRés(L, 2) = Capital
            If Détail(0) = 0 Then
               TRés(L, 3) = LaDate
               TRés(L, 4) = Montant
               Capital = Capital + Montant
            Else
               TRés(L, 5) = LaDate
               TRés(L, 6) = Montant
               Montant = Montant + Rembour: Rembour = 0
               If Montant > Capital Then
                  Rembour = Montant - Capital
                  Montant = Capital
                  End If
               Capital = Capital - Montant
               TRés(L, 7) = Montant
               End If
            TRés(L, 8) = Capital
            TRés(L, 9) = Rembour
            End If
         Next Détail
      Next Code
   [L16].Resize(5000, 10).Value = TRés
   End Sub
 

Dranreb

XLDnaute Barbatruc
Les Case 2 et 3 sont à compléter des opérations à faire d'après les données venant des Worksheet Feuil2 et Feuil3. On ne peut plus se permettre de mettre derrière un code à peu près valable pour toutes les feuilles sources car ça devient trop complexe. Il n'y a pas de montant notamment dans les Feuil4 et Feuil5. Si vous vous rendez compte après qu'il y a beaucoup de points communs dans les traitement des Feuil2 et Feuil3 vous pourrez toujours le regrouper en un seul Case 2, 3:
 

momo

XLDnaute Occasionnel
Les Case 2 et 3 sont à compléter des opérations à faire d'après les données venant des Worksheet Feuil2 et Feuil3.
Veuillez vraiment m'excuser, mais bon ca me semble un peu flou. A la base le code originel marchait très bien . je voulais completer des informations après pour éviter de faire de formules Excel qui alourdissent le fichier pdt le traitement.

On ne peut plus se permettre de mettre derrière un code à peu près valable pour toutes les feuilles sources car ça devient trop complexe.
Je suis totalement d'accord sur ceci. Mais je pensais que le case 0 et le Case 1 ont déjà géré les onglets %age et durée.
Si vous vous rendez compte après qu'il y a beaucoup de points communs dans les traitement des Feuil2 et Feuil3 vous pourrez toujours le regrouper en un seul Case 2, 3:
Ca je vous avoue que ce serait bien si le résultat final demeurait le même. . Mais bon si ca complique tout, la seule colonne que j'aurais voulu gérer via code c'est la Z test 2 dont la formule fait beaucoup ramer le PC. Mais elle ne va chercher les infos sur aucune autre feuille. Elle fait les calculs directement sur la feuille résultat exactement comme pour les colonnes M et S
 

Dranreb

XLDnaute Barbatruc
Je pense que vous pouvez calculer les valeurs. D'ailleurs les formules ne fonctionnent pas dans ma version d'Excel.
Il n'y a pas besoin de filtrer: vous avez sous la main directement tout ce qui concerne chaque Code ensemble.
Si nécessaire vous pouvez très bien explorer plusieurs fois la collection Co de chaque Code.
Une première fois pour faire des calculs préalables portant sur tous, une seconde fois pour avancer dans le TRés.
 
Dernière édition:

momo

XLDnaute Occasionnel
En reprenant le code de cette façon et précisnat un peu les choses toutes mes colonnes ont été décalées, et les données des nouveaux onglets n'ont pas été pris en compte non plus

Qu'est ce qui peut clocher sur ce code

VB:
im Arrêté As Date, TRés(), L As Long, Code As SsGr, Capital As Currency, _
      Rembour As Currency, Détail, LaDate As Date, Montant As Currency, Pctage As Double, NbJrAn As Double
   Arrêté = [C1].Value
   ReDim TRés(1 To 5000, 1 To 26)
   L = -1
   For Each Code In Gigogne(TableUnique(Feuil4.[A2:C2], _
      TabCols(Feuil5.[A2:C2], 2, 1, 3), Feuil2.[A2:C2], _
      Feuil3.[A2:C2]), 1, Null, 2)
      L = L + 1: Capital = 0: Rembour = 0
      For Each Détail In Code.Co
         Select Case Détail(0)
            Case 0: Pctage = Détail(3)
            Case 1: NbJrAn = Détail(3)
            Case 2, 3: Montant = Détail(3)
            Case 2, 3: LaDate = Détail(2)
            End Select
 

Dranreb

XLDnaute Barbatruc
Vraiment, laissez séparés les traitements Case 2 et Case 3, ça vaudra mieux.
Surtout qu'il y avait un test If Détail(0) = 0 qui n'est surement plus bon puisque ça signifie désormais: si les donnée viennent de Feuil4 et non plus de Feuil2.
Tant pis, mettez deux fois la séquence L = L + 1: TRés(L, 1) = Code.Id: TRés(L, 2) = Capital puisque ce n'est qu'après que ça diffère entre la source 2 et la 3.
Et puis ça sera plus clair pour vous si ça reste séparé.
Manifestement comme c'était écrit vous n'aviez rien compris au fonctionnement.
Qu'est ce que vous attendez pour garnir aussi les TRés(L, 11) à TRés(L, 15) ?
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…