XL 2016 Regrouper les données de six feuilles sur une seule

luno123

XLDnaute Occasionnel
Bonjour à tous,

Je souhaiterais regrouper les données (comptes comptables et libellés) de six feuilles sur une seule ("New").
J'ai donné plus d'explications sur le fichier en onglet "objectif".

Merci d'avance pour votre aide précieuse.

Luno
 

Pièces jointes

  • PCG 06122022.xlsx
    107.9 KB · Affichages: 5

luno123

XLDnaute Occasionnel
Salut lizzmo,

Je te remercie pour ta réactivité. J'ai essayé de rajouter un compte inexistant dans une des feuilles en vert et je me rends compte que ce rajout n'a pas été pris en compte dans la feuille New. Comment mettre à jour la feuille New stp?
 

job75

XLDnaute Barbatruc
@luno123 vous ne répondez pas à ma question.

Dans votre fichier il y a une colonne B vide entre la colonne A et la colonne CDT de la feuille "New".

Dans la solution de bhbh il n'y en a pas et de toute façon sur Power Query le tableau des résultats ne doit pas être modifié manuellement.

Voici une solution VBA qui permet l'entrée de données manuelles en colonne B et de les conserver :
VB:
Private Sub Worksheet_Activate()
Dim ncol%, d As Object, dd As Object, tablo, i&, x$, j%, resu(), n&
ncol = 8 'nombre de colonnes restituées
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
tablo = [A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide
For i = 2 To UBound(tablo)
    d(CStr(tablo(i, 1))) = tablo(i, 2) 'mémorise la colonne B
Next i
For j = 3 To ncol
    tablo = Sheets(CStr(Cells(1, j))).Cells(1).CurrentRegion.Resize(, 2) 'matrice, plus rapide
    For i = 2 To UBound(tablo)
        x = CStr(tablo(i, 1))
        If Not dd.exists(x) Then
            n = n + 1
            dd(x) = n 'mémorise la ligne
            ReDim Preserve resu(1 To ncol, 1 To n)
            resu(1, n) = x
            resu(2, n) = d(x) 'récupère la colonne B mémorisée
        End If
        resu(j, dd(x)) = tablo(i, 2) 'récupère la ligne
Next i, j
'---restitution---
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2]
    If n Then
        .Resize(n, ncol) = Application.Transpose(resu) 'Transpose est limitée à 65536 lignes
        .Resize(n, ncol).Sort .Cells, xlAscending, Header:=xlNo 'tri
    End If
    .Offset(n).Resize(Rows.Count - n - .Row + 1, ncol).ClearContents 'RAZ en dessous
    .Resize(, ncol).EntireColumn.AutoFit 'ajustement largeurs
End With
End Sub
La macro se déclenche automatiquement quand on active la feuille.

Elle est très rapide car elle utilise des tableaux vba et 2 Dictionary.

Nota : si plus de 65536 lignes doivent être restituées dites-le, il faudra un code pour transposer.

A+
 

Pièces jointes

  • PCG 06122022(1).xlsm
    119.8 KB · Affichages: 5

luno123

XLDnaute Occasionnel
@luno123 vous ne répondez pas à ma question.

Dans votre fichier il y a une colonne B vide entre la colonne A et la colonne CDT de la feuille "New".

Dans la solution de bhbh il n'y en a pas et de toute façon sur Power Query le tableau des résultats ne doit pas être modifié manuellement.

Voici une solution VBA qui permet l'entrée de données manuelles en colonne B et de les conserver :
VB:
Private Sub Worksheet_Activate()
Dim ncol%, d As Object, dd As Object, tablo, i&, x$, j%, resu(), n&
ncol = 8 'nombre de colonnes restituées
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
tablo = [A1].CurrentRegion.Resize(, 2) 'matrice, plus rapide
For i = 2 To UBound(tablo)
    d(CStr(tablo(i, 1))) = tablo(i, 2) 'mémorise la colonne B
Next i
For j = 3 To ncol
    tablo = Sheets(CStr(Cells(1, j))).Cells(1).CurrentRegion.Resize(, 2) 'matrice, plus rapide
    For i = 2 To UBound(tablo)
        x = CStr(tablo(i, 1))
        If Not dd.exists(x) Then
            n = n + 1
            dd(x) = n 'mémorise la ligne
            ReDim Preserve resu(1 To ncol, 1 To n)
            resu(1, n) = x
            resu(2, n) = d(x) 'récupère la colonne B mémorisée
        End If
        resu(j, dd(x)) = tablo(i, 2) 'récupère la ligne
Next i, j
'---restitution---
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2]
    If n Then
        .Resize(n, ncol) = Application.Transpose(resu) 'Transpose est limitée à 65536 lignes
        .Resize(n, ncol).Sort .Cells, xlAscending, Header:=xlNo 'tri
    End If
    .Offset(n).Resize(Rows.Count - n - .Row + 1, ncol).ClearContents 'RAZ en dessous
    .Resize(, ncol).EntireColumn.AutoFit 'ajustement largeurs
End With
End Sub
La macro se déclenche automatiquement quand on active la feuille.

Elle est très rapide car elle utilise des tableaux vba et 2 Dictionary.

Nota : si plus de 65536 lignes doivent être restituées dites-le, il faudra un code pour transposer.

A+
Bonjour Job 75,

Autant pour moi, je n'avais pas compris votre question sur la colonne B. En réalité, elle sert juste de séparation. Elle ne sera jamais remplie. Voilà votre fichier sur lequel j'ai supprimé les éléments saisis en colonne B.
J'avoue que votre solution est très bien. MERCI BEAUCOUP
 

Pièces jointes

  • PCG 07122022 tableaux vba et 2 Dictionary.xlsm
    156.5 KB · Affichages: 6

Discussions similaires

Réponses
5
Affichages
127

Statistiques des forums

Discussions
312 095
Messages
2 085 249
Membres
102 835
dernier inscrit
Alexandrax971