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

XL 2016 Reporter des lignes de plusieurs feuilles

  • Initiateur de la discussion Initiateur de la discussion Bz1
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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

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 🙄

A+
 
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 ! 😀 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

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

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.
 
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+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
12
Affichages
292
Réponses
3
Affichages
147
Réponses
1
Affichages
158
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…