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: