XL 2016 Reporter des lignes de plusieurs feuilles

Bz1

XLDnaute Nouveau
Bonjour, je ne sais pas si c'est possible en tout cas je l'espère car j'aime automatiser les choses le plus possible. Je souhaite reporter dans un tableau les lignes de plusieurs feuilles et doubler certaines selon un critère. Ce n'est pas évident à faire comprendre comme ça... J'ai illustré dans la dernière feuille le résultat souhaité. Et je voudrais que les lignes continuent à s'ajouter dans le tableau si je rajoute des lignes dans les autres feuilles. Merci d'avance
 

Pièces jointes

  • test.xlsx
    34.2 KB · Affichages: 33

job75

XLDnaute Barbatruc
Bonjour Bz1,

Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" (clic droit sur l'onglet et Visualiser le code) :
Code:
Private Sub Worksheet_Activate()
Dim col, d As Object, w As Worksheet, P As Range, t, j%, a, b, ub%, i&, n&, resu()
col = Array("B", "C") 'liste des colonnes, à adapter
Set d = CreateObject("Scripting.Dictionary")
For Each w In Worksheets
    If w.Name <> Me.Name Then
        Set P = w.[A1].CurrentRegion
        t = P.Resize(P.Rows.Count + 1) 'matrice, plus rapide, au moins 2 éléments
        For j = 1 To UBound(t, 2)
            If IsNumeric(Application.Match(t(1, j), col, 0)) Then d(t(1, j)) = j 'mémorise la colonne
        Next j
        If d.Count Then
            a = d.keys: b = d.items: ub = UBound(a)
            For i = 2 To UBound(t) - 1
                For j = 0 To ub
                    If t(i, b(j)) <> "" Then
                        n = n + 1
                        ReDim Preserve resu(1 To 3, 1 To n)
                        resu(1, n) = t(i, 1)
                        resu(2, n) = a(j)
                        resu(3, n) = t(i, b(j))
                    End If
            Next j, i
            d.RemoveAll 'RAZ du Dictionary
        End If
    End If
Next w
If n Then
    '---transposition---
    ReDim t(1 To n, 1 To 3)
    For i = 1 To n
        For j = 1 To 3
            t(i, j) = resu(j, i)
    Next j, i
    '---restitution---
    If FilterMode Then ShowAllData 'si la feuille est filtrée
    [A2].Resize(n, 3) = t
End If
[A2].Offset(n).Resize(Rows.Count - n - 1, 3).ClearContents 'RAZ sous le tableau
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Elle se déclenche quand on active la feuille.

A+
 

Pièces jointes

  • test(1).xlsm
    50 KB · Affichages: 33

job75

XLDnaute Barbatruc
Bonjour Bz1, le forum,
Je n'ai jamais utiliser de macro, comment activer la feuille "Résultat" stp ?
1. Quand on déplace la souris on voit se déplacer sur l'écran un petit objet en forme de croix (le curseur).

2. Amener le curseur sur "Résultat" en bas de la feuille : le curseur se transforme en flèche.

3. Appuyer avec l'index sur le bouton gauche de la souris (quand on est droitier), cela s'appelle cliquer.

Evidemment c'est moins facile quand on n'a pas de souris :rolleyes:

A+
 

Bz1

XLDnaute Nouveau
Bonjour, c'est bon. En fait, il suffisait de cliquer sur le bouton "activer les macros", je n'avais pas vu le message de sécurité :) C'est super ce que tu as fait, c'est exactement ce que je voulais je ne pensais même pas que c'était possible à mettre en place... ça donne envie d'apprendre le macro ! :D Peux-tu refaire la même chose mais sur ce fichier stp car je n'arrive pas complétement à transposer le truc sur mon projet personnel. Merci infiniment @job75 , ce forum est génial ^^
 

Pièces jointes

  • projet.xlsm
    12.8 KB · Affichages: 31

job75

XLDnaute Barbatruc
Re,

Pour bien faire j'ai ajouté les variables colLibel et colDate dans le fichier joint :
Code:
Private Sub Worksheet_Activate()
Dim col, d As Object, w As Worksheet, P As Range, colLibel As Variant, colDate As Variant, t, j%, a, b, ub%, i&, n&, resu()
col = Array("F", "G", "H", "I") 'liste des colonnes, à adapter
Set d = CreateObject("Scripting.Dictionary")
For Each w In Worksheets
    If w.Name <> Me.Name Then
        Set P = w.[A1].CurrentRegion
        colLibel = Application.Match("Libellé", P.Rows(1), 0)
        colDate = Application.Match("Date", P.Rows(1), 0)
        t = P.Resize(P.Rows.Count + 1) 'matrice, plus rapide, au moins 2 éléments
        For j = 1 To UBound(t, 2)
            If IsNumeric(Application.Match(t(1, j), col, 0)) Then d(t(1, j)) = j 'mémorise la colonne
        Next j
        If d.Count Then
            a = d.keys: b = d.items: ub = UBound(a)
            For i = 2 To UBound(t) - 1
                For j = 0 To ub
                    If t(i, b(j)) <> "" Then
                        n = n + 1
                        ReDim Preserve resu(1 To 4, 1 To n)
                        If IsNumeric(colDate) Then resu(1, n) = t(i, colDate) Else resu(1, n) = ""
                        If IsNumeric(colLibel) Then resu(2, n) = t(i, colLibel) Else resu(2, n) = ""
                        resu(3, n) = a(j)
                        resu(4, n) = t(i, b(j))
                    End If
            Next j, i
            d.RemoveAll 'RAZ du Dictionary
        End If
    End If
Next w
If n Then
    '---transposition---
    ReDim t(1 To n, 1 To 4)
    For i = 1 To n
        For j = 1 To 4
            t(i, j) = resu(j, i)
    Next j, i
    '---restitution---
    If FilterMode Then ShowAllData 'si la feuille est filtrée
    [A2].Resize(n, 4) = t
End If
[A2].Offset(n).Resize(Rows.Count - n - 1, 4).ClearContents 'RAZ sous le tableau
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
A+
 

Pièces jointes

  • projet(1).xlsm
    28.9 KB · Affichages: 30

Bz1

XLDnaute Nouveau
Ah oui... j'avais testé mais j'avais oublié de mettre au moins un chiffre dans l'une des colonnes F, G, H, I. J'ai modifié la formule de la colonne K (feuille 1 mais je compte la faire aussi sur les 2 autres feuilles) et ça me mets ce message d'erreur, la macro ne fonctionne plus :
"Erreur d'exécution '1004'
Erreur définie par l'application ou par l'objet"
Merci d'avance pour ton aide.
 

job75

XLDnaute Barbatruc
Re,

Cela fait 10 ans que je suis sur ce forum et c'est la 1ère fois que je vois ça !!!

Copier la formule de la colonne L jusqu'à la dernière ligne de Feuil1 (1048576) c'est vraiment incroyable.

C'est pour cela que le fichier pèse 10 Mo.

Au moins effacez toute la ligne 1048576, il n'y aura plus de bug.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 176
Messages
2 085 961
Membres
103 066
dernier inscrit
bobfils