Comment faire un résumé de plusieurs feuilles

Bonjour à tous,

Je viens de découvrir toutes les possibilités qu'offre Excel pour mon nouveau travail, mais il me manque une chose.

J'aimerais créer dans une feuille un tableau de taille variable. Il faudrait que ce tableau cherche dans les autres feuilles des codes (renseignés dans une colonne sur chaque feuille) que renseigne l'utilisateur, et me les affiche les uns à la suite des autres.

Le problème est que je ne sais pas combien de codes il peut rentrer, donc il me faudrait en gros une boucle :

on commence à une cellule de la feuille X

si la cellule de la feuille X est vide, on passe à la cellule de la feuille X+1

voilà en gros l'algo qu'il me faudrait : une liste de tous les codes renseignés dans chaque feuille, histoire d'optimiser la récupération des données renseignées

le problème est que je pense devoir utiliser VBA, mais que d'une part je ne le maîtrise pas (mais ça je pense pouvoir apprendre avec les tuto) mais surtout je ne sais absolument comment l'utiliser pour faire ce que je veux

parce qu'un bon exemple est toujours utile, voilà un fichier sans aucune donnée sensible (quoique...) et qui ressemble furieusement au mien. Je voudrais que dans la feuille liste, le tableau se remplisse automatiquement quand on choisi des trucs dans le menu déroulant des feuilles "flore" et "faune". Je pourrais simplement lui demander de faire un copier coller, mais je ne sais pas combien d'espèces l'utilisateur va choisir, et autant on peut se permettre ici de sauter 3 lignes dans le tableau de "liste" pour lui laisser la place, autant dans mon fichier où j'ai 5 feuilles et une bonne vingtaines de lignes à chaque fois ce n'est absolument pas acceptable.

Merci d'avance du temps que vous pourrez m'accorder,

Pyxel

82essai.zip (7.40 Ko)

Bonjour,

la feuille Liste se met à jour lorsqu'on l'active.

(donc penser à l'activer au moins une fois après des mises à jour si des formules d'autres feuilles utilisent ses données)

Déclarer les feuilles à collecter dans le array 'feuilles'

Option Explicit

Private Sub Worksheet_Activate()
    maj
End Sub

Sub maj()
    Dim feuilles, nomF As String
    Dim sh As Worksheet, shDest As Worksheet
    Dim lig As Long, derlig As Long, lig2 As Long
    Dim i As Long
    feuilles = Array("Faune", "Flore")
    For i = 0 To UBound(feuilles)
        nomF = nomF & feuilles(i) & "|"
    Next i
    nomF = "|" & nomF

    Application.ScreenUpdating = False
    Set shDest = Worksheets("Liste")
    derlig = shDest.Cells(Rows.Count, 1).End(xlUp).Row
    If derlig > 3 Then shDest.[A4].Resize(derlig - 3, 4).ClearContents

    lig2 = 4
    For Each sh In Worksheets
        If InStr(nomF, "|" & sh.Name & "|") > 0 Then
            derlig = sh.Cells(Rows.Count, 1).End(xlUp).Row
            For lig = 4 To derlig
            If sh.Cells(lig, 1) <> "" Then
                shDest.Cells(lig2, 1) = sh.Name
                sh.Cells(lig, 1).Resize(1, 3).Copy shDest.Cells(lig2, 2).Resize(1, 3)
                lig2 = lig2 + 1
            End If
            Next lig
        End If
    Next sh
    Application.ScreenUpdating = True
End Sub

eric

140classeur2.zip (15.90 Ko)

merci beaucoup pour cette aide, je vais l'essayer de ce pas

Merci beaucoup, ça marche !

Par contre maintenant j'aimerais utiliser ce code pour mon vrai travail, mais dans ce cas il faut que je le comprenne

en fait il faut surtout que je modifie les cellules que va regarder l'algorithme dans les feuilles

Pour vérifier :

Sub maj()

Dim feuilles, nomF As String

Dim sh As Worksheet, shDest As Worksheet

Dim lig As Long, derlig As Long, lig2 As Long

Dim i As Long

feuilles = Array("Faune", "Flore")

=> pour l'instant on déclare les variables et leur type

For i = 0 To UBound(feuilles)

nomF = nomF & feuilles(i) & "|"

Next i

nomF = "|" & nomF

=> des itérations pour nommer un truc, si je comprend bien à la fin nomF = nomF Faune | Flore |

Application.ScreenUpdating = False

=> là je sais pas mais j'imagine que c'est un truc général, donc pas besoin de changer

Set shDest = Worksheets("Liste")

derlig = shDest.Cells(Rows.Count, 1).End(xlUp).Row

=> encore de la déclaration de variables, par contre bien que je vois ce qu'est derlig j'arrive pas à isoler l'apport de chaque fonction

If derlig > 3 Then shDest.[A4].Resize(derlig - 3, 4).ClearContents

lig2 = 4

For Each sh In Worksheets

If InStr(nomF, "|" & sh.Name & "|") > 0 Then

derlig = sh.Cells(Rows.Count, 1).End(xlUp).Row

For lig = 4 To derlig

If sh.Cells(lig, 1) <> "" Then

shDest.Cells(lig2, 1) = sh.Name

sh.Cells(lig, 1).Resize(1, 3).Copy shDest.Cells(lig2, 2).Resize(1, 3)

lig2 = lig2 + 1

End If

Next lig

End If

Next sh

=> là on a bien une boucle qui copie-colle toutes les valeurs qu'elle trouve dans une place définie, mais j'arrive pas à savoir ce que représentent lig et lig2

Application.ScreenUpdating = True

End Sub

voilà si tu pouvais encore m'expliquer 2/3 trucs ça m'arrangerait =)

merci encore !

Pyxel

Bonjour,

Oupsss, tout ça ? Et c'est vieux en plus...

feuilles = Array("Faune", "Flore")

=> pour l'instant on déclare les variables et leur type

oui, dans feuilles mettre les noms des feuilles à traiter.

For i = 0 To UBound(feuilles)

nomF = nomF & feuilles(i) & "|"

Next i

nomF = "|" & nomF

=> des itérations pour nommer un truc, si je comprend bien à la fin nomF = nomF Faune | Flore |

C'est pour avoir tous les noms dans une chaine, ensuite un seul test et on sait que la feuille y est.

Application.ScreenUpdating = False

=> là je sais pas mais j'imagine que c'est un truc général, donc pas besoin de changer

oui, désactive le rafraichissement écran pour accélérer.

derlig = shDest.Cells(Rows.Count, 1).End(xlUp).Row

=> encore de la déclaration de variables, par contre bien que je vois ce qu'est derlig j'arrive pas à isoler l'apport de chaque fonction

Rows.Count : nombre de lignes d'une feuille

Cells(Rows.Count, 1) : dernière cellule de la colonne 1 (A)

.End(xlUp) : on part de la dernière cellule et on remonte jusqu'à la 1ère non vide, avec .Row on récupère son n° de ligne

=> là on a bien une boucle qui copie-colle toutes les valeurs qu'elle trouve dans une place définie, mais j'arrive pas à savoir ce que représentent lig et lig2

lig : pointeur de ligne sur la feuille en cours de traitement.

lig2 : pointeur de ligne sur la feuille destination (ligne d'écriture)

eric

Bonjour,

Merci pour cette aide précieuse Eric

J'aurais une dernière question : il m'effaçait toutes les colonnes de copie dans feuille de destination, et je voulais mettre d'autres données, alors j'ai modifié l'emplacement de copie (simplement une colonne plus à droite) mais maintenant il ne m'efface plus rien du tout

Quel nombre faut-il changer pour qu'il m'efface les colonnes de copie avant de recopier sans m'effacer toute la feuille ?

Bonjour,

j'ai l'impression que tu ne reviens que si tu as de nouvelles questions, en oubliant de dire merci lorsque tu as les réponses...

Et bien tu attendras 1 ou 2 semaines, comme j'attend pour un simple merci. Si j'y penses toujours d'ici là.

eric

euh.... désolé mais après relecture de tous mes précédents messages j'ai bien toujours fait précéder mes questions d'une note de remerciement et d'un bonjour, ça me semble le minimum vu l'aide précieuse que tu m'apportes !

et pour le temps de réponse, c'est simplement que je suis étudiant et que je travailles sur Excel uniquement quelques heures par semaine pour mon job

en tous cas je te prie de m'excuser si j'ai pu laisser entendre une quelconque attitude ingrate

Re,

c'est cette partie qui nettoie la feuille Liste :

    derlig = shDest.Cells(Rows.Count, 1).End(xlUp).Row
    If derlig > 3 Then shDest.[A4].Resize(derlig - 3, 4).ClearContents

avec .[A4] : 1ère cellule

.Resize(derlig - 3, 4) : hauteur, largeur

et celle-ci qui écrit :

            If sh.Cells(lig, 1) <> "" Then
                shDest.Cells(lig2, 1) = sh.Name
                sh.Cells(lig, 1).Resize(1, 3).Copy shDest.Cells(lig2, 2).Resize(1, 3)
                lig2 = lig2 + 1
            End If

avec cells(ligne, colonne) et resize(hauteur, largeur)

Mais tu n'es pas sûr que les mêmes lignes se réinscriront au même endroit.

eric

merci beaucoup (cette fois sans retard !)

je teste ça demain

Rechercher des sujets similaires à "comment resume feuilles"