Filtre VBA - prise en compte de plusieurs critères

Bonjour à toutes et à tous,

Alors voilà, je suis stagiaire dans un cabinet de chasse d'appartements.

Pour cela, nous avons une BDD qui répertorie les biens à vendre (BDD Privée) et une BDD qui répertorie les demandes de nos divers clients (BDD Recherche). Jusque là, tout va bien !

Pour simplifier le processus de recherche de biens répondant aux critères exigées de la part de nos clients, je me suis lancé dans une petit code VBA (je tiens à préciser que j'ai seulement deux semaines "d'expérience" en VBA).

Pour cela, je fais intervenir un filtre, que j'appliqué à la BDD Privée, en sélectionnant les critères renseignés dans la BDD Recherche.

Un des critères intervenant est le Code Postal. Or, vous vous doutez bien que de nombreuses personnes (notamment pour des recherches de biens situés à Paris) ne se limitent pas à un seul code postal. C'est là que je fais face à un problème sur lequel je m'arrache les cheveux depuis maintenant plusieurs jours. Je n'arrive pas à faire en sorte que mon filtre applique un "ou" logique entre les différents critères que sont les codes postaux, et ce malgré de nombreuses tentatives...

Voici le lien ou télécharger les fichiers :

La macro en question est dans le ficher "Recherche Bien Immo", sous le nom de Usf1

Merci d'avance pour vos retours, j'ai hâte de vous lire !

Si jamais mes explications ne sont pas claires, faites le moi savoir

David

Bonjour à toutes et à tous,

J'espère que le week-end fut bon.

Permettez-moi simplement de faire un petit "up", parce que je n'ai malheureusement pas trouvé de solution miracle pour le moment

Merci d'avance !

David

Bonjour,

Met plutôt ton exemple à disposition en xls ou xlsm à disposition.

Tu peu le mettre sur le forum, dans l'onglet en dessous de Envoyer clic sur ajouter fichier.

A+

Re bonjour,

Voilà les deux fichiers en question.

Encore merci !

David

Beh tu à laisser le 2èm en rar ?

Il fait 800 ko et si j'ai bien compris la charte, il faut pas que ça dépasse 300 ko, non ?

Suivant ta question, il sembletait que le 2èm fichier n'est pas nécessaire.

Doudi a écrit :

C'est là que je fais face à un problème sur lequel je m'arrache les cheveux depuis maintenant plusieurs jours. Je n'arrive pas à faire en sorte que mon filtre applique un "ou" logique entre les différents critères que sont les codes postaux,

Il est vrai qu'avec Excel =>2007 les filtres avec plus de 2 critères ne sont pas évident, il faut initialiser un "Array", je ne suis pas parvenu à déterminer un "array dynamique" j'ai employé un Select Case pour y remédier, si un aure intervenant à une solution plus simple..

Pour essayer tu met un nouveau Userform avec un TextBox1 et 2 boutons

Option Explicit

Dim TB
Dim NbFiltre As Integer

Private Sub CommandButton2_Click()
    'Réinitialise le tableau
    ReDim TB(0)
    NbFiltre = 0
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        NbFiltre = NbFiltre + 1
        ReDim Preserve TB(NbFiltre)
        TB(NbFiltre) = TextBox1.Text
        TextBox1 = ""
        TextBox1.SetFocus
    End If
End Sub

Private Sub CommandButton1_Click()
    'Bouton envoyer filtre
Dim T, i As Integer
    Select Case NbFiltre
    Case 1: T = Array(TB(1))
    Case 2: T = Array(TB(1), TB(2))
    Case 3: T = Array(TB(1), TB(2), TB(3))
    Case 4: T = Array(TB(1), TB(2), TB(3), TB(4))
    Case 5: T = Array(TB(1), TB(2), TB(3), TB(4), TB(5))
    Case Else
        MsgBox "maximum 5 filtres"
        Exit Sub
    End Select
    ActiveSheet.Range("$A$2:$T$130").AutoFilter
    ActiveSheet.Range("$A$2:$T$130").AutoFilter Field:=9, Criteria1:=T, Operator:=xlFilterValues

End Sub

Private Sub UserForm_Initialize()
    ReDim TB(0)
    NbFiltre = 0
    CommandButton1.TabStop = False
    CommandButton2.TabStop = False
End Sub

Tu peu entrer entre 1 et 5 filtres (si plus faut modifier le select)

Dans le texte entre un filtre.. EXEMPLE : 75000 et taper ENTER, ... 75002 et ENTER etc jusque 5

J'ai mis un TextBox mais c'et juste pour le test, tu peur remplacer par les critères qui proviennent de l'autre classeur.

A+

Merci pour ta réponse lermite !

Je ne connaissais pas la notion d'Array.

J'ai voulu adapter le tout afin de ne pas être obligé de passer par les textbox, mais je pense que le résultat est le même. En revanche, le filtre ne passe toujours pas, étant donné que la machine comprend que je recherche le critère "Array("code postal1", "code postal2", "code postal3, etc.)"

Liste2 = ", " & """" & Cells(2, 9) & """"

For x = 2 To nb_ligne
Liste2 = Liste2 & ", " & """" & Cells(x, 9) & """"
Next x

Liste1 = "Array(" & """" & Cells(1, 9) & """" & Liste2 & ")"

'MsgBox (Liste1)

 ActiveSheet.Range(Cells(nb_ligne + 1, 1), Cells(300, 26)).AutoFilter Field:=6, Criteria1:=Liste1, Operator:=xlFilterValues

Comme je dis dans mon poste précédant, impossible (du moins à ma connaissance) de déclarer un Array dynamique.

C'est pourquoi j'ai employer un Select case

Pour créer l'Array ..

  • > 1°) voir combien de critères entrer
  • > 2°) Reprendre le sélect case COMME IL EST mais à la place de TB(1), TB(2) etc.. mettre la cellule à la place
Un tableau ne passe pas sinon j'aurais fais avec.

Mais explique comment tu détermine les critères (où y sont) et jusque combien de filtres tu peu avoir je pourrais peut-être mieux t'aiguiller.

Au temps pour moi... je suis encore novice, et ça se remarque

Alors, ce qui se passe:

  • chaque client a un nombre différent de critères en termes de code postal, d'ou ma variable nb_ligne qui me renseigne sur le nombre de codes postaux voulus par le client.
  • à partir de là, j'ouvre un nouveau classeur, les nb_ligne premières lignes vont être occupées par les nb_ligne lignes de ma BDD Recherche, et le restant des lignes sera occupé par ma BDD Privée (cop/col trivial)
  • dans ce nouvel excel, les critères de codes postaux que je veux sélectionner se trouvent en colonne 9, et occupent les nb_ligne premières lignes.
  • En ligne nb_ligne + 1, j'ai donc les en-tête de ma BDD Privée à laquelle j'applique le filtre, et la colonne code postal est, cette fois-ci, en colonne 6

Ensuite je vais également filtrer sur d'autres infos (prix maximum, surface minimum, etc.) mais pour ça, je penses pouvoir me dépatouiller.

Je vais essayer en reprenant ton select case alors !

Merci

Un exemple à tester..

Sub InitCritere1()
Dim TB, T
Dim Lig As Integer, NbLigne As Integer, i As Integer, Col As Integer
    'En supposant que la première cellule des codes postaux se trouvent en F10
    'Et qu'il y à 5 codes postaux
    NbLigne = 5 'A paramétrer au nombre de codes postaux sélectionner
    Lig = 10 'A paramétrer à la première ligne ou sont les codes postaux
    Col = 6 'Ici colonne F, à paramétrer sur le N° de la colonne
    ReDim TB(NbLigne - 1)
    For i = 0 To NbLigne - 1
        TB(i) = Cells(i + Lig, Col).Value
    Next i
    Select Case NbLigne - 1
    Case 0: T = Array(TB(0))
    Case 1: T = Array(TB(0), TB(1))
    Case 2: T = Array(TB(0), TB(1), TB(2))
    Case 3: T = Array(TB(0), TB(1), TB(2), TB(3))
    Case 4: T = Array(TB(0), TB(1), TB(2), TB(3), TB(4))
    Case Else
        MsgBox "maximum 5 filtres"
        Exit Sub
    End Select
End Sub

Tu dis...

Bonjour

Juste à essayer avec 2010

Bonjour Banzai

lermite, le select case que tu m'as donné fait planter mon excel

Ensuite, en ce qui concerne le fichier que tu m'as donné Banzai, ça bug au niveau de la ligne de code suivante:

With Workbooks.Open(Filename:=BDDPrivée)

Je le répète, je suis novice... et là pour le coup, je ne comprends pas l'erreur :s

En tout les cas, merci du temps que vous passez là dessus pour m'aider !

David

Bonjour

il serait intéressant de connaitre le libellé de l'erreur

Il faut que tu sauvegardes le fichier que je t'ai envoyé dans le même répertoire que ton fichier

BDDPrivée = "Base de Données - Biens Immo - Mastertableau.xlsm"

Je viens d'essayer et pas de souci particulier

J'ai testé avec 2003

Tu peux remplacer cette ligne par (Cela ne change pas le fonctionnement)

  'Récupération BDD Privée
  With Workbooks.Open(Filename:=ThisWorkbook.Path & "\" & BDDPrivée)

Bonjour à tous,

L'erreur : 1004

'Base de Données - .....' introuvable. Verifiez l'orthographe du nom du classeur et la validité de l'emplacement.

Si vous essayez d'ouvrir le fichier à partir de la liste des fichiers les plus récents, assurez vous que le fichier n'a pas été renommé, déplacé ou supprimé

Je les avais pourtant mis au même endroit, les noms de fichiers correspondaient parfaitement.

J'ai ajouté ta nouvelle ligne et il n'y a plus de bug, top ! Mais (il y a toujours un mais ), aucun filtre ne s'applique dans mon nouveau classeur, ou devrai-je plutôt dire qu'un filtre vraisemblablement trop puissant me masque toutes mes données

Des idées ?

Merci d'avance !

David

Bonjour

Je ne sais que dire

J'ai effectué quelques tests et pas de souci

Voilà le résultat d'un test

49rech-020.zip (38.03 Ko)

Banzai,

Désolé du dérangement, c'est simplement lié au fait que je l'utilise sur une BDD Privée à peine différente, en ce sens qu'il y a une colonne supplémentaire... J'ai rectifié mon erreur.

Très ingénieux en tout cas ton process, à tel point que je ne suis pas sur de tout comprendre, mais ca reste très instructif. Merci !

PS: à partir de là je peux ajouter quelques lignes bateaux pour filtrer sur le prix, surface, etc. sans que ça ne pose de soucis vis à vis de ce que tu m'as fait ?

Encore merci !

David

Bonjour

Doudi a écrit :

PS: à partir de là je peux ajouter quelques lignes bateaux pour filtrer sur le prix, surface, etc. sans que ça ne pose de soucis vis à vis de ce que tu m'as fait ?

Essayes et tu diras

Suis pas habitué aux filtres

Rechercher des sujets similaires à "filtre vba prise compte criteres"