Salut Curulis,
En effet, cela a de multiples applications, et je n'en ai pas encore fait complètement le tour...
Je n'ai rien inventé, j'avais trouvé une allusion en circulant, il y a pas mal de temps, trouvé l'idée intéressante, fait quelques essais, infructueux... et je n'avais pas poursuivi. Jusqu'à il y a environ un an où un demandeur s'essayait à opérer ainsi sans y parvenir à partir d'un tuto qu'il avait trouvé...
Le tuto dont je n'ai pas gardé les références étant relativement plus complet, j'ai pu trouver les points où je faisais fausse route...
La méthode décrite consistait en :
- prélèvement en tableau de la plage source (affectation d'une plage à une variable Variant qui produit un tableau VBA à 2 dimensions,
- parcours de ce tableau pour repérer les lignes répondant aux conditions cherchées, et prélèvement de ces lignes entières en utilisant INDEX, pour les affecter à un tableau unidimensionnel incrémenté au fur et à mesure,
- affectation du tableau à une plage par double transposition.
Adaptation si tu prèlèves directement à partir de la plage source sans passer par un tableau, pas besoin d'utiliser INDEX, le prélèvement fonctionne de la même façon que l'affectation d'une plage à une variable Variant.
Mais dans le cas général de parcours d'une plage, passer par l'intermédiaire d'un tableau présente des avantages car plus rapide, et la fonction INDEX offre le cas échéant des possibilités supplémentaires.
Supposons que tu affectes une plage dont tu dois extraire des lignes sous condition à une variable aa. Tu parcours le tableau produit.
For i = 1 To UBound(aa) 'ou à partir de 2 si tu as une en-tête
If aa(i, x) = Condition Then 'x=colonne testée pour la condition
Redim Preserve Tablo(n) 'Tablo=tableau dynamique de résultats à 1 dimension, n variable d'incrémentation
Tablo(n) = WorksheetFunction.Index(aa, i, 0) 'Index renvoie la matrice ligne entière en mettant l'index colonne à 0
n = n + 1
End If
Next i
Possibilités supplémentaires offertes par Index : supposons que tu doives prélever sur la ligne seulement les colonnes (au hasard !) : 1, 3, 9, 5 dans cet ordre :
Tablo(n) = WorksheetFunction.Index(aa, i, Array(1, 3, 9, 5))
va te renvoyer exactement la ligne que tu veux obtenir comme résultat.
Bonne journée à toi.