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
où il est utilisé :
[F26].AutoFilter k, .Value et
[F26].AutoFilter k ; c'est
donc le
n° 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 !
-----------------------------------------------------------------------------------------------------
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 ! comment ? tu voudrais un autre tube d'aspirine ? bon,
ok, si tu veux : je comprends que ce n'est pas particulièrement facile !
-----------------------------------------------------------------------------------------------------
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 !!! 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