Aide gestion de projet : Filtre élaboré

Résolu
Signaler
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
Bonjour à tous,

Dans un cadre professionnel, je cherche à réaliser une interface de gestion d'une base de données de 1500 lignes sous excel 2007 et donc VB6.
Je souhaite dans un premier temps créer un userform dans lequel les personnes pourront saisir des critères pour filtrer la base de données.
Imaginons que mes critères soient : vache, cochon et renard.
Comment faire pour que mon utilisateur saisisse vache et cochon, dans un textbox par exemple, puis que ces critères soient utilisés en tant que filtre dans la colonne correspondante ?
Ou alors, est-ce plus simple et créer une série de checkbox, mon utilisateur va checker ce qu'il a besoin, puis que les valeurs de la checkbox soient utilisées en tant que filtre ?
Laquelle de ces 2 solutions vous semble la meilleure ?

En gros, comment faire pour que VBA utilise comme critère de filtre une valeur récupérée ailleurs ?

je suis débutant, même si j'arrive a peu près à lire le code.
Merci d'avance pour l'aide que vous pourrez m'apporter.

20 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,

"J'avoue être un peu dépassé par l'ampleur de la tâche" je ne trouve pas, ton analyse pour l'instant n'a pas l'air mauvaise.

Dans ton exemple "TOTO" n'est rien d'autre qu'une variable String, tout comme la propriété Name (Mais parles tu de Name ou de Caption) d'un Checkbox.

1- Pour verifier qu'un Checkbox est coché:

If CheckBox1.Value = True Then
   'Le Checkbox s'appelant CheckBox1 est cochée
End If , ----
[code.aspx?ID=41455 By Renfield]

3- Inserer
If CheckBox1.Value = True Then
   'Le Checkbox s'appelant CheckBox1 est cochée
    ActiveSheet.Range( "$A$2:$M$22" ).AutoFilter Field: =11, Criteria1:= CheckBox1.Name
    'Je passerais plutot par Caption chose que lit l'utilisateur
    ActiveSheet.Range("$A$2:$M$22").AutoFilter Field: =11, Criteria1:=CheckBox1.Caption
End If

Pour ce qui est du xlor je ne sais pas.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
"sous excel 2007 et donc VB6." BIP!!!! Raté c'est VBA (comme tu le soulignes plus bas...)

Comment fais tu actuellement le filtre?

NOTE: VBA à sa section...

Pour tes FUTURES questions penses à l'utiliser.
[infomsg.aspx Thèmes]

/ [infomsgf_VISUAL-BASIC_1.aspx Visual Basic 6] / [infomsgt_LANGAGES-DERIVES_287.aspx Langages dérivés] / [infomsgt_VBA_244.aspx VBA]
@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

Bonjour jrivet

Oui il s'agit bien de VBA ^^ je suis juste allé dans le "a propos" et c'est marqué Visual Basic 6.3 donc bon :)
Et si mon message n'est pas dans la bonne section je le déplacerai pas de souci
J'ai fait une recherche dans les forums avec les mots "filtre élaboré excel" mais sincèrement je n'ai pas trouvé grand chose, même avec 3 pages de réponses

Sinon j'ai simplement enregistrer une macro en faisant un filtre automatique et ça donne ça :
ActiveSheet.Range("$A$2:$M$22").AutoFilter Field:=11, Criteria1:="TOTO"

Je me demande comment lui faire remplacer TOTO par la propriété "name" d'une checkbox qui serait cochée.
Donc, si je comprend un peu la méthode d'écriture d'un code il faudrait :
<ol><li>vérifier quelles checkbox sont cochées</li><li>récupérer le "name" de chaque checkbox cochée</li><li>insérer cette propriété en tant que critère de filtre avec l'opérateur OU (xlOR si je ne m'abuse)</li></ol>Ou sinon, il y a toujours la possiblité de saisir le texte dans une textbox, de récupérer chaque chaine de caractère, et de les insérer etc etc
J'avoue être un peu dépassé par l'ampleur de la tâche ....

merci à tous
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

Bon c'est cool ça avance bien grâce à toi, merci !

Maintenant, je vais essayer de récupérer plusieurs données et d'en faire un filtre élaboré.
J'ai l'impression que je vais devoir m'orienter vers une boucle For Each, non ?

Bref je bidouille et je reviens :)
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

zut je peux pas éditer !?

bref il faut que je traduise la phrase suivante en script :

pour chaque checkbox cochée, récupère la valeur caption et inséère la en tant que filtre avec OU entre chaque filtre

a+
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Je ne sais pas sous 2007, mais sous les versions antérieures, les filtres n'ont que 2 critères possibles... Il te faudrait alors penser à une autre méthode.

Est-ce que tes critères sont tous dans la même colonne ?

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

Bonjour MPi

sous excel 2007 on peut faire des filtres avec plus que 2 critères, d'ailleurs le menu déroulant du filtre se présente sous la forme de cases à cocher... ^^
le problème c'est que me utilisateurs n'ont pas excel 2007 mais 2000 à tout casser....

et oui tous mes critères sont dans la meme colonnes.
Je galère un peu depuis tout à l'heure, j'ai tenté de créer un groupe de controle avec mes cases, mais je n'arrive pas a le faire fonctionner, par exemple pour toutes les sélectionner en meme temps, ou pour pouvoir rassembler celles qui sont cochées dans une seule et meme variable.
Il me manque de la théorie en VBA pour savoir exactement vers où me diriger.

Bref, j'y retourne ^_^

a+
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Si les utilisateurs ont 2000, il te faudrait développer sous cette version pour fin de compatibilité. Sinon, tu risques de travailler pour rien sachant qu'ils ne pourront probablement pas utiliser ton programme...

Tu pourrais utiliser une colonne, masquée au besoin. Dans cette colonne tu inscris un X pour chaque valeur recherchée (à l'aide d'une formule ou d'une boucle). Puis tu fais ton filtre automatique sur cette colonne.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

J'ai repris l'idée de MPi qui me parrait pas mal. mettre un x dans une colonne pour chaque valeur recherché.
J'ai trouvé ce code :

Private Sub Bouton1_Click()
Dim Ctrl As Control, r As Integer
r = ActiveSheet.UsedRange.Rows.Count
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "CheckBox" Then
    If Ctrl.Value = True Then
        ActiveSheet.Cells(r, 13) = "x"
         r = r + 1
        Else
        ActiveSheet.Cells(r, 13) = ""
    End If
End If
Next Ctrl
Set Ctrl = Nothing
End Sub
Sauf que je n'arrive pas a lui faire faire ça :

pour chaque ligne dans laquelle tu trouves la valeur de Caption corresponsant à une checkbox cochée, met un X sur cette même ligne dans la colonne tant

Quelqu'un peut m'aider svp ?

et puis 2 détails au passage :
1. je n'arrive pas à formater le code VBA dans mon message, ya un collage spécial à faire ?
2. je ne comprends pas le "Me.Controls" dans le script, ce n'est pas un objet défini genre une frame ou quelque chose, je ne sais pas ce que c'est...

merci à tous!
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
1- de quel message tu parles ? un MsgBox ?
si oui, il n'y a pas de formatage possible. Tu devras créer ton propre MsgBox en utilisant une Form et des contrôles.

2- Me est l'équivalent du UserForm dans lequel se trouve le code, sans devoir écrire explicitement son nom.
Me.Controls est équivalent à Userform1.Controls, sachant qu'on est sur un UserForm qui se nomme UserForm1, bien sûr.

Pour ton bout de code, je pense que tu y est presque.
Ce que je ferais, c'est inscrire le Caption de ces CheckBox dans une variable chaîne
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "CheckBox" Then
    If Ctrl.Value = True Then
        strTemp = strTemp & Ctrl.Caption & ";"
    End If
End If

Par la suite, une autre boucle qui parcoure ta feuille et vérifie les valeurs des cellules par rapport à la variable créée
nbLignes = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 to nbLignes
    'Change "F" pour la bonne colonne qui contient les éléments à vérifier
   If Instr(1, LCase(range("F" & I)), strTemp) > 0 Then
      Range("K" & i) = "X"
   End If
Next

Et n'oublie pas de toujours typer tes variables qui servent de compteur de lignes en LONG. Il y a 2 fois plus de lignes qu'un Integer peut contenir dans les versions précédentes à 2007. Sous 2007, c'est encore beaucoup plus de lignes, donc...
Dans ton code il y a "r" et dans le mien "nbLignes)
Dim r as Long, nbLignes As Long

Je n'ai pas testé, mais ça pourrait ressembler à cela...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

je répond vite fait sur le "message" -> il s'agissait juste de mon message dans le forum ^^
Je voyais le code dans le message au-dessus avec les couleurs et tout et je me demandais s'il y avait un copier-coller spécial

fin de la parenthèse :)
je teste et je reviens !
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

rhaaaaaa ça m'énerve !!!
:)
On y est presque !
il manque juste un tout petit truc mais je trouve pas quoi
le code que tu m'as donné met un X dans toutes les lignes de la colonne K si il trouve strTemp quelque part dans la colonne K
Mais je veux qu'il ne mette un X que dans la colonne K des lignes qui contiennent strTemp

c'est dans ce bout de code :
If Instr(1, LCase(range("F" & I)), strTemp) > 0 Then
      Range("K" & i) = "X"

Je pense que c'est dans la fonction Range, mais je peux me tromper. Il faut lui dire : Range_des lignes_ dans lesquelles tu as trouvé strTemp.

encore une fois : merci !
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Pour être certain de ne pas tourner en rond, il faudrait que tu me réexpliques ce qu'il y a comme Caption à tes Checkbox et ce qu'il y a dans les cellules et dans quelle colonne se trouvent ces valeurs.

Instr() sert à rechercher une chaîne à l'intérieur d'une autre chaîne.
Donc, si tu as 3 checkbox ayant chien, chat et souris comme Caption et qu'ils sont tous cochés, strTemp devrait contenir "chien;chat;souris".
Il s'agit donc de vérifier avec Instr() si la cellule est contenue dans strTemp

J'ai fait une petite erreur dans cette ligne
If Instr(1, LCase(range("F" & I)), LCase(strTemp))

Il manquait un LCase pour fin de comparaison. C'est toujours préférable de comparer des mots en minuscules ou en majuscules, puisque sensible à la casse...

S'il peut y avoir des espaces superflus dans les valeurs des cellules ou des Checkbox.Caption, il faudrait aussi utiliser Trim() pour les enlever.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

Ok alors je te réexplique en essayant d'être super-clair :)

Je souhaite trier un fichier en fonction de Numéros de Classes. Par exemple la classe 1 est Chien, 2 est Chat et 3 est Souris.
J'ai donc dans la colonne K les chiffres 1 2 et 3.
J'ai un userform avec des checkbox dont les Caption sont 1 ou 2 ou 3.
Si je coche la première case, strTemp deviens "1;"

Ensuite en cliquant sur un bouton, ton idée était de mettre un X dans une certaine colonne de chaque ligne qui contient strTemp (et c'est une excellente idée :))
Sauf qu'avec le code que tu m'a proposé, même si strTemp est égal à "1", il me met un X au bout de toutes les lignes, même celles qui ne contiennent pas "1" dans la colonne K.

voila pour les explications :)

Sinon j'ai pensé : peut-être qu'il faudrait récupérer le numéros de chaque ligne dans laquelle se trouve strTemp, et dans la colonne M de chacune de ces lignes, mettre un X.
Sauf que Instr renvois une valeur de -1 à 2, en gros VRAI ou FAUX, et pas du tout le numéro de chaque ligne.
J'ai donc essayé avec un Count, mais je ne suis pas assez calé pour le faire, et je n'ai pas l'impression que ce soit la bonne démarche.

Et enfin : oui il est possible qu'il y ait des espaces dans les captions, mais faisons sans pour l'instant.

Merci encore pour toute ton attention et ton intérêt.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Si tes valeurs sont des chiffres, c'est différent... Il faudrait alors comparer les valeurs numériques en les forçant en chaînes. Quelque chose comme ça, peut-être ?

If InStr(1, strTemp, CStr(Range("K" & I))) > 0 Then
   Range("M" & i) = "X"
(J'avais inversé les 2 paramètres du Instr()... mea culpa...)

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

marche toujours pas !

Instr(où on cherche, ce que l'on cherche)
donc je pense que c'est bien InStr(1, CStr(Range("K" & I)), strTemp)

mais sinon il continue a me mettre des X dans toute la colonne M, et pas que sur le ligne où il y a la valeur recherchée ....
je cherche, je cherche ... ;-)
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Peut-être que si tu copiais quelques lignes de tes données, ça pourrait aider (?)
En fait, une copie des cellules qui nous intéressent, avec les lettres des colonnes.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

Ca marche !!!

J'ai tout repris depuis le début, en suivant bien tes conseils MPi
Surtout au niveau de la déclaration des variables, j'ai aussi utilisé des msgbox au fur et à mesure pour vérifier. Enfin bref ça marche !

Merci pour tout :)

Sub Bouton1_Click()

Dim strTemp As String
Dim Ctrl As Control
Dim nbLignes As Long
Dim i As Long

For Each Ctrl In Me.Controls

If TypeName(Ctrl) = "CheckBox" Then
    If Ctrl.Value = True Then
        strTemp = Ctrl.Caption
    End If
End If

Next Ctrl

'MsgBox strTemp

nbLignes = Cells(Rows.Count, "A").End(xlUp).Row

For i = 1 To nbLignes
    'Change "F" pour la bonne colonne qui contient les éléments à vérifier
 If InStr(1, LCase(Range("K" & i)), LCase(strTemp), vbTextCompare) > 0 Then
   Range("M" & i) = "X"
   
   End If

Next

End Sub
Messages postés
14
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
24 avril 2008

Hop c'est re-moi !

Bon ya encore un piti problème en fait
A priori il faut lui dire de regarder entre chaque " ; ", puisque avec strTemp chat; ça marche mais dès que j'ai strTemp chat;chien; ça ne marche plus :(

Je pense qu'il faut lui dire, dans
If InStr(1, LCase(Range("K" & i)), LCase(strTemp), vbTextCompare) > 0 Then
de rechercher n'importe quelle valeur comprise entre ";"

J'ai essayé en imbriquant un Mid dans un Instr à cet endroit, mais Mid réclame un nombre de caractère genre Mid("12345678", 4, 3) = 456

du genre Instr(1, Mid (strTemp, 1, Trim(strTemp)))
totalement tiré par les cheveux ^_^

J'ai cherché a peu près le meme mais genre avec Mid("chat;biere blanche", 1, ";") mais forcémenent ça ne marche pas :(

Ou alors faut- il faut faire autrement ?

Je te joins mon classeur
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Non, en principe, le Instr devrait trouver la partie de texte à l'intérieur de l'autre. C'est la raison du séparateur pour éviter que la fin d'un mot et le début d'un autre soit équivalent à un troisième mot...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI