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
par contre celle ci fonctionne
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
dans le debug vous obtenez ceci
testons voir si çà fonctionne
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
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)
Testons la voir
'
voila n'hésitez pas si vous avez une amélioration, perso elle est déjà dans mon xlb
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
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, ",")
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: