filtrer avec plusieurs critères en VBA

blancolie

XLDnaute Impliqué
Bonsoir le forum;

Dans ce fichier ci-joint et dans l'onglet données planning un filtrage avec plusieurs critères.Dans la feuille données planning j'ai mis en H1 , J1 et L1 et c'est dans les cellules au fond gris qu'on met les critères.

Je m'explique : le code suivant :

VB:
Option Explicit
Option Compare Text    'la casse est ignor?e
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Sh As Worksheet, col&

    Set Sh = ThisWorkbook.Sheets("Données Planning")

    [A1].AutoFilter 'ca peux etre ca tout simplement


    Select Case Target.Address(0, 0)
    Case "I1": col = 3
    Case "K1": col = 4
    Case "M1": col = 5
    Case Else: col = 0:
    End Select

    If Target.Value <> "" And col <> 0 Then
        [A1].AutoFilter Field:=col, Criteria1:=Target.Value
    Else
        Sh.AutoFilterMode = False
    End If
End Sub



Ce code suivant qu'un membre m 'a gentiment construit en répondant à mon post précédent marche bien mais j'aimerais avoir un filtrage qui va plus dans le détail c'est a dire quand je sélectionne l'agent, j'aimerais qu'on puisse filtrer les différentes permanence et les différents périodes du même agent. j'espère avoir été assez clair. j'aimerais aussi faire l'inverse à partir de la période.

Si aucune cellule contenant de critères, faut que le filtrage s'efface. Peut-être que à partir d'un bouton, on peut réinitialiser mon petit menu ?

Cette liste est amené à s'agrandir ou à être diminué, don cil faut que le codage prenne en compte les rajouts de lignes ou de suppressions sinon, je risque d'avoir un erreur.

Merci à vous.

pouvez vous me mettre en parallèle le code au cas ou je n'arrive pas à ouvrir le fichier. cela m'arrive quelquefois a cause du vba. Merci à vous
 

Pièces jointes

  • Astreinte-exemple.xlsm
    119.8 KB · Affichages: 129
Dernière édition:

blancolie

XLDnaute Impliqué
Bonsoir,

tout me semble pourtant bien codé pourtant cela ne donne le résultat escompté.

seul cette ligne, je n'arrive pas à la cerner : Case 9, 11

cette ligne interprète quoi ?

le problème se situe ds l'onglet BDD_Fleurs

Voyez vous le problème ?

Merci pour votre aide.
 

Pièces jointes

  • BDD_fleurs.xlsm
    78.6 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Bonjour blancolie,

Je te laisse tester le Système de Filtrage.
Le bouton « EFFACER » est fonctionnel.

Pour le code VBA :

* J'ai beaucoup modifié la sub Worksheet_Change()
* J'ai ajouté Module1 et la sub ClrSysFilt()

À te lire pour avoir ton avis.


soan
 

Pièces jointes

  • BDD_fleurs.xlsm
    79.2 KB · Affichages: 7
Dernière édition:

blancolie

XLDnaute Impliqué
Bonsoir Soan,

merci pour ton travail et cela fonctionne de merveille. mais tu me compliques encore les choses pour comprendre le VBA lol.
l'etiquette goto 1représente quoi ? si colonne different de 8 alors c'est +1

je suppose que ta variable k représente la colonne K.
if.address(0, 0) = cellule a vide ?

et Fn c'est le tableau ?
et l'autre module, c'est pour effacer.

merci en tout cas.
 

soan

XLDnaute Barbatruc
Inactif
Bonjour blancolie,

Je suis ravi que cela fonctionne à merveille ! :) (surtout que ça n'a pas été facile !)

-----------------------------------------------------------------------------------------------------

Le « 1 » qui est devant la ligne du Dim est une « étiquette de ligne », et sert pour pouvoir
y faire un branchement, avec « GoTo 1 ».

Tu as écrit : « si colonne différent de 8 alors c'est +1 » ; pourquoi donc as-tu mis le signe
« + » ? ce n'est pas ça ! c'est : « si colonne différent de 8 alors aller à 1 » ; donc : si la
colonne est autre que la colonne H, alors se brancher sur l'étiquette 1 ➯ ça continue
l'exécution du programme au début de la 2ème partie ; pourquoi c'est par rapport à la
colonne H ? parce que c'est en H7:H23 (lignes impaires seulement) que tu saisis les
critères de filtre (il y a aussi le critère de K11, mais ce cas est traité différemment).


-----------------------------------------------------------------------------------------------------

Voici maintenant une chose très importante à comprendre : pour la 2ème partie de la sub
(à partir de l'étiquette 1), il est obligatoire d'afficher toutes les lignes (.ShowAllData), afin
que Range("F" & Rows.Count).End(xlUp)(3) retourne le bon n° de ligne ; rappel : c'est dans :
tablo = Range("F27", Range("F" & Rows.Count).End(xlUp)(3)) ; or pour le système de filtrage,
il ne faut pas que toutes les lignes soient affichées, car c'est un système qui fait qu'on
doit pouvoir choisir plus d'un critère de filtre ➯ un filtre donné est appliqué en plus de ceux
qui ont précédé
; et quand tu veux retrouver toutes les données du tableau, tu fais un clic
sur le bouton "EFFACER" ; tout ce que je viens de décrire explique pourquoi j'ai dû inverser
l'ordre des 2 parties
: impossible de faire autrement ! donc en laissant les 2 parties dans
l'ordre initial, tu n'aurais tout simplement jamais pu y arriver ! (ni moi non plus !)

S'il n'y avait eu que la 1ère partie actuelle du système de filtrage, ça aurait été beaucoup
plus simple, car il n'y aurait eu aucun risque d'interférences entre les 2 parties ; de plus,
au lieu des trois GoTo 1 que tu vois dans la 1ère partie, j'aurais mis Exit Sub (pour sortir
de la sub)
; mais je n'ai pas mis Exit Sub car justement, il faut exécuter effectivement la
2ème partie quand il ne s'agit pas du système de filtrage (ça va ? tu as bien tout suivi ?
j'espère que oui, car je ne vois pas comment l'expliquer plus simplement ! si tu as un peu
mal à la tête, je te conseille de prendre un cachet d'aspirine ; par exemple de l'Aspro ou
du Dolliprane : le paracétamol est très efficace)
.

-----------------------------------------------------------------------------------------------------

Tu as écrit : « je suppose que ta variable k représente la colonne K. » ; désolé, ce n'est pas
du tout ça ! regarde il est utilisé : [F26].AutoFilter k, .Value et [F26].AutoFilter k ; c'est
donc le de la colonne à filtrer (ou à défiltrer) ; ce n° colonne étant à partir de 1 pour
la colonne "Plante", car on est dans un Tableau structuré : ce n'est pas le 6 que tu avais
mis pour la colonne F ; rappel : le 1er paramètre de Autofilter est le champ Field ; ici k ;
enfin, note que pour K11 (qui est le critère Marché), k vaut 3 ; quelle est la 3ème colonne
du tableau T_Datas ? c'est la colonne "Marché" ; oh, quel heureux hasard !!! ça tombe
drôlement bien, hein ? ;)


-----------------------------------------------------------------------------------------------------

Tu as écrit : « If .Address(0, 0) = cellule à vide ? » ; désolé, ce n'est pas ça non plus ! avec
.Address, ça retourne par exemple $B$5 ; avec .Address(0, 0), ça retourne B5 (adresses
relatives pour la colonne et pour la ligne)
➯ j'ai mis If .Address(0, 0) = "K11" Then à la
place de If .Address = "$K$11" Then ; tu peux lire plus facilement les adresses sans
signe « $ » ; c'est juste une commodité de lecture, et on ne vide pas de cellule ! :p

-----------------------------------------------------------------------------------------------------

Tu as écrit : « FN c'est le tableau ? » ; oui, c'est bien ça !!! FN pour « Field Numbers » ;
ce sont des numéros de colonnes à filtrer ; pour les 9 critères de filtres en H7:H23
(lignes impaires seulement), le n° ligne va de 7 à 23 (9 nombres impairs seulement) ;
ces 9 nombres impairs de 7 à 23, je les « ramène », par un calcul un peu spécial, à
9 nombres de 0 à 8 ; et c'est ce nombre que j'utilise pour lire le tableau FN ; ça m'a
donc permis de faire un lien entre le n° de ligne d'un critère de filtre et le n° de la
colonne
à filtrer
; exemple concret : le critère Densité est en H21 ; n° ligne : 21 ; mon
calcul spécial le « ramène » à 7 ; FN(7) vaut 30 ; et quelle est la colonne n° 30 dans
le tableau T_Datas ? je te le donne en mille ! bingo !!! c'est la toute dernière colonne,
celle que tu as appelé "Densité/m2" ; c'est formidable, pas vrai ? encore un heureux
hasard qui fait bien les choses !!! ben dis donc, t'es vernie, hein ? t'as encore plus de
chance qu'à la loterie ! :p comment ? tu voudrais un autre tube d'aspirine ? bon,
ok, si tu veux : je comprends que ce n'est pas particulièrement facile ! :rolleyes:


-----------------------------------------------------------------------------------------------------

Tu as écrit : « l'autre module, c'est pour effacer » ; oui, c'est bien ça aussi !!! ben dis donc,
tu progresses ! c'est bien, ça !!! ;) effectivement, dans Module1, la sub ClrSysFilt() sert
à effacer les critères de filtres (H7 à H23, impairs seulement ; et K11) ; mais pas
que ça :
comme on vient d'effacer les critères de filtres, d'une part ça montre toutes les données :
If .ShowAutoFilter Then .AutoFilter.ShowAllData (le test If permet d'éviter qu'on désactive
le filtre automatique s'il est déjà activé) ; d'autre part, si le filtre automatique de T_Datas
était désactivé, ça active ce filtre automatique ; ooooopppps ! cette fois je crois que toute
la pharmacie va y passer, pas seulement le tube d'aspirine !!! :p ah, ben c'est toi qui a
cherché, hein ? tu m'pose plein d'questions ; moi, j'essaye de t'répondre de mon mieux !
bon allez, t'as l'droit d'prendre quelques vacances bien méritées, surtout si t'as réussi à
comprendre toutes mes laborieuses explications ! ;):)


soan
 

blancolie

XLDnaute Impliqué
Bonjour,

Non, je n'ai pas eu vraiment besoin de dolipranne par contre j'ai du mettre le GPS en route pour me retrouver (lol). Non, je plaisantes. Tout est clair et compréhensible. le problème du vba, je me rencontre que tout le monde code différemment donc dur de se retrouver.

Dans ce fichier, j'ai crée une ligne effacer plante et ligne. Est ce possible de créer par VBA la possibilité de supprimer la plante sélectionner dans la liste déroulante et si plusieurs fois la même plante (identique) . Je ne sais pas si c'est realisable.

en tout cas merci.
 

Pièces jointes

  • BDD_fleurs v2-1.xlsm
    81.6 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Re,

J'essayerai de voir ça plus tard ; en attendant, j'aimerais bien que
tu écrives sous mon post #11 ce que tu en as pensé ! ;)

J'ai fait un très gros boulot, alors j'aimerais savoir si ça marche
correctement : je n'ai même pas cherché à tester moi-même,
car tu n'avais pas mis suffisamment de données ! (et je ne
voulais pas perdre de temps à en inventer ! :p)

À te lire sur l'autre sujet ! :)


soan
 

soan

XLDnaute Barbatruc
Inactif
Bonjour blancolie,

Je te laisse relire la sub LignePlante() : j'ai fait plusieurs changements ; entre autres,
tu remarqueras que la variable b n'existe plus ; il n'y a plus de MsgBox, car inutile :

a) si la plante n'est pas trouvée, elle est ajoutée sous la dernière ligne du tableau ;
la cellule active (ton « curseur ») est devant la ligne ajoutée, colonne E.

b) si la plante est trouvée, son nom n'est pas ré-écrit, et les autres éléments sont
modifiés
; ton « curseur » est devant la ligne modifiée, colonne E.

Je te laisse faire les tests pour vérifier que ça marche bien dans les deux cas,
même après avoir modifié la sub.


--------------------------------------------------------------------------------------------

Pour la demande de ton post #55, j'ai ajouté la sub ClrPlante(), qui affichera
un message dans tous les cas ; s'il y a plusieurs lignes avec la même plante,
elles seront toutes supprimées ; comme d'hab, à toi de faire les tests. ;)

Tu peux aussi faire Ctrl e pour effacer la plante affichée en W23 (si elle existe).

À te lire pour avoir ton avis.
:)

soan
 

Pièces jointes

  • BDD_fleurs v3.xlsm
    83.3 KB · Affichages: 7

blancolie

XLDnaute Impliqué
Cool, cela marche très bien, cette feuille est pratiquement opérationnel (lol). Je ne sais pas si le plus facile, c'est d'activer le bouton efface pour effacer toute les cellules de la partie recopier ou d'ajouter une ligne qui effacera les cellules après transfert. sur le fichier ci-dessus.
 

soan

XLDnaute Barbatruc
Inactif
Je suis content d'apprendre que ça marche très bien ! :)

« effacer toute les cellules de la partie recopier » : merci d'indiquer clairement la position
de ces cellules, donc les références de cellules avec lettres de colonnes et n° de lignes.

« ajouter une ligne qui effacera les cellules après transfert » : idem !

-------------------------------------------------------------------------------------------------

Je t'ai mis un complément d'infos sur ton autre sujet ; c'est mon post #14.

(merci de m'indiquer sous le post #14 ce que tu en penses. ;))


soan
 

Discussions similaires