Recherche multicritères VBA

Ynwa_57

XLDnaute Nouveau
Bonjour à toutes et à tous !

Ayant trouvé de nombreuses aides pour mon projet à travers ce forum (et d'autres), je m'adresse directement à vous car malgré mes recherches et mes nombreuses tentatives, je suis bloquée depuis plusieurs jours.


Comme indiqué dans l'intitulé, j'ai un problème pour effectuer une recherche à plusieurs critères.

Dans le fichier que vous trouverez sur ce lien (car trop volumineux malgré la compression), vous verrez différents critères
Ce lien n'existe plus

Ils ne sont pas tous obligatoires à part la recherche entre deux dates que j'ai réussi à programmer.

Il s'agit d'une base de données d'échantillons.
Il faudrait pouvoir les trouver en renseignant le "requestor" par exemple ou "alloy" ou "application" ou deux, trois voire plus de critères combinés ...

Il faut aussi que je puisse extraire tous les échantillons traités par un certain "operator" entre deux dates.
Ce dernier point est réussi à travers le code suivant :



Code:
If Me.OpeS.Value <> "" Then


 Sheets("Testfait").Select
    DerLig = Range("A65536").End(xlUp).Row
                'au cas ou un filtre serait déja actif.
    On Error Resume Next
    Selection.AutoFilter
    On Error GoTo 0


Selection.AutoFilter field:=2, Criteria1:=Me.OpeS.Value

Selection.AutoFilter field:=3, Criteria1:=">=" & Format(CDate(Date1.Value), "mm/dd/yyyy"), _
Operator:=xlAnd, Criteria2:="<=" & Format(CDate(Date2.Value), "mm/dd/yyyy")



J'ai tenté le filtre amélioré pour les autres critères, sans résultat, j'ai essayé le même code que pour extraire la liste des échantillons par opérateur (celui cité ci-dessus) avec des "if RequestS.value<>"" then" et ça a fonctionné au début mais après pour je ne sais quelle raison ça n'a plus fonctionné du tout.

J'ai vu des exemples sur excel qui étaient intéressants mais que je n'ai pas réussi à reproduire en VBA tel que celui de Boisgontier, dont le site m'a aussi servi et que je remercie au passage.




Enfin, il faudrait que je puisse savoir quels échantillons ont subit tel ou tel test ...


Par exemple :

Requestor : VV
Test : Gain size ET/OU Microstructure ET/OU MIT ET/OU TT
Date : entre le 01/03/2013 et le 16/07/2013 (Date de reception de l'échantillon, pas la date des différents tests)

Je ne sais pas encore comment gérer cette recherche donc si vous avez des pistes, même sans code pour ce dernier point, je suis preneuse.

Pour la présentation des résultats j'ai simplement fait un UF avec une listbox mais c'est simplement temporaire pour visualiser le résultat de la recherche.

Je débute en VBA et j'ai atteint les limites de mes connaissances donc j'espère que vous saurez m'aider comme vous avez pu le faire dans d'autres discussions qui m'ont énormément servies.


Merci par avance et n'hésitez pas à demander plus d'explications. :)



Sab
YNWA
 
Dernière édition:

GIBI

XLDnaute Impliqué
Re : Recherche multicritères VBA

Bonjour,

si tu ne veux utiliser qu'un seul filtre, tu peux tes critères comme si tu avais systématiquement un intervalle de valeur. Tu dois avoir pour chaque critère une valeur mini et une valeur Maxi. cela permet d'avoir toujours les mêmes filtre

Code:
dim RequesMin as string 
dim RequestMax as string 

If Me.request <> "" then
  RequestMin=Me.Request
  RequestMax=Me.Request
else
 RequesMin = "AAAA"  ' ou *
 requestMax= "zzz"     ' ou *
endif


........

Selection.AutoFilter field:=3, Criteria1:=">=" & DateMin, _
Operator:=xlAnd, Criteria2:="<=" & DateMax

Selection.AutoFilter field:=4, Criteria1:=">=" & RequestMin, _
Operator:=xlAnd, Criteria2:="<=" & ResquestMax

Mais le mieux est peut être de supprimer le filtre

suppression des filtre s'il existent
If worksheets("Requestinfo").FilterMode = True Then worksheets("Requestinfo").ShowAllData

puis positionner chaque filtre sous condition

If Me.request <> "" then
Selection.AutoFilter field:=4, Criteria1:=me.request
endif

ai-je compris la question?

Bon courage

GIBI
 
Dernière édition:

Ynwa_57

XLDnaute Nouveau
Re : Recherche multicritères VBA

Tout d'abord merci pour ta réponse.

Je ne pense pas que le premier code convient parce que je ne connais pas à l'avance les données qui peuvent être dans ma base de données donc le deuxième code semble le plus logique mais je l'ai essayé et ça ne fonctionne pas ...

J'arrive pas à faire fonctionner le "show all data"
et quand j'essaye sans, ca fonctionne pas ... Y a pas de message d'erreur, ca ne fonctionne juste pas ...
Par contre maintenant la recherche par opérateur ne fonctionne plus j'ai le message d'erreur 1004 "la méthode autofilter de la classe Range a échoué" ...

Je suis complètement bloquée et c'est le seul et dernier endroit de mon projet où je bloque.


Une autre idée peut-être ?

Merci pour ton aide :)
 

Ynwa_57

XLDnaute Nouveau
Re : Recherche multicritères VBA

Ce que je recherche c'est exactement l'exemple ET/OU de Boisgontier mais en VBA.
J'ai tenté de le retranscrire en VBA sur mon projet mais j'y suis pas arrivée est-ce que quelqu'un pourrait m'aider svp ?

Merci par avance
 

Pièces jointes

  • Copie de FiltreElaborETOUExemple.xls
    57.5 KB · Affichages: 106

GIBI

XLDnaute Impliqué
Re : Recherche multicritères VBA

Bonjour,

pour le ShowAllData j'ai oublié de l'affecter à la feuille (je supose que toi non plus tu n'y as pas pensé)

If worksheets("Requestinfo").FilterMode = True Then worksheets("Requestinfo").ShowAllData

Pour ce qui est du premier code ou le 2eme le contenu des données n'a aucune importance : seule la saisie des critère est importante

la recherche opérateur ne fonctionne pas car tu n'as pas sélectionné de cellule (Range) seule la feuille est sélectionnée (regarde m'a correctio, pour l'onglet requestinfo). Il y a deux entête ???

j'ai corrigé la recherche INFO pour qu'elle fonction avec 3 critère : date, alloy, requestor

Code:
Private Sub Chercher_Click()
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''' Recherche entre 2 dates '''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    If Me.OpeS.Value <> "" Then

        Sheets("Testfait").Select
        DerLig = Range("A65536").End(xlUp).Row
        'au cas ou un filtre serait déja actif.
        On Error Resume Next
        Selection.AutoFilter
        On Error GoTo 0

        Selection.AutoFilter Field:=2, Criteria1:=Me.OpeS.Value

        Selection.AutoFilter Field:=3, Criteria1:=">=" & Format(CDate(Date1.Value), "mm/dd/yyyy"), _
                             Operator:=xlAnd, Criteria2:="<=" & Format(CDate(Date2.Value), "mm/dd/yyyy")

        Me.Hide
        UserForm2.Show
    End If

    'Traitement de requestinfo
    Sheets("RequestInfo").Select
    'suppression des filtre s'il existent sur requestInfo
    If Worksheets("Requestinfo").AutoFilterMode Then    ' filtre existant
        If Worksheets("Requestinfo").FilterMode = True Then    ' filtre avec selection
            ' suppression des selections
            Sheets("RequestInfo").ShowAllData
        End If
    Else  ' création du filte
        Range("A1").AutoFilter
    End If
    ' filtrer sur les dates toujours présentes
    Selection.AutoFilter Field:=3, Criteria1:=">=" & Format(CDate(Date1.Value), "mm/dd/yyyy"), _
                         Operator:=xlAnd, Criteria2:="<=" & Format(CDate(Date2.Value), "mm/dd/yyyy")
    ' ajout selection request
    If Me.RequestS.Value <> "" Then
        Selection.AutoFilter Field:=4, Criteria1:=Me.RequestS.Value
    End If
    'ajout selection alloys
    If Me.AlloyS.Value <> "" Then
        Selection.AutoFilter Field:=13, Criteria1:=Me.AlloyS.Value
    End If

End Sub


A toi de jouer


GIBI
 

Ynwa_57

XLDnaute Nouveau
Re : Recherche multicritères VBA

Bonjour GIBI,

Merci à nouveau pour ta réponse.

Pour le ShowAllData il me semble que j'avais testé avec le nom de la feuille je ne m'en rappelle plus.

Le plus important est que la recherche multi-critères fonctionne, avec un ou plusieurs critères, j'ai ajouté les codes des autres critères :

Code:
'ajout selection customer
    If Me.CustS.Value <> "" Then
        Selection.AutoFilter Field:=10, Criteria1:=Me.CustS.Value
    End If

Et ça fonctionne .. C'est bizarre parce que j'avais déjà testé et ça n'avais pas fonctionné, peut-être à cause du filtre déjà en place ...

En tout ca merci pour cette aide précieuse.

Avant que je ne coche "Résolu", aurais-tu (ou quelqu'un d'autre bien évidemment) une idée pour la recherche avec les tests ?
Ce serait une recherche par "OU" entre chaque test, sachant qu'ils doivent être couplés avec les critères précédents, et que les résultats effectués se trouvent sur une autre plage.

Cela est dû au fait qu'un échantillon peut subir plusieurs tests différents, et plusieurs fois le même test ...

C'est assez compliqué et je n'arrive pas à trouver une logique de recherche ...
De simples pistes sans le code me permettaient déjà d'avancer ... Mais si un code similaire existe je ne dit pas non :rolleyes:

Merci encore GIBI
 

Ynwa_57

XLDnaute Nouveau
Re : Recherche multicritères VBA

Petite rectification !

Pour la recherche par test, inutile de coupler avec les critères précédents !
Il faudrait retrouver dans la liste des tests (feuille "TestFaits"), tous les tests cochés dans l'UF entre 2 dates.

Il faudrait donc faire un filtre "OU" sur la même colonne, avec les différents tests qui existent.

Je sais que c'est faisable avec AdvancedFilter sur VBA à travers l'action "XlOr" mais je ne peux entrer que 2 critères ...

Auriez-vous une autre solution svp ?

Merci par avance :)


Sab
YNWA
 
Dernière édition:

GIBI

XLDnaute Impliqué
Re : Recherche multicritères VBA

Bonjour,

Pour ton problème de multivaleur sur la même colonne, pas besoin de filtre avancé si tu es en excel 2007 ou supérieur tu peux faire un filtre avec une liste de valeur.

c'est de la forme Criteria1:=Array("aaaa" , "bbbb", "cccc", "Metz")

ou
Dim MonTableau(5) As String
MonTableau(0) = "aaaa"
MonTableau(1) = "bbbb"
MonTableau(2) = "cccc"
MonTableau(3) = "ddddd"
..................... Criteria1:=MonTableau, Operator:=xlFilterValues

GIBI



Remarque : utilise l'enregistreur de macro pour voir comment cela fonctionne


GIBI
 
Dernière édition:

Ynwa_57

XLDnaute Nouveau
Re : Recherche multicritères VBA

Bonjour,

Pour ton problème de multivaleur sur la même colonne, pas besoin de filtre avancé si tu es en excel 2007 ou supérieur tu peux faire un filtre avec une liste de valeur.

c'est de la forme Criteria1:=Array("aaaa" , "bbbb", "cccc", "Metz")

ou
Dim MonTableau(5) As String
MonTableau(0) = "aaaa"
MonTableau(1) = "bbbb"
MonTableau(2) = "cccc"
MonTableau(3) = "ddddd"
..................... Criteria1:=MonTableau, Operator:=xlFilterValues

GIBI



Remarque : utilise l'enregistreur de macro pour voir comment cela fonctionne


GIBI


Bonjour GIBI,

Merci à nouveau pour ton temps et tes solutions !

J'ai réussi à faire autrement, le code est pas joli joli mais ça fonctionne ...
Je le mets, ça pourrait servir à d'autres :


Code:
'Recherche du 1er test

If Me.checkbox1.Value = True Then
Sheets("Feuil1").Select
Range("a1").AutoFilter         'Activation du filtre
     

Selection.AutoFilter Field:=3, Criteria1:=">=" & Format(CDate(Date1.Value), "mm/dd/yyyy"), Operator:=xlAnd, _
Criteria2:="<=" & Format(CDate(Date2.Value), "mm/dd/yyyy")    'Recherche restreinte entre 2 dates


Selection.AutoFilter Field:=5, Criteria1:="Test 1"     'Recherche du test 1
Range("A2:e65536").SpecialCells(xlCellTypeVisible).Copy    'Copie pour coller vers une autre feuille qui me sert de source pour alimenter une Listbox


Sheets("Feuil1").Select
Range("a1").AutoFilter         'Désactivation du filtre



'Recherche pour le 2eme test


If Me.checkbox2.Value = True Then
Sheets("Feuil1").Select
Range("a1").AutoFilter         'Activation du filtre
     

Selection.AutoFilter Field:=3, Criteria1:=">=" & Format(CDate(Date1.Value), "mm/dd/yyyy"), Operator:=xlAnd, _
Criteria2:="<=" & Format(CDate(Date2.Value), "mm/dd/yyyy")    'Recherche restreinte entre 2 dates


Selection.AutoFilter Field:=5, Criteria1:="Test 2"     'Recherche du test 2
Range("A2:e65536").SpecialCells(xlCellTypeVisible).Copy    'Copie pour coller vers une autre feuille qui me sert
' de source pour alimenter une Listbox


Sheets("Feuil1").Select
Range("a1").AutoFilter         'Désactivation du filtre



J'ai fait ce code pour chaque test, je suis obligée d'activer et de désactiver le filtre à chaque test sinon il n'est pas toujours actif et j'ai des soucis ...

J'ai tenté de ne l'activer qu'une seule fois lorsque j'appuie sur le bouton de recherche et avant d'appliquer un critère de recherche, mais le fonctionnement est aléatoire donc je le laisse comme ça, d'où mon "Code moche mais qui fonctionne".


Merci encore GIBI =)
 

Discussions similaires

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 173
dernier inscrit
Cerba95