Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
VBA: Chercher des donnees en fonction d'autre donnees
J'aurais besoin un peu d'aide je bloque sur un fichier...
Je souhaiterais :
En fonction de données entrées type " Filtre"
1) aller chercher et sélectionner les données dans un tableau (feuille2)
2) Réaliser une formule (moyenne)
3) Copier dans une cellule sur un autre tableau (feuille3)
Je me suis permis de mettre en pièce jointe un exemple avec des explications, pour plus de clarete!
Si quelqu'un pouvait m'aider ou m'orienter avec un exemple je serais reconnaissant!
Merci d'avance
Bonne journee
Pièces jointes
Recuperer des donnees en fonction d'un filtre.xlsx
Re : VBA: Chercher des donnees en fonction d'autre donnees
Bonjour MarieL91,
En réalité, j'en suis encore à ma demander si j'ai compris la demande (mais il y avait quelque temps, j'avais déjà réfléchi à un problème un peu similaire, sans aboutir ... faute de temps, sans aucun doute )
Pour tes calculs de moyenne, il faudra que tu réexpliques!?
Un bouton "Afficher le formulaire" dans la feuille "3" fait apparaître un UserForm. Dans ce dernier, des cases à cocher permettent de décider sur quelles colonnes on applique le filtre. À leur droite, des listes déroulantes contiennent les valeurs de ces colonnes (sans doublons). Ces listes ne sont pas réactualisées en fonction des choix faits dans les autres listes (ce serait certainement faisable, mais le temps n'est pas extensible et puis il faudra bien que tu t'occupes un peu aussi! )
Les listes ne sont "accessibles" que si la case correspondante est cochée.
Le principe utilisé est celui des filtres avancés (la zone verte est réservée à la "zone de critères")
Re : VBA: Chercher des donnees en fonction d'autre donnees
Bonjour a tous!
Bon je seche encore une fois...
Juste un petit coup de main ? Je souhaite pouvoir selectionner plusieurs criteres dans la meme liste. (USERFORM)
Exemple LI 1 & 2.
Je essaye ce code mais ca ne fonctionne pas.
'Sub cmdAdd_Click()
'Dim addme As Range
'Dim x As Integer
'Set addme = Sheet1.Cells(Rows.Count, 5).End(xlUp).Offset(1, 0)
'For x = 0 To Me.lstSelector.ListCount - 1
'Set addme = addme.Offset(1, 0)
'Next x
'For x = 0 To Me.lstSelector.ListCount - 1
'If Me.lstSelector.Selected(x) Then Me.lstSelector.Selected(x) = False
'Next x
'End Sub
Re : VBA: Chercher des donnees en fonction d'autre donnees
Bonjour (enfin, je ne sais pas trop? Tu vis la nuit, sur le forum!?)
Pour pouvoir sélectionner plusieurs éléments, il faut utiliser des contrôles ListBox (avec la propriété MultiSelect sur la position MultiSelectMulti)
Par contre, j'avais utilisé le principe du filtre avancé pour afficher le résultat dans l'autre feuille ... Si tu souhaites pouvoir multiplier les critères et ce, sur plusieurs colonnes, ce ne sera plus possible avec le filtre avancé (il faudrait déterminer quels critères devraient être sur la même ligne que d'autres ... ou pas!?). Ça va devenir un brin compliqué à gérer!
En résumé donc, choisir un critère en sélectionnant certaines colonnes ou sélectionner plusieurs critères sur une colonne, ce serait OK, mais les deux en même temps ... ... je ne vois pas vraiment de solution, pour le moment.
Les filtres automatiques (que tu connais) seront plus aisés à manipuler, tout comme les TCD proposés par Lolote83.
[Edit:] pendant le trajet de retour, j'ai réfléchi (si, ça m'arrive!) ... une idée m'est venue pour qu'on puisse utiliser les filtres avancés: des critères sous forme de formules. Pas eu le temps de faire des tests poussés, juste 2 ou 3 essais. Il y a certainement des cas de figure qui ne sont pas gérés. Je te laisse le soin de les inventorier (et de t'assurer que ça fonctionne!).
Je ne prétends pas que l'idée soit lumineuse ... c'est seulement qu'elle semble fonctionner
Je serai un tantinet occupé demain, mais je repasserai en soirée.
Re : VBA: Chercher des donnees en fonction d'autre donnees
Re,
Visiblement, je ne suis pas le seul à avoir été un peu occupé (et avec le mode invisible on ne sait pas si tu es repassée ... ou pas!?)
J'ai donc fait l'un ou l'autre test (mais n'en ferai pas plus avant de savoir si MarieL91 repasse par ici) ... un problème est lié au fait que les chiffres de la colonne Semaine sont au format Texte, alors que ceux de la colonne Li ne le sont pas ... qu'en est-il du vrai fichier de travail? Les formats différents y existent aussi?
Re : VBA: Chercher des donnees en fonction d'autre donnees
Bonjour Modeste,
Non je ne vis pas la nuit mais juste à l’étranger^^
Désolée de la réponse tardive mais effectivement un peu occupe en ce moment.
Bon déjà merci de prendre le temps de résoudre mon problème!
Alors j'ai regarde ton dernier fichier et ca fonctionne donc vraiment un grand merci.
J'ai effectivement changer les donnes Li en texte. Ca n'avait pas d’importance dans le fichier final.
Maintenant j'ai transposé dans le fichier final et la probleme les formules ne fonctionnent plus. J'ai essaye de comprendre ton code.
Private Sub BtFiltrer_Click()
Dim formules(4) As String
cptCrit = 0
Sheets("3").[A1:E2].ClearContents 'supprimer filtre
Sheets("3").[A10].CurrentRegion.Offset(1, 0).ClearContents 'supprimer libeles
For ctrl = 1 To 5
formules(cptCrit) = "=ou(" 'selection plusieurs criteres
trouveCrit = False
For élém = 0 To Controls("Lbx" & ctrl).ListCount - 1 'selection plusieurs criteres
If Controls("Lbx" & ctrl).Selected(élém) Then
trouveCrit = True
colonne = Application.Match(Controls("Chb" & ctrl).Caption, Sheets("2").[A11:K11], 0) ' correspondance entre les libelles feuille 2&3
formules(cptCrit) = formules(cptCrit) & "'2'!" & Sheets("2").Cells(12, colonne).Address(RowAbsolute:=False, ColumnAbsolute:=False) & "=""" & Controls("Lbx" & ctrl).List(élém) & """;" ' definir la formule / je suppose que c'est le truc des filtres mais je ne comprend pas trop ?
'Formule = Peux tu m'expliquer ?
End If
Next élém
If trouveCrit Then 'incrementer la serie
formules(cptCrit) = Left(formules(cptCrit), Len(formules(cptCrit)) - 1) & ")"
Cells(1, cptCrit + 1) = "crit" & (cptCrit + 1)
Cells(2, cptCrit + 1).FormulaLocal = formules(cptCrit)
cptCrit = cptCrit + 1
End If
Next ctrl
Sheets("2").[A11].CurrentRegion.AdvancedFilter Action:=xlFilterCopy, criteriarange:=Sheets("3").[A1].CurrentRegion, copytorange:=Sheets("3").[A10:K10] ' copier feuille2 + coller feuille 3
End Sub
J'ai deja regardé si les rangées, nombre de colonne , lignes étaient correctes.
Peux tu me dire si je comprend ton code ou complètement a cote de la plaque...?
Juste une petite question: T'aurais pas un bon livre ou site pour m'améliorer en macro ?
Aaaaahhhh c'était donc ça! J'imaginais déjà une vraie passionnée d'Excel, bossant le jour et hantant les couloirs du forum pendant la nuit
Pour mieux comprendre le code, à mon avis, il faut te pencher avant tout sur les Filtres Avancés. Le principe étant ici que la "Zone de critères" figure en feuille 3 dans la plage de A1 à (maximum) E2. Dans cette plage, il y aura autant de colonnes garnies que de cases cochées dans le UserForm.
Les critères seront chaque fois exprimés sous forme de formules
(par exemple, =OU('2'!D12="SD";'2'!D12="DCV";'2'!D12="EDCV";'2'!D12="IUH")).
En utilisation "normale", le filtre avancé ressemblerait à l'image jointe (dans le cas où 3 formules figureraient en Zone de critères):
J'ai ajouté des commentaires ou modifié ceux que tu avais ajouté
VB:
Private Sub BtFiltrer_Click()
Dim formules(4) As String 'déclaration d'un tableau nommé "Formules" de 5 éléments, destinés à contenir chacun une chaîne de caractères, lesquelles correspondront aux formules qui serviront de critères (A2 à E2)
cptCrit = 0
Sheets("3").[A1:E2].ClearContents 'effacer le contenu de la zone de critères
Sheets("3").[A10].CurrentRegion.Offset(1, 0).ClearContents 'effacer le contenu de la "zone en cours" démarrant en A10 de la feuille 3 (en décalant d'une ligne vers le bas, pour conserver les titres de colonnes)
For ctrl = 1 To 5 'il y a, dans le UserForm, 5 "paires" de cases à cocher / ListBox
formules(cptCrit) = "=ou(" 'chaque formule qu'on inscrira en A2:E2 (critères) commencera par un OU
trouveCrit = False 'on initialise un "flag" qui basculera à True, si au moins un élément est sélectionné dans la ListBox parcourue
For élém = 0 To Controls("Lbx" & ctrl).ListCount - 1 'on parcourt tous les items de la ListBox
'en cas de besoin, on pourrait gagner un peu de temps ici, en ne parcourant la liste que si la case correspondante est cochée
If Controls("Lbx" & ctrl).Selected(élém) Then 'si un des items est sélectionné
trouveCrit = True 'on bascule le "flag"
colonne = Application.Match(Controls("Chb" & ctrl).Caption, Sheets("2").[A11:K11], 0) 'on cherche la position (n° de colonne en feuille 2) du titre de colonne correspondant à la légende de la case à cocher associée à la ListBox
formules(cptCrit) = formules(cptCrit) & "'2'!" & Sheets("2").Cells(12, colonne).Address(RowAbsolute:=False, ColumnAbsolute:=False) & "=""" & Controls("Lbx" & ctrl).List(élém) & """;" ' explications plus bas: manque de place ;-D
End If
Next élém
If trouveCrit Then 'si le flag est à VRAI (autrement dit, si -au moins- un item de la ListBox parcourue était coché
formules(cptCrit) = Left(formules(cptCrit), Len(formules(cptCrit)) - 1) & ")" 'on supprime le dernier caractère de la formule (qui serait un ';') et on le remplace par une parenthèse fermante
Cells(1, cptCrit + 1) = "crit" & (cptCrit + 1) 'on inscrit un "titre" au-dessus de la formule
Cells(2, cptCrit + 1).FormulaLocal = formules(cptCrit) 'on inscrit la formule
cptCrit = cptCrit + 1 'on incrémente un petit compteur qui permettra de savoir quelle colonne devra être utilisée et quel élément du tableau de formules devra être rempli, quand un item aura été sélectionné dans une des autres ListBox
End If
Next ctrl
Sheets("2").[A11].CurrentRegion.AdvancedFilter Action:=xlFilterCopy, criteriarange:=Sheets("3").[A1].CurrentRegion, copytorange:=Sheets("3").[A10:K10] ' on applique le filtre avancé à la plage correspondant à la plage en cours, au départ de A11, en feuille 2, avec les critères figurant en haut de la feuille 3 et on extrait les données dans la plage A10:K10 de la feuille 3.
End Sub
Pour construire les différentes formules (là où je manquais de place), on a donc "réservé" un tableau de 5 éléments. Chaque élément contiendrait une formule. Une formule ne sera cependant créée que si, dans le UserForm, une case a été cochée et des items sélectionnés dans la liste voisine. Tu as (en bleu, tout en haut de ce message) un exemple de formule qui permettrait d'appliquer, sur la colonne D du tableau de départ, un filtre affichant uniquement les produits SD, DCV, EDCV ou IUH.
Chaque formule commencera par "=OU("
Si ces quatre items étaient sélectionnés dans la 2[SUP]e[/SUP] ListBox du UserForm, chaque fois qu'en parcourant cette liste, on rencontre un item sélectionné, on ajoute à la formule le nom de la feuille entre apostrophes, puis un point d'exclamation, puis l'adresse de la cellule, en ligne 12 de la feuille 2 (la colonne étant déterminée par la légende de la case à cocher liée à la ListBox qu'on parcourt ... ici, Produit, en colonne 4), suivie du nom du produit sélectionné; le tout ponctué d'un ';'
Chaque fois qu'on passe dans la boucle For élém ... si un item est sélectionné, la formule s'allonge:
avant le premier passage: "=OU("
après le premier item sélectionné: "=OU('2'!D12="SD";"
puis: "=OU('2'!D12="SD";'2'!D12="DCV";"
etc ...
Ouf je suis au bout ... reste à espérer que tu y comprendras quelque chose!
MarieL91 à dit:
Juste une petite question: T'aurais pas un bon livre ou site pour m'améliorer en macro ?
Des bouquins, il y en a des brouettes entières; chacun trouvera des choses qu'il estimera intéressantes ou utiles ou "à sa portée", dans tel bouquin plutôt que tel autre. C'est donc compliqué de conseiller. J'ai lu et entendu assez régulièrement des choses positives au sujet de John Walkenbach
Pour ce qui est des sites ... tu es sur le meilleur, bien sûr! David, je t'envoie mon n° de compte en banque sur simple demande
J'ai voulu modifier le code et ca ne fonctionne plus.
Je voulais rajouter un colonne de filtre.
J'ai donc refais un userform, changer le code, modifier les filtres avances mais ca ne fonctionne toujours pas...
Un petit coup de pouce ?
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.