Filtrer une colonne avec un array de nombres avec Autofilter(patricktoulon)

patricktoulon

XLDnaute Barbatruc
bonjours a tous
Avez vous deja essayé de filtrer une colonne avec un array de nombre
si oui vous avez pu constater que c'est pas possible
c'est ballo!
exemple ceci ne fonctionnera pas
VB:
Sub testA()
Dim arr2
arr2 = Array(435, 467, 535, 768)
ActiveSheet.Range("B1:B100").AutoFilter Field:=1, Criteria1:=arr2, Operator:=xlFilterValues
End Sub


par contre celle ci fonctionne
Code:
Sub testB()
Dim arr2
arr2 = Array("435", "467", "535", "768")
ActiveSheet.Range("B1:B100").AutoFilter Field:=1, Criteria1:=arr2, Operator:=xlFilterValues
End Sub
comme vous pouvez le constater les items sont englobés dans des guillemets ce qui force vba a utiliser le filtre textuel et non le filtre numérique

alors c'est bien beau mais si on a un array plus important c'est la prise de tète a coder
sans parler de l’éventualité ou cet array pourrait être issue d'une source (range) numerique


je vous propose une solution simple
nous allons modifier l'array en argument textuel
et non!!..... mettre des doubles ou triples guillemets dynamiquement par VBA ne fonctionnera pas !!!! c'est ballo!!!

non en fait nous allons transformer les valeurs des items en valeurs catégoriques
avec le symbole"=" si je puis m'exprimer ainsi ;)

et l'astuce est justement la !




reprenons notre array et transformons le
VB:
arr2 = Array(435, 467, 535, 768)
arraystring = "=" & Replace(Join(arr2, ","), ",", ",=")
Debug.Print arraystring
arr2 = Split(arraystring, ",")
dans le debug vous obtenez ceci
Code:
=435,=467,=535,=768

testons voir si çà fonctionne
Code:
Sub test()
Dim arr2, arraystring$
   arr2 = Array(435, 467, 535, 768)
   arraystring = "=" & Replace(Join(arr2, ","), ",", ",=")
   Debug.Print arraystring
   arr2 = Split(arraystring, ",")
   ActiveSheet.Range("B1:B100").AutoFilter Field:=1, Criteria1:=arr2, Operator:=xlFilterValues
End Sub

youpi!! Autofilter fonctionne avec un array numérique

pour que les choses soient claire
en fait le"=" on s'en fou on est pas obligé de le mettre je le met pour l'aide a la compréhension
l'astuce réside simplement au fait que les items du split(join...) sont désormais des string meme si c'est des nombres

bon il nous reste éventualité que l'array soit une plage de cellule

ben on fait la même chose

Code:
Sub testC()
    Dim arr2, arraystring$
    arr2 = Application.Transpose([E1:E4].Value)
    arraystring = "=" & Replace(Join(arr2, ","), ",", ",=")
    Debug.Print arraystring
    arr2 = Split(arraystring, ",")
    ActiveSheet.Range("B1:B100").AutoFilter Field:=1, Criteria1:=arr2, Operator:=xlFilterValues
End Sub


et pour une réutilisation et /ou disponibilité de l'astuce dans tout nos classeur on pourrait faire une petite fonction dans le xlb ou un xla(m)
Code:
Function ValideNumericArrayForFilter(arr)
    Dim arraystring$
    arraystring = "=" & Replace(Join(arr, ","), ",", ",=")
    ValideNumericArrayForFilter = Split(arraystring, ",")
End Function

Testons la voir
Code:
Sub testFINAL()
    Dim arr2
    arr2 = Application.Transpose([E1:E4].Value)
    arr2 = ValideNumericArrayForFilter(arr2)
    ActiveSheet.Range("B1:B100").AutoFilter Field:=1, Criteria1:=arr2, Operator:=xlFilterValues
End Sub
'


voila n'hésitez pas si vous avez une amélioration, perso elle est déjà dans mon xlb
 
Dernière édition:

Discussions similaires

Réponses
38
Affichages
4 K