xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008
-
22 avril 2008 à 09:05
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 2018
-
24 avril 2008 à 12:22
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.
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 22 avril 2008 à 09:49
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.
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 22 avril 2008 à 09:36
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 ....
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 22 avril 2008 à 10:12
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 :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 22 avril 2008 à 11:34
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
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 22 avril 2008 à 11:57
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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 22 avril 2008 à 12: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
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 22 avril 2008 à 15:45
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...
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 22 avril 2008 à 22:55
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
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 23 avril 2008 à 08:15
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
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 23 avril 2008 à 09:27
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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 23 avril 2008 à 10:39
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
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 23 avril 2008 à 11:07
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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 23 avril 2008 à 11:49
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
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 23 avril 2008 à 16:32
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 ... ;-)
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 23 avril 2008 à 22:50
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
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 24 avril 2008 à 10:45
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"
xiombarg2911
Messages postés14Date d'inscriptionmercredi 12 septembre 2007StatutMembreDernière intervention24 avril 2008 24 avril 2008 à 12:16
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 :(
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 24 avril 2008 à 12:22
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