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
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 Suberic
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).ClearContentsavec .[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 Ifavec 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