Compiler deux tableaux

goloom92

XLDnaute Nouveau
Bonsoir tout le monde,

Je cherche a compiler en VBA (pas en TCD) deux tableaux présents sur deux fichiers séparés.

Le classeur A contient en colonne A des rubriques et en colonne B des montants pour l'année en cours.

Le classeur B et formaté exactement de la même façon mais il concerne l'année précédente.

Ces classeurs peuvent inclure jusqu'à 50 000 lignes chacun voir plus.

A noter que des rubriques peuvent être présentes en N et pas en N-1 et inversement.

Je cherche à compiler les deux tableaux de la façon suivante et réaliser des totaux pour chacune des rubriques.

Rubriques / Montant N / Montant N-1

Travaux / 10 000 € / 0
Voiture / 1 000€ / 500€
...

Pouvez vous m'aider à créer ce code ?

Un énorme merci d'avance,
 

Boo2bafoot

XLDnaute Nouveau
Salut goloom92,

A première vue, j'aurais tendance à identifier les rubriques identiques de tes classeurs et créer une macro avec ces étapes :

1- Ouverture du fichier 1 puis création d'une variable Fichier1 = ActiveWorkbook.name
2-Ouverture du fichier 2 puis création d'une seconde variable Fichier2=ActiveWorkbook.name

Ajout de colonnes dans tes fichiers qui te permettent de les harmoniser (notamment en raison des rubriques - probablement des colonnes - qui diffèrent) en jonglant entre les 2 fichiers avec l'instruction Windows(Fichier1 ou 2).activate

3-Sélection de tes tableaux et copier-coller soit, selon ce que tu cherches dans un nouveau fichier ou sur l'un des 2.

C'est jouable également via PowerQuery sans VBA.
Si tu galères, n'hésite pas à me faire passer tes fichiers (sans nécessairement les 50 000 lignes de chaque....)
 

goloom92

XLDnaute Nouveau
Bonsoir Boo2bafoot, Bonsoir Gosselien,

Excusez moi pour le retard de ma réponse mais je n'étais malheureusement pas très disponible cette semaine.

Merci pour vos réponses, effectivement je peux réaliser ce travail via TCD mais j'aimerai éviter d'utiliser cette fonction car je souhaiterai fonctionner qu'avec des codes VBA. En fait je ne sais absolument pas comment procéder pour bénéficier de la même rapidité qu'un TCD tout en réalisant un code VBA.

J'ai créé deux classeurs BDD N et BDD N-1 et un classeur permettant de voir le résultat souhaité.

Si vous avez une piste pour effectuer cette opération de la façon la plus rapide possible merci énormément.

Merci encore à tous les deux.

Goloom92
 

Pièces jointes

  • Resultat souhaite.xlsx
    8.5 KB · Affichages: 38
  • BDD N.xlsx
    9.1 KB · Affichages: 43
  • BDD N-1.xlsx
    9.1 KB · Affichages: 44

Dranreb

XLDnaute Barbatruc
Bonjour.
Suis-je bête… on peut le faire un peu plus simplement, avec un niveau de moins :
VB:
Sub CompilTab()
Dim Rubrique As SsGr, Détail, T(1 To 100, 1 To 3), L As Long, C As Long
For Each Rubrique In Gigogne(TableUnique(PlgUti(Feuil2.[A2]), PlgUti(Feuil3.[A2])), 1)
   L = L + 1: T(L, 1) = Rubrique.Id
   For Each Détail In Rubrique.Co
      C = Détail(0) + 2
      T(L, C) = T(L, C) + Détail(2): Next Détail, Rubrique
Feuil1.[A2].Resize(100, 3).Value = T
End Sub
 

goloom92

XLDnaute Nouveau
Bonsoir Dranreb,

C'est parfait !!! j'ai testé avec 40 000 lignes dans les deux feuilles c'est ultra rapide. En revanche je n'arrive pas a comprendre d'où vient Gigogne(Tableunique(plguti. Est-ce possible juste de m'expliquer cette partie de code ?

Merci énormément en tout cas c'est génial !!

Très bonne soirée !!!!

Goloom92
 

goloom92

XLDnaute Nouveau
Bonsoir Dranreb,

Après beaucoup d'effort je n'ai pas trouvé la solution pour intégrer une colonne supplémentaire à votre code. Le niveau est malheureusement trop élevé pour moi :(

En fait, je souhaiterai ajouter une colonne "code couleur" au résultat souhaité mais je n'y parviens pas.

Je vous ai joint un classeur exemple pour expliquer mon soucis. J'espère que cela peut se faire facilement à partir du code existant.

Merci beaucoup pour votre aide,

Très bonne soirée !

Goloom92
 

Pièces jointes

  • GigogneGoloom92.xlsm
    62 KB · Affichages: 48

Dranreb

XLDnaute Barbatruc
Bonsoir.
Il était plus simple de repartir de la version indiquée au #6
La voici corrigée selon le nouveau besoin :
VB:
Sub CompilTab()
Dim Rubrique As SsGr, Détail, T(1 To 100, 1 To 4), L As Long, C As Long
For Each Rubrique In Gigogne(TableUnique(PlgUti(Feuil2.[A2]), PlgUti(Feuil3.[A2])), 1)
   L = L + 1: T(L, 1) = Rubrique.Id
   For Each Détail In Rubrique.Co
      T(L, 2) = Détail(2)
      C = Détail(0) + 3
      T(L, C) = T(L, C) + Détail(3): Next Détail, Rubrique
Feuil1.[A2].Resize(100, 4).Value = T
End Sub
La première chose à faire était de passer à 4 colonnes le Dim T(1 To 100, 1 To 4)
Ensuite transférer en colonne 2 du tableau le dernier des Détail(2) trouvés.
Enfin ajouter 1 à tous les n° de colonnes à partir de l'ancien 2 qui devient 3.

Il serait aussi possible de sortir tous les cas de valeurs de "Code actuel" en ajoutant un niveau pour cette colonne.
Ça devient ça :
VB:
Sub CompilTab()
Dim Rubrique As SsGr, CodAc As SsGr, Détail, T(1 To 100, 1 To 4), L As Long, C As Long
For Each Rubrique In Gigogne(TableUnique(PlgUti(Feuil2.[A2]), PlgUti(Feuil3.[A2])), 1, 2)
   For Each CodAc In Rubrique.Co
      L = L + 1: T(L, 1) = Rubrique.Id: T(L, 2) = CodAc.Id
      For Each Détail In CodAc.Co
         C = Détail(0) + 3
         T(L, C) = T(L, C) + Détail(3): Next Détail, CodAc, Rubrique
Feuil1.[A12].Resize(100, 4).Value = T
End Sub
Qui fait apparaître 2 lignes pour la Rubrique "Rouge", une pour Code "ROUZ4", l'autre pour "ROUZ5"
 
Dernière édition:

goloom92

XLDnaute Nouveau
Bonsoir Dranreb,

Merci beaucoup pour cette modification sur le code et surtout pour votre temps et ces explications.

Je vais pouvoir mieux comprendre en comparant les deux versions.

Je vais essayer ça tout de suite !

Très bonne soirée !! :)

Goloom92
 

goloom92

XLDnaute Nouveau
Bonsoir Dranreb,

Puis-je me permettre de vous poser une toute dernière question :)

Comment faut-il s'y prendre pour ajouter des colonnes à totaliser ?

Par exemple, dans la feuille "résultat souhaité" je souhaite ajouter d'autres colonnes totalisées.

Je vous joint mon fichier exemple.

Merci beaucoup encore et encore :)

Très bonne soirée !!

Goloom92
 

Pièces jointes

  • GigogneGoloom92.xlsm
    56 KB · Affichages: 46

Dranreb

XLDnaute Barbatruc
Bonsoir.
Je dirais comme ça :
VB:
Sub CompilTab()
Dim Rubrique As SsGr, Détail, T(1 To 100, 1 To 8), L As Long, C As Long
For Each Rubrique In Gigogne(TableUnique(PlgUti(Feuil2.[A2]), PlgUti(Feuil3.[A2])), 1)
    L = L + 1: T(L, 1) = Rubrique.Id
    For Each Détail In Rubrique.Co
       T(L, 2) = Détail(2)
       C = Détail(0) * 3 + 3
       T(L, C) = T(L, C) + Détail(3)
       T(L, C + 1) = T(L, C + 1) + Détail(4)
       T(L, C + 2) = T(L, C + 2) + Détail(5): Next Détail, Rubrique
Feuil1.[A2].Resize(100, 8).Value = T
End Sub
 

KIM

XLDnaute Accro
Bonsoir Dranreb,
Bonsoir le fil et le forum,
J'utilise actuellement tes modules pour créer des synthèses à partir d'une seule base (1 onglet).
La méthode de ce fil m'intéresse beaucoup. J'ai 2 onglets année N et année N-1. J'ai voulu faire la somme des col 5, 6, 7 pour chaque année par OP (col3)/ DP (col 1) / SIT (col2) /RUB (col4).
La macro du fichier ci-joint ne fonctionne pas.
Merci pour ton aide.
PS : Je n'ai pas compris ta syntaxe C = Détail(0) * 3 + 3 de ton post 13
KIM
Sub CompilTab5()
'Ajouter d'autres colonnes de références et d'autres à totaliser
Dim DP As SsGr, SIT As SsGr, OP As SsGr, RUB As SsGr, Détail, T(1 To 100, 1 To 10), L As Long, C As Long
For Each OP In Gigogne(TableUnique(PlgUti(Feuil2.[A2]), PlgUti(Feuil3.[A2])), 3, 1, 2, 4)
For Each DP In OP.Co
For Each SIT In DP.Co
For Each RUB In SIT.Co
L = L + 1
T(L, 1) = OP.Id
T(L, 2) = DP.Id
T(L, 3) = SIT.Id
T(L, 4) = RUB.Id
For Each Détail In RUB.Co
C = Détail(0) * 3 + 3
T(L, C) = T(L, C) + Détail(5)
T(L, C + 1) = T(L, C + 1) + Détail(6)
T(L, C + 2) = T(L, C + 2) + Détail(7): Next Détail, RUB, SIT, DP, OP
Feuil1.[A2].Resize(100, 10).Value = T
End Sub
 

Pièces jointes

  • GigogneGoloom92_KimT2.xlsm
    68.2 KB · Affichages: 30

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 216
Membres
103 158
dernier inscrit
laufin