Macro : Copier les 10 premiers résultats d'un filtre auto
Bonjour,
Petits soucis et maux de tête avec une macro excel à créer...
Objectif :
J'ai une liste d'applications gérées par 5 domaines Métier; des budget sont associés à ces applications, j'ai besoin d'extraire la liste des 10 applications dont les budgets sont les + élévés pour chaque domaine...
Je dois donc copier les 10 premiers résultats d'une liste résultant d'un filtre automatique et d'un tri sur une autre feuille pré-formatée...
Problème rencontrés:
(N.B. : Manuellement : aucun problème pour copier-coller les données...)
- 1) Je n'arrive pas à copier les résultats d'un filtre automatique avec une macro pour les coller dans une autre feuille
- 2) Je n'arrive pas à copier les 10 premiers résultats (d'une liste beaucoup plus longue) de l'application successive de filtres et tris (les n° de ligne changent à chaque application d'un filtre)
Quelqu'un aurait-il une idée ?!!...
Merci,
Jean
Bonjour,
Peux-tu mettre ton fichier avec des données bidons. Ce sera plus facile.
Veille à ce que la structure soit la même d'un point de vue colonne et ce, dans les deux feuilles concernées.
A te lire
Dan
Salut le forum
Sans exemple, dur de t'aider plus mais un filtre élaboré devrait faire le travail.
Mytå_Qc
Bonjour,
et merci de vous penchez sur mon pb !!
Je vous envoie donc un fichier reprenant le format de celui que j'exploite.
(j'ai mis qques commentaires en bleu):
https://www.excel-pratique.com/~files/doc/exemple_fichier.zip
Coté Macro, j'ai pu lire sur le web, mais sans trouver de solution, que copier les résultats d'un filtre automatique via une macro demandait une "opération" particulière...
Jean
Bonjour,
Voici une macro qui devrait te faire cela.
Pour l'installer :
- ALT + F11 pour aller VBA
- Menu/insertion/module
- A droite, place la macro ci-dessous et enregistre ton fichier.
Sub Transfert()
'Macro par DAN pour Baan sur excel Pratique - 14/08/07
Dim i As Integer, lig As Integer, ligne As Integer
lig = Sheets("10applis").Range("E65536").End(xlUp).Row
For i = 2 To lig
If Sheets("10applis").Rows(i).Hidden = False Then
With Sheets("Juillet_T0")
ligne = .Range("a65536").End(xlUp).Row + 1
.Cells(ligne, 1) = Sheets("10applis").Cells(i, 2).Value
.Cells(ligne, 2) = Sheets("10applis").Cells(i, 3).Value
.Cells(ligne, 5) = Sheets("10applis").Cells(i, 4).Value
.Cells(ligne, 6) = Sheets("10applis").Cells(i, 5).Value
.Cells(ligne, 9) = Sheets("10applis").Cells(i, 6).Value
.Cells(ligne, 10) = Sheets("10applis").Cells(i, 7).Value
.Cells(ligne, 12) = Sheets("10applis").Cells(i, 8).Value
End With
End If
Next i
End Sub- Mets ton filtre automatique et fait un tri sur la colonne de ton choix.
- exécute la macro en question en la sélectionnant par menu/données/macro/macro
Tu peux lui attribuer un raccourci clavier par menu/données/macro/macro et là sélectionner la macro puis cliquer sur "Options" et choisir une lettre (par ex --> t).
En apputant sur CRT + t la macro sera alors exécutée.
A te lire
Dan
Salut le forum
Une façon de travailler avec le filtre automatique et la fonction Find.
Tout le transfère des données est automatisées, juste un bouton à cliquer.
Mytå
P.S. Dan ta macro n'est pas correct c'est le contraire de la feuille Juillet_T0 vers la feuille 10applis
Re,
Oups Myta, je viens de voir ton fichier.
Pfff , j'ai fait le contraire !!!
Bon la macro est juste mais cela ne résoud pas ton pb Baan ! Donc là oublie moi et fonce sur ce que Myta te donne. Cela correspond à ce que tu demandes.
Je laisse cette macro pour celui qui veut l"utiliser en considérant la récupération des valeurs filtrées de la feuille appli10 vers la feuille Juillet.
Encore désolé et merci à toi Myta
Dan
Re le forum
Petite correction du code de ma macro
'...
If C.Row = 1 Then Exit Do
Nbre = Nbre + 1
'...Afin d'éviter un Filtre automatique sans valeurs d'affichées.
Code complet
Sub CopyFilter()
Dim C As Range
Dim Ligne As String
Dim I As Byte
Dim Nbre As Byte
Dim Critere As String
'Vérifier la présence du Filtre automatique
With Sheets("Juillet_T0")
.Activate
If Not .AutoFilterMode Then .Rows(1).AutoFilter
On Error Resume Next
.ShowAllData
'Trier la colonne Bubget (Ordre décroissant)
.Range("A1").CurrentRegion.Sort Key1:=Range("I1"), Order1:=xlDescending
'Exécution du Filtre automatique
For I = 1 To 66 Step 11
With Sheets("10applis")
.Range("B" & I + 1 & ":H" & I + 10).ClearContents
Critere = .Cells(I, 1).Value
End With
If Critere = "Tous" Then
Selection.AutoFilter Field:=5
Else
Selection.AutoFilter Field:=5, Criteria1:=Critere
End If
'Transfère des données filtrées (Maximum 10)
Nbre = 0
With .AutoFilter.Range.Columns(1)
Ligne = .Cells(1).Address
Set C = .Columns(1).Find("*")
Do
If C.Row = 1 Then Exit Do
Nbre = Nbre + 1
'MsgBox C.Row
'Copier les données
Sheets("10applis").Range("B" & I + Nbre) = .Range("A" & C.Row)
Sheets("10applis").Range("C" & I + Nbre) = .Range("B" & C.Row)
Sheets("10applis").Range("D" & I + Nbre) = .Range("E" & C.Row)
Sheets("10applis").Range("E" & I + Nbre) = .Range("F" & C.Row)
Sheets("10applis").Range("F" & I + Nbre) = .Range("I" & C.Row)
Sheets("10applis").Range("G" & I + Nbre) = .Range("J" & C.Row)
Sheets("10applis").Range("H" & I + Nbre) = .Range("L" & C.Row)
Set C = .FindNext(C)
Loop Until C.Address = Ligne Or Nbre = 10
End With
Next I
End With
Sheets("10applis").Activate
End SubMytå
Bonjour,
Merci beaucoup à bous 2 !... grâce à vous je touche au but !...
Bon, comme j'aime bien comprendre ce qui se passe (afin notamment d'embêter au minimum les personnes qui m'aident) et que je dois modifier 2 petites choses qui évidemment impactent la macro pour l'adapter au format de mon fichier réel, un dernier coup de main serait particulièrement le bienvenu ! ...
J'ai en fait 2 modifs:
- Décalage des colonnes : ça ok, j'ai réussi à répérer les noms dans la macro et à l'adapter,
- mais pour les domaines (colonne D) qui s'appellent en fait I01, I02, I03, I04, et, G01 (au lieu de G01 à G05), là, je cale n'ai pas réussi à repérer ce qui permet de lire cette info de filtrage ('Critere' ?).... les quelques essais effectués ont complètement déstabilisé le résultat obtenu...
Cordialement,
Jean
Salut le forum
Baan, la partie qui détermine le filtrage
'...
'Exécution du Filtre automatique
For I = 1 To 66 Step 11
With Sheets("10applis")
.Range("B" & I + 1 & ":H" & I + 10).ClearContents
Critere = .Cells(I, 1).Value
End With
If Critere = "Tous" Then
Selection.AutoFilter Field:=5
Else
Selection.AutoFilter Field:=5, Criteria1:=Critere
End If
'...Critere = .Cells(I, 1).Value lit la valeur du critère du filtre ici Ligne I colonne A.
Soit les valeurs de $A$1, $A$12, $A$23, .... $A$56
Mytå
Bonjour à tous...
...et...
... un grand merci !!!....
... et oui, ça fonctionne !!... (je dois être le seul à m'en étonner, mais je galère tellement avec ces macros...)
J'ai juste rajouté un filtre auto afin d'enlever les champs vides de la colonne budget (je ne sais pas pourquoi les lignes avec un champs vide se retrouvaient classées en premier et étaient donc recopiées sur la feuille "10applis"....), enfin maintenant ça marche très bien !
J'ai bien essayé aussi de pousser le vice jusqu'à mettre le nom de la feuille source de l'extraction en variable dans une cellule de la feuille "10applis" pour qu'elle alimente la macro, mais là... faudrait que je prenne des cours !!!...
Merci à Dan et Mytå,
en espérant que cet exercice peut servir de base à d'autres.
Jean
Salut Baan et le forum
Baan a écrit :J'ai juste rajouté un filtre auto afin d'enlever les champs vides de la colonne budget (je ne sais pas pourquoi les lignes avec un champs vide se retrouvaient classées en premier...
Il y a une ligne dans la macro pour trier ta colonne Budget (Décroissant)
'Trier la colonne Budget (Ordre décroissant)
.Range("A1").CurrentRegion.Sort Key1:=Range("I1"), Order1:=xlDescending Surement juste une adaptation de la plage de trie
Mytå
Mytå a écrit :Salut Baan et le forum
Baan a écrit :J'ai juste rajouté un filtre auto afin d'enlever les champs vides de la colonne budget (je ne sais pas pourquoi les lignes avec un champs vide se retrouvaient classées en premier...
Il y a une ligne dans la macro pour trier ta colonne Budget (Décroissant)
'Trier la colonne Budget (Ordre décroissant) .Range("A1").CurrentRegion.Sort Key1:=Range("I1"), Order1:=xlDescendingSurement juste une adaptation de la plage de trie
Mytå
Merci !
Jean