Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2011, 11h10   #1
Invité régulier
 
Femme
Étudiant
Inscription : août 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 63
Points : 6
Points : 6
Par défaut recherche multi critères

Bonjour,

Voilà j'ai un tableau de donnée dont la colonne A correpond à une pièce mécanique et les colonnes suivantes ces caractéristiques techniques. Je voudrais pouvoir trouver les pièces mécaniques correpondant à une recherche sur plusieurs critères.

J'ai donc pour cela un userform avec 3 textbox. J'aimerais donc que lorsque je renseigne la première case il me trouve toutes les pièces ayant la meme valeur (exemple si je dis que la première case correpond au poids je veux trouver toutes les pièces de 80 kg (80 étant la valeur que je rentre dans la textbox et qu'il cherche dans le tableau)). Mais ensuite j'aimerais pouvoir renseigner la deuxième case et qu'il viennent chercher parmis les pièces qu'il a trouvé avec la première recherche et ainsi de suite.

Au départ j'avais un fichier qui cherchais selon un seul critère et je faisais un copier coller des lignes qui m'interessait. J'ai pensé refaire cette démarche mais cela signifie qu'il faut que je colle à un endroit pour ma première recherche puis que je vienne chercher dans les lignes collées pour la deuxième .... ce qui me parait assez long et fastidieux. Auriez vous une idée de comment m'y prendre pour avoir quelquechose d'assez simple. Faut-il utiliser des boucles imbriquées?

Merci de votre aide ( je précise que je ne demande pas qu'on me donne le code pour faire ce que je veux mais les fonctions à utiliser pour le créer !)

Julien
JulienLeno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h31   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
avant tout pourquoi ne pas utiliser un filtre automatique (menu données)
bbil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 12h42   #3
Invité régulier
 
Femme
Étudiant
Inscription : août 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 63
Points : 6
Points : 6
j'ai un fichier sur lequel sont mis des filtres automatiques. C'est juste une question pratique. Le fait d'avoir un menu est plus plaisant pour l'utilisateur.
JulienLeno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 12h54   #4
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Bonjour,

Il ne te faut pas 3 textbox, mais 3 Combobox, car même pour le premier, c'est absurde de rentrer une valeur non présente.

Ensuite pour les alimenter, il faut effectivement utiliser les filtres auto (via VBA), pour gérer tes combos en cascade.
  • Le premier permet de choisir une valeur existante et son alim est dans l'initialize de ton USF
  • l'alim du deuxième est déclenchée par le Change du 1er et ne propose donc que le choix qui en dépend.
  • idem en série pour le 3ème..

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 13h08   #5
Invité régulier
 
Femme
Étudiant
Inscription : août 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 63
Points : 6
Points : 6
D'accord je vois ce que tu veux dire. Cà me semble pas mal pour ce que je veux faire. Mais par contre je vois pas comment je donne à la deuxième combobox la plage de donné (l'alim) qui est filtré a partir du premier combobox?
JulienLeno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 15h38   #6
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Bonjour,

Tu mets en critère de filtre ce qui a été sélectionné dans le combo1 du genre :
Code :
1
2
3
4
 'haut de module
Option Explicit
Option Base 1
Dim strNomcombo As String
Code :
1
2
3
4
5
6
7
8
9
10
 
Private Sub cb1Toto_Change()
Dim strColonneCible As String
MaPlage.AutoFilter Field:=Range("Toto").Column, Criteria1:="=" & cbo1Toto.Text, Operator:=xlAnd
 Me.Controls("cbo2Plop").Clear
Me.Controls("cbo3Glup").Clear
 strColonneCible = "Plop"
strNomcombo = "cbo2Plop"
Call AlimCbo(strColonneCible)
End sub

ensuite :

Code :
1
2
3
4
5
6
7
8
9
10
Private Sub cbo2Plop_Change()
Dim strColonneCible As String
MaPlage.AutoFilter Field:=Range("Toto").Column, Criteria1:="=" & cbo1Toto.Text, Operator:=xlAnd
MaPlage.AutoFilter Field:=Range("Plop").Column, Criteria1:="=" & cbo2Plop.Text, Operator:=xlAnd
Me.Controls("cbo3Glup").Clear
 strColonneCible = "Glup"
 strNomcombo = "cbo3Glup"
Call AlimCbo(strColonneCible)
 
End sub
et à chaque fois tu mets un cboxx.Clear sur les cbo qui dépendent de celui considéré pour les vider de sorte que si hiérarchiquement on change le choix du dessus ça annule tous les choix dépendants qui pourraient perdurer sans être cohérents.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub AlimCbo(ByVal strColonneCible As String) ' alims basées sur filtre auto
Dim objPlageCible As Range
Dim cell As Range
Dim I As Long
Dim tboLignesOK() As Variant
Dim colCollectionPass2 As Collection
 
Set objPlageCible = Worksheets("Base").AutoFilter.Range.Columns(Range(strColonneCible).Column).SpecialCells(xlCellTypeVisible) 'on se base sur la colonne 1 (numID)
'on évite la ligne de titres plus bas...
Set colCollectionPass2 = New Collection
Me.Controls(strNomcombo).Clear ' vide la liste pour éviter l'accumulation en cas d'appels répétitifs.
On Error Resume Next ' filtre les doublons via utilisation de la collection
For Each cell In objPlageCible
    If cell <> "" Then colCollectionPass2.Add cell, CStr(cell)
Next cell
On Error GoTo 0
For I = 2 To colCollectionPass2.Count 'Alimentation du cbo, on commence à I = 2 pour éviter la ligne de titre
    Me.Controls(strNomcombo).AddItem colCollectionPass2(I)
Next I
 
Set objPlageCible = Nothing
Set colCollectionPass2 = Nothing
Worksheets("Base").AutoFilterMode = False 'retire les filtres auto
End Sub
PS : j'avais cliqué trop vite, il n'y en avait qu'une partie, je l'extrais d'un truc plus complexe, l'idée est là, faire signe s'il y a des manques ...

Mettre aussi des lignes de contrôles, activation des filtres auto etc...


cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h19   #7
Invité régulier
 
Femme
Étudiant
Inscription : août 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 63
Points : 6
Points : 6
Tu vas un peu trop vite pour moi mais je vais essayer de comprendre.

Bon pour filtrer avec une combobox ok je vois comment çà marche. Le truc que je ne parviens pas a comprendre c'est comment la seconde combobox fait pour ne prendre que les valeurs filtrées par la première. Autre chose, si je ne renseigne pas ma première combobox et que je veux filtrer qu'avec la deuxième çà fonctionne encore?

Désolé d'être lent à la détente mais je débute.

merci

julien
JulienLeno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h23   #8
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Bonjour,

vois la remarque le premier jet n'était pas complet.

Sinon, cette approche est conçue pour que les combo dépendantes soient vierges de choix si on n'a pas renseigné la précédente et soient réinitialisées si on e change une hiérarchiquement plus élevée... en toute logique.

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 16h45   #9
Invité régulier
 
Femme
Étudiant
Inscription : août 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 63
Points : 6
Points : 6
Ah oui j'avais pas fais gaffe. Bon çà n'empèche que je ne comprend pas beaucoup de choses!

Qu'est ce que: strColonneCible? Pourquoi y a-t-il des str partout c'est juste le nom de tes variables?

Qu'est ce que c'est AlimCbo dans l'expression
Code :
Call AlimCbo(strColonneCible)
Et la fin pour moi c'est du chinois.

Cet instruction sert a quoi? A donner l'endroit et les colonnes que l'on doit voir?

Code :
Set objPlageCible = Worksheets("Base").AutoFilter.Range.Columns(Range(strColonneCible).Column).SpecialCells(xlCellTypeVisible)
Qu'est ce qu'un collection?

Merci
JulienLeno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 18h13   #10
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Citation:
Pourquoi y'a t'il des str partout c'est juste le nom de tes variables?
voir : 2-1-2. Syntaxe des conventions pour les variables
du coup avec les préfixes je sais d'un coup d’œil que strxxxx est (ou devrait être) une variable String.

Citation:
Qu'est ce que c'est AlimCbo dans l'expression

Code :
Call AlimCbo(strColonneCible)
voir : Procédures et Fonctions : ftp://ftp-developpez.com/bidou/Cours...rmationVBA.pdf

A partir du moment où un code va être réutilisé à l'identique plusieurs fois à quelques variables près, il faut le mettre dans une procédure indépendante, c'est plus léger, plus lisible et infiniment plus maintenable.

Call : voir aide VBA...

Citation:
Cet instruction sert a quoi? A donner l'endroit et les colonnes que l'on doit voir?

Code :
Sélectionner tout - Visualiser dans une fenêtre à part

Code :
Set objPlageCible = Worksheets("Base").AutoFilter.Range.Columns(Range(strColonneCible).Column).SpecialCells(xlCellTypeVisible)
voir variables objet : http://silkyroad.developpez.com/VBA/LesVariables/#LII-K

Citation:
Qu'est ce qu'un collection?
IV-B. Quelques informations sur l'objet Collection

Il y a toutes les réponses sur DVP dans la FAQ et les Tutos

Il faut y aller pas à pas, les liens cités sont très explicites et s'aider de l'aide VBA aussi mot à mot si besoin pour comprendre la construction simple à lire ensuite...

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h11   #11
Invité régulier
 
Femme
Étudiant
Inscription : août 2011
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : août 2011
Messages : 63
Points : 6
Points : 6
Je te remercie pour ton aide et je suis entrain d'essayer de mettre en place le programme. Toutefois j'ai toujours un problème lorsque je ne renseigne pas toutes les combobox. Si je ne renseigne que la deuxième je n'ai aucun choix puisque celui ci découle de la première non??

Ceci est un point important de ma fonction. Ne pas avoir à remplir toutes les cases. Y a-t-il un moyen d'y parvenir?

Merci

Julien
JulienLeno est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h52   #12
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Bonjour,

Oui, mais la logique n'est plus la même et ne correspond plus à la question initiale.

Pour y arriver, il faudrait qu'à l'aide de ce qui a été vu tu te familiarise avec les commandes et la syntaxe employées.
Une fois que pour toi la lecture / traduction du code sera devenue claire et que tu peux enchaîner une quatrième combo par exemple...
Tu prends un crayon et un papier et tu mets noir sur blanc ce que tu veux faire avec les différentes implications, ce que tu permets, ce qu'il faut éviter etc..

Et à partir de là tu crée la liste des outils ( contrôles activex dont tu as besoin et tu codes).

Et au final tu t'aperçois que tu a gagné du temps et que tu n'as pas galéré comme un fou.

A vue de nez, je dirais que sur ton cas, tu peux alimenter tes 3 combos via l'initialize de l'USF, puis ensuite appliquer le code précédent remanié un peu sur les évènements change des combos voulus.

précieux : http://silkyroad.developpez.com/VBA/ControlesUserForm/

Reste à mettre résolu sur ce fil et à revenir poser des question focalisées si tu bloques sur des points précis ensuite.

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h51.


 
 
 
 
Partenaires

Hébergement Web