Microsoft 365 Récupérer Item(s) sélectionné(s) de la ListBox dans une variable Array et filtre automatique tableau structuré

modus57

XLDnaute Occasionnel
Bonjour,

Dans un UserForm je récupère les Items sélectionnés dans une variable Array, ensuite je souhaiterai avec cette variable faire un filtre automatique sur un tableau structuré.

Avec un Array en dur ça fonctionne :

VB:
Range("Tableau1").AutoFilter Field:=1 'supprime le filtre

Dim Tabl()

Tabl = Array("CIAVALDINI", "GAWRONSKI", "ZAIMEN")

Range("Tableau1").AutoFilter 1, Tabl, xlFilterValues

En revanche avec Array et la variable ça ne filtre rien :

Code:
Range("Tableau1").AutoFilter Field:=1 'supprime le filtre

Dim Tabl()

Tabl = Array(ArrayDonnées)

Range("Tableau1").AutoFilter 1, Tabl, xlFilterValues

Pourtant :

Code:
MsgBox "La variable 'ArrayDonnées' contient les éléments suivants : " & ArrayDonnées, vbInformation
form-fichierslisteintuitiftextbox4-1-4 web message.jpg


Les données semblent bonnes.

Est-ce un problème de guillemets ou c’est le filtre automatique qui n’accepte pas ce type de variable ?

J’ai pas mal planché sur ce sujet sans trouver de réponse.

Auriez-vous une idée ou une solution à ce problème.

Merci d’avance.
 

Pièces jointes

  • Var_Array_Listbox_1.xlsm
    34.3 KB · Affichages: 11
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Voici :
Private Sub CommandButton1_Click()
Dim MesDonnées() As Variant
Dim j As Integer
With ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) = True Then
ReDim Preserve MesDonnées(0 To j)
MesDonnées(j) = .List(i, 0)
j = j + 1
End If
Next i
End With

Range("Tableau1").AutoFilter Field:=1 'supprime le filtre
Range("Tableau1").AutoFilter 1, MesDonnées, xlFilterValues
End Sub
 

Pièces jointes

  • Var_Array_Listbox_1.xlsm
    36 KB · Affichages: 15

modus57

XLDnaute Occasionnel
Bonjour Hasco 👍👏

Bravo et merci.

Je viens de tester ça fonction hyper bien, votre solution et bien plus simple que la mienne.

Je vous suis reconnaissant pour votre réactivité et votre contribution.

Exellente après midi et bonne soirée.
 

modus57

XLDnaute Occasionnel
Bonjour,

Je reviens sur ma demande initiale, et je modifie la question.

Dans un UserForm je récupère dans une variable Array les Items sélectionnés dans la ListBox contenant les extensions de fichiers les plus courants, ensuite je souhaiterai avec cette variable faire un filtre automatique sur un tableau structuré.

Avec le code suivant pas de problème pour filtrer le tableau :
VB:
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) Then
If temp <> "" Then temp = temp & """, """ & Me.ListBox1.List(i) Else temp = Me.ListBox1.List(i)
n = n + 1
End If
Next i
‘MsgBox "La variable 'temp' contient les éléments suivants : " & temp, vbInformation
Range("Tableau1").AutoFilter Field:=1 'supprime le filtre
Dim Tabl()
Tabl = Array("*.pdf", "*.jpg")
Range("Tableau1").AutoFilter 1, Tabl, xlFilterValues

En revanche avec le code ci-dessous le tableau est filtré avec le premier Items de la multi sélection :
Code:
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) Then
If temp <> "" Then temp = temp & """, """ & Me.ListBox1.List(i) Else temp = Me.ListBox1.List(i)
n = n + 1
End If
Next i
‘MsgBox "La variable 'temp' contient les éléments suivants : " & temp, vbInformation
Range("Tableau1").AutoFilter Field:=1 'supprime le filtre
Dim Tabl()
Tabl = Array(temp) 'FILTRE UNE SEULE SÉLECTION
Range("Tableau1").AutoFilter 1, Tabl, xlFilterValues
Quelqu'un aurait-il une idée sur ce sujet ?

S’il existe une meilleure solution de code, je suis preneur.

Merci d’avance pour votre aide.
 

Pièces jointes

  • Var_Array_Listbox_4_0_web.xlsm
    63.9 KB · Affichages: 15

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Sans avoir ouvert votre fichier : dans votre deuxième macro, temp n'est pas un tableau mais une chaine de caractères.
Array(temp) vous fait un tableau d'une seule valeur correspondant à quelque chose comme {"item1,item2,item3"} alors que vous voudriez {"item1","item2","item3"} soit un tableau de 3 items

Il vous faut splitter temp pour qu'elle devienne tableau: Tabl = Split(Temp,",")


Cordialement
 
Dernière édition:

modus57

XLDnaute Occasionnel
Bonjour Hasco,

C'est désespérant j'ai fait plein de tests avec différentes variantes :
VB:
    For i = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(i) Then
            If temp <> "" Then temp = temp & """, """ & Me.ListBox1.List(i) Else temp = Me.ListBox1.List(i)
            'If temp <> "" Then temp = """" & temp & ", " & Me.ListBox1.List(i) & """" Else temp = Me.ListBox1.List(i)
            'If temp <> "" Then temp = temp & " " & Me.ListBox1.List(i) Else temp = Me.ListBox1.List(i)
            n = n + 1
        End If
    Next i
J'ai toujours le même message : Erreur d’exécution 13 Incompatibilité de type
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re

Ce qui est surtout désespérant ce sont les demandeurs qui ne lisent pas les réponses.

est bien une chaine de caractère ?
Non c'est une ligne de code.

En début de boucle temp est une chaîne de caractères vide si vous l'avez déclarée 'as String'

En sortie de boucle temp est une chaine de caractères qui contient quelque chose.

Vous êtes inscrit depuis 6 mars 2005 et n'avez pas eu le temps depuis de suivre un tuto vba ?
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

bonjour @chti

Le tableau est déclaré : Dim Tabl() d'où l'erreur sur le Tabl = Split(Temp,";")

J'ai eu le temps d' ouvrir votre fichier ,
temps renvoie une chaine : ""*.jpg","*.txt"" les apostrophes internes sont en trop.
votre chaîne doit (pour l'utilisation que vous en faites) ressembler à "*.jpg,*.txt"
La fonction split se chargera d'entourer chaque élément interne de la chaîne des d'apostrophes nécessaires.

Mais au vu de votre macro je vous propose une autre méthode sans filtre ni split.

Dans la boucle for on cherche la position l'extension du fichier dans la chaîne temp.
toutes les valeurs des données du tableau structuré sont mises dans un tableau en mémoire pour aller plus vite.
VB:
Private Sub CommandButton1_Click()
    Dim i As Integer
    Dim tbl As Variant
    Dim temp As String
    Dim extension As String
  
    For i = 0 To Me.ListBox1.ListCount - 1
        If Me.ListBox1.Selected(i) Then
            If temp <> "" Then temp = temp & "," & Me.ListBox1.List(i) Else temp = Me.ListBox1.List(i)
        End If
    Next i

    tbl = Range("Tableau1[#Data]").Value

    For i = 1 To UBound(tbl)
        extension = Right(tbl(i, 1), Len(tbl(i, 1)) - InStr(tbl(i, 1), "."))
        '
        ' si position de extension dans temp est >0 alors on ajoute à la listbox3
        If InStr(temp, "*." & extension) > 0 Then
            With Me.ListBox3
                .AddItem
                .List(.ListCount - 1, 0) = tbl(i, 1)
                .List(.ListCount - 1, 1) = tbl(i, 2)
                .List(.ListCount - 1, 2) = tbl(i, 3)
            End With

        End If
    Next
End Sub

Au fait, ajouter .* comme extension, n'est pas vraiment pertinent ici puisqu'égal à 'toutes les exetensions' donc 'tous les fichiers'. Soit vous filtrez, soit vous prenez tous. Pas besoin de test si extension .*

Cordialement
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
3 K
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 097
Messages
2 085 257
Membres
102 844
dernier inscrit
atori2