[Déplace]VBA EXCEL : macro pour filtrer avec plusieurs choix:

Résolu
guiguigui69008 - 16 août 2012 à 11:33
 guiguigui69008 - 17 août 2012 à 10:51
Bonjour, et j'espère que je ne me suis pas trompé de section pour mon post:

Voila mon problème :

je suis débutant en programmation, et je créé des macro a partir de long fichiers excel, afin de créer des documents de synthèse exploitable par mes collègues.

Explication:

J'ai une liste de pièces dans mon stock, chaque pièce a une référence.
dans cette liste, je souhaite extraire une liste de certaine pièce seulement. Ces pièces sont définit.
Mes colonnes sont triées.
Mon objectif est donc de créer un formulaire, ou je coche les pièces dont je veux voir apparaitre la synthèse des stock. jusque la, pas de problème.

ma méthode était la suivante : a chaque nom de pièce dans le formulaire correspond plusieurs variable auquel j'ai attribué mes références de pièces.
Donc selon le nombre de case que je coche, je veux filtré mon tableau pour ne voir apparaitre que les pièce qui m'intéresse ( je coche la case, qui active des variable, ces variables sont des numéro qui correspondent a mes référence de pièce, ensuite je filtre avec ces références dans ma colonne référence)
J'ai trouvé la méthode "Array" quand j'ai enregistrer une macro et que j'ai fait cocher mes cases dans le menu de tri mais quand je le fais a la souris, il affiche tous les choix, et quand je le fait par la macro avec les variable, il ne me fait pas la même chose ( au mieux, il les fait défiler et s'effacer après...
J'ai un petit doute aussi sur le fait de mettre les variable a 0 quand je ne coche pas la case...

4jours que je suis la dessus, et je commence a devenir fou.

Merci d'avance pour votre aide.

Voila mon bout de code de ma checkbox, je voulais poser le fichier, mais je n'ai pas trouvé comment insérer une pièce joint...

Option Explicit
Public a1 As Integer
Public a2 As Integer
Public b1 As Integer
Public b2 As Integer
Public b3 As Integer
Public c1 As Integer
Public c2 As Integer
Public d1 As Integer
Public d2 As Integer
Public d3 As Integer
Public e1 As Integer
Public e2 As Integer

Private Sub CheckBox1_Click()
    If CheckBox1.Value = True Then
        a1 = 22
        a2 = 47
    Else
        a1 = 0
        a2 = 0
    End If
                   
End Sub

Private Sub CheckBox2_Click()
    If CheckBox2.Value = True Then
        b1 = 143
        b2 = 163
        b3 = 301
    Else
        b1 = 0
        b2 = 0
        b3 = 0
    End If
End Sub

Private Sub CheckBox3_Click()
    If CheckBox3.Value = True Then
        c1 = 401
        c2 = 402
    Else
        c1 = 0
        c2 = 0
    End If
End Sub

Private Sub CheckBox4_Click()
    If CheckBox4.Value = True Then
        d1 = 407
        d2 = 426
        d3 = 462
    Else
        d1 = 0
        d2 = 0
        d3 = 0
    End If
End Sub

Private Sub CheckBox5_Click()
    If CheckBox5.Value = True Then
        e1 = 223
        e2 = 314
    Else
        e1 = 0
        e2 = 0
    End If
End Sub

Sub CommandButtonok_Click()

    'affichage des pîèces souhaité
        ActiveSheet.Range("$A$5:$P$1043").AutoFilter Field:=1, Criteria1:=Array(a1, a2, b1, b2, b3, c1, c2, d1, d2, d3, e1, e2)
        
    Unload UserForm1
    
End Sub

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
16 août 2012 à 22:26
Salut Guillaume

Très abstrait, tout ça et parfois incompréhensible, faute de phrase trop longue ou de manque de ponctuation :

J'ai trouvé la méthode "Array" quand j'ai enregistrer une macro et que j'ai fait cocher mes cases dans le menu de tri"
Tu veux dire dans le menu qui se déroule lorsque tu cliques sur le triangle placé à droite du nom de la colonne et qui te propose "(Sélectionner tout)" ou les cases à cocher de chaque item ?
On va supposer que c'est bien ça (Excel 2007 et supérieur)

mais quand je le fais a la souris, il affiche tous les choix
Euh, à la souris ... comment les as-tu cochées avant ?
au canif ?
Parles-tu encore de ce même menu de sélection dont je viens de parler ?

et quand je le fait par la macro avec les variable, il ne me fait pas la même chose ..."
Que valent tes variables au moment de l'exécution de la ligne du filtre ? Ont-elles les valeurs correctes ?
Où as-tu trouvé cette syntaxe
Criteria1:= Array(a1, ...
Es-tu sûr qu'elle soit légale ?
Dans l'aide il est bien dit que :
- les critères doivent être des chaîne de caractères, précédés par un symbole de comparaison.
- chaque critère doit être séparé du suivant par une contrainte définissant le type de filtre (Ou, Et, 10 premiers ...)

Je ne vois pas tout ça dans ta syntaxe, d'où l'interrogation sur la véracité de cette syntaxe à base de Array

(3'30 plus tard)
Par curiosité, j'ai tapé cette chaine dans Bing :
Criteria1:=Array
et je suis tombé sur plusieurs blogs où la syntaxe est clairement différente.
Celle-ci devrait fonctionner :
# Les critères doivent en effet être des textes précédés du comparateur. Il te faut donc corriger ta syntaxe.
- Au lieu d'utiliser des variables numériques Integer, il faut déclarer ces variables "As String".
- Au lieu de rentrer, par exemple,
b1 = 143
il faut utiliser la bonne syntaxe :
b1 = "=143"

# Il te manque l'opérateur de comparaison en dernier paramètre :
..., e1, e2) , Operator:=xlFilterValues

Un peu de curiosité t'aurait épargné 4 jours de besogne ...
Par contre, passe un peu plus de temps à te relire et à te mettre dans la peau de qqun qui ne connait rien à ton problème.
Fais de courtes phrases,
passe à la ligne,
utilise les artifices d'apparence (gras, italique, couleur, taille ...)
utilise la ponctuation - elle a son importance,
enlève les mots superflus qui encombrent,
optionnellement, corrige les fautes.
Et surtout, relis toi, 2 fois; ça prend 1 minute.
Si toi tu as du mal à te relire, à te comprendre, nul doute que les autres aussi.

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
16 août 2012 à 22:31
PS : Je viens de faire l'essai et la syntaxe de type chaine peut se passer du signe =
Tu peux mettre tes chiffres seuls, mais dans une variable chaine, sinon Array ne fonctionnera pas.
3
guiguigui69008
17 août 2012 à 09:40
Merci, je vais essayer tout de suite,

Encore désolé pour les phrases incompréhensibles, j'ai pas encore l'habitude de poster des messages sur des forums comme celui-ci, d'habitude, je tape mon problème sur google et je me contente de trouver les réponses sur les forums quand les gens ont eu presque le même soucis que moi!!

(Pour la curiosité, c'est pas faute d'avoir essayer, j'ai tout essayé comme recherche sur Google, mais c'est vrai que "Array", ça me serait jamais venu à l'esprit!)

On m'a aussi donné une autre méthode, J'essaye tout ça, et je reviens pour vous donner ma solution finale, et clôturer la discussion!!!

Merci!
0
guiguigui69008
17 août 2012 à 10:38
Donc! encore merci a toi Jack.
Pour résoudre mon problème, j'ai donc écouter les conseils de jack :

-Déclarer mes variables en chaines de caractères.
-Mis des guillemets quand j'attribue une valeur à mes variables
-Ajouter un opérateur xlFilterValues à la fin de ma méthode "Array"

Je vous met le code pour ceux que ça pourrait intéresser:

Option Explicit
Public a1 As String
Public a2 As String
Public b1 As String
Public b2 As String
Public c1 As String
Public c2 As String
Public c3 As String
Public c4 As String
Public d1 As String
Public d2 As String
Public e1 As String
Public e2 As String
Public f1 As String
Public f2 As String
Public f3 As String
Public g1 As String
Public g2 As String
Public h1 As String
Public i1 As String
Public i2 As String
Public i3 As String
Public i4 As String
Public j1 As String
Public j2 As String
Public j3 As String

Sub CheckBoxbielle_Click()

        
        If CheckBoxbielle.Value = True Then
            f1 = "4495"
            f2 = "2370"
            f3 = "4781"
        Else
            f1 = 0
            f2 = 0
            f3 = 0
        End If
End Sub

Sub CheckBoxcremcde_Click()

        
        If CheckBoxcremcde.Value = True Then
            g1 = "5001"
            g2 = "3158"
        Else
            g1 = 0
            g2 = 0
        End If
End Sub

Sub CheckBoxcremcomb_Click()

        If CheckBoxcremcomb.Value = True Then
            a1 = "3067"
            a2 = "4558"
        Else
            a1 = 0
            a2 = 0
        End If
    
End Sub

Sub CheckBoxpistcde_Click()

    
        If CheckBoxpistcde.Value = True Then
            h1 = "4521"
        Else
            h1 = 0
        End If
End Sub

Sub CheckBoxpistcomb_Click()
        
        If CheckBoxpistcomb.Value = True Then
            b1 = "5289"
            b2 = "4514"
        Else
            b1 = 0
            b2 = 0
        End If

End Sub

Sub CheckBoxplatine_Click()
        
        If CheckBoxplatine.Value = True Then
            c1 = "2333"
            c2 = "5082"
            c3 = "1253"
            c4 = "4961"
        Else
            c1 = 0
            c2 = 0
            c3 = 0
            c4 = 0
        End If
End Sub

Sub CheckBoxrotule_Click()

        If CheckBoxrotule.Value = True Then
            j1 = "1122"
            j2 = "4698"
            j3 = "4813"
        Else
            j1 = 0
            j2 = 0
            j3 = 0
        End If
            
End Sub

Sub CheckBoxroue_Click()
        
        If CheckBoxroue.Value = True Then
            e1 = "4565"
            e2 = "4586"
        Else
            e1 = 0
            e2 = 0
        End If
End Sub

Sub CheckBoxrouleau_Click()
    
        If CheckBoxrouleau.Value = True Then
            d1 = "4970"
            d2 = "2231"
        Else
            d1 = 0
            d2 = 0
        End If
End Sub



Sub CheckBoxvp_Click()

        
        If CheckBoxvp.Value = True Then
            i1 = "323013"
            i2 = "323019"
            i3 = "320004"
            i4 = "323017"
        Else
            i1 = 0
            i2 = 0
            i3 = 0
            i4 = 0
        End If
End Sub

Sub CommandButtonok_Click()

    'affichage des pîèces souhaité
        ActiveSheet.Range("$A$5:$P$1043").AutoFilter Field:=1, Criteria1:=Array(a1, a2, b1, b2, c1, c2, c3, c4, d1, d2, _
        e1, e2, f1, f2, f3, g1, g2, h1, i1, i2, i3, i4, j1, j2, j3), Operator:=xlFilterValues
        
        
  
    Unload UserForm2
    
    Range("D5").Select
    ActiveWorkbook.Worksheets("synthese des stocks").AutoFilter.Sort.SortFields. _
        Clear
    ActiveWorkbook.Worksheets("synthese des stocks").AutoFilter.Sort.SortFields. _
        Add Key:=Range("D5:D1043"), SortOn:=xlSortOnValues, Order:=xlAscending, _
        DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("synthese des stocks").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    

End Sub



Merci encore de l'aide!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 août 2012 à 10:46
Même les 0 devraient être des chaines "0".
Essaye de ne mettre qu'une chaine vide "" à la place. Si cela fonctionne, tu peux supprimer tous les Else
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 août 2012 à 10:48
PS : Attention aux noms des variables.
E1 ou E2 pourraient être interprétés comme des exposants de 10 dans la notation de chiffres. Ce qui donnerait des erreurs pas toujours faciles à comprendre.
0
guiguigui69008
17 août 2012 à 10:51
Exact, ça marche!
0
Rejoignez-nous