VBA: Chercher des donnees en fonction d'autre donnees

MarieL91

XLDnaute Nouveau
Bonjour a tous, :)

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
    23.3 KB · Affichages: 42

Lolote83

XLDnaute Barbatruc
Re : VBA: Chercher des donnees en fonction d'autre donnees

Salut MarieL91,
Pourquoi ne pas utiliser un TCD comme critère de filtre.
Voir fichier joint avec onglet TCD
@+ Lolote83
 

Pièces jointes

  • Copie de MARIEL91 - Recuperer des donnees en fonction d'un filtre.xlsx
    32.1 KB · Affichages: 48

Modeste

XLDnaute Barbatruc
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 :eek:)

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")

Vois déjà si "je n'ai pas tout faux"

Salut Lolote83
 

Pièces jointes

  • Filtre par UserForm (MarieL91).xlsm
    44.9 KB · Affichages: 60

MarieL91

XLDnaute Nouveau
Re : VBA: Chercher des donnees en fonction d'autre donnees

Bonjour Lolote83 et modeste,

Deja merci d'avoir pris le temps de m'aider !!

Ceux sont de tres bonnes pistes je vais pouvoir travailler avec ca! Comme dis Modeste il faut bien que je m'occupe ! ^^

Merci encore !

Bonne journee a vous deux
 

MarieL91

XLDnaute Nouveau
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

Si vous avez encore du temps a m'accorder^^

Merci !

Bonne journee
 

Modeste

XLDnaute Barbatruc
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 ... :confused: ... 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.
 

Pièces jointes

  • Filtre par UserForm (MarieL91) (v3.2).xlsm
    37.1 KB · Affichages: 65
Dernière édition:

Modeste

XLDnaute Barbatruc
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?
 

MarieL91

XLDnaute Nouveau
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 ?

Merci encore !!

Bonne journée!
 

Modeste

XLDnaute Barbatruc
Re : VBA: Chercher des donnees en fonction d'autre donnees

Bonjour :)

MarieL91 à dit:
Non je ne vis pas la nuit mais juste à l’étranger^^
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 :D

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):
FiltreAvancéMarieL91.png

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 :p
 

MarieL91

XLDnaute Nouveau
Re : VBA: Chercher des donnees en fonction d'autre donnees

Bonjour !

Whao un grand merci pour ses explications et ton temps!!

Avec ca j'ai résolu mon problème le fichier fonctionne a la perfection. ^^

Je vais me mettre sérieusement aux filtres avances.

Merci encore !

Bonne journée
 

MarieL91

XLDnaute Nouveau
Bonjour,

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 ?

Merci

Bonne journee
 

Pièces jointes

  • fichier4.xlsm
    270.6 KB · Affichages: 50

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 009
Membres
101 865
dernier inscrit
MLL