IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

recherche multi critere par procédure évenementielle


Sujet :

VBA Access

  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut recherche multi critere par procédure évenementielle
    bonjour,

    Je maîtrise assez bien la création à l'aide de formulaires, requêtes, macro, mais je débute dans l'utilisation du code vba comme dans l'exemple ci dessous (ma première programmation en vba)
    Je veux signaler que j'ai trouvé un exemple dans un tutoriel de ce site mais il ne convenait pas au résultat final que je voulais obtenir: Celui de votre site ne me permettait pas de modifier la table à cause de gestion par requète: Je dois cliquer une case oui/non pour valider le choix
    J'ai donc chercher une autre et j'ai trouvé ceci que j'ai compris (elle est déjà modifier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     Private Sub CmdFiltre_Click()
    f = ""
    g = ""
    If Not IsNull(Me.Rnom) And Me.Rnom <> "" Then
    f = "NOM LIKE ""*" & Me.Rnom & "*"""
    End If
    If Not IsNull(Me.Rprenom) And Me.Rprenom <> "" Then
    f = "PRENOM LIKE ""*" & Me.Rprenom & "*"""
    End If
    If Not IsNull(Me.Rnum) And Me.Rnum <> "" Then
    f = "N° LIKE ""*" & Me.Rnum & "*"""
    End If
    If Not IsNull(Me.Rrue) And Me.Rrue <> "" Then
    g = "RUE LIKE ""*" & Me.Rrue & "*"""
    End If
    If Not IsNull(Me.Rville) And Me.Rville <> "" Then
    f = "VILLE LIKE ""*" & Me.Rville & "*"""
    End If
    Me.Filter = "(f And g)"
    Me.FilterOn = True
     
    End Sub
    J'ai créé la variable g pour obtenir une recherche à partir de plusieurs critères, car dans sa conception initiale elle propose plusieurs critères mais la sub recherche à partir d'un seul critère.
    Le problème se trouve sur la ligne : "me.filter ="(f and g)"
    Je demande l'application du filtre mais avec plusieurs critères (dans mon exemple f et g) J'ai essayé plusieurs écritures sans succés. Au mieux j'obtient un filtre à partir du dernier critère. J'ai même essayé de faire appliquer des conditions if sans meilleurs résultat.
    Je n'ai rien trouvé sur internet sur le fonctionnement de ce filtre.

    Je transformerez le début après avoir trouvé la solution à ce problème

    merci pour vos eclaircissement

  2. #2
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Bonsoir et bienvenue sur ce forum

    Essaies ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Private Sub CmdFiltre_Click()
    Dim f   As String
    Dim g   As String
     
    f = ""
    g = ""
        If Not IsNull(Me.Rnom) And Me.Rnom <> "" Then
            f = "NOM LIKE ""*" & Me.Rnom & "*"""
        End If
        If Not IsNull(Me.Rprenom) And Me.Rprenom <> "" Then
            f = "PRENOM LIKE ""*" & Me.Rprenom & "*"""
        End If
        If Not IsNull(Me.Rnum) And Me.Rnum <> "" Then
            f = "N° LIKE ""*" & Me.Rnum & "*"""
        End If
        If Not IsNull(Me.Rrue) And Me.Rrue <> "" Then
            g = "RUE LIKE ""*" & Me.Rrue & "*"""
        End If
        If Not IsNull(Me.Rville) And Me.Rville <> "" Then
            f = "VILLE LIKE ""*" & Me.Rville & "*"""
        End If
     
        Me.Filter = f & " & " & g
        Me.FilterOn = True
     
    End Sub
    .. et dis-nous si cela fonctionne

    Bernard.

  3. #3
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut
    bonjour,
    j'ai saisi l'expression et fait deux essais :

    -- lorsque je rentre juste le nom, j'ai une erreur n° 2448 affiché par le debogueur qui apparemment ne comprends pas l'expression.

    -- lors que je saisi le nom et la rue, d'une des personnes saisi il me vide le résultat en dessous, donc il ne trouve pas de correspondance. alors qu'elle existe.

    --> même résultat en essayant avec le prénom à la place du nom

  4. #4
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    Je n'avais pas compris que tu souhaitais un "multi-critères"...

    Alors, essaies ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Private Sub CmdFiltre_Click()
    Dim strFiltre   As String
    Dim f           As String
    Dim g           As String
     
    f = ""
    g = ""
     
        If Me.Rnom <> "" Then
            f = "NOM LIKE ""*" & Me.Rnom & "*"""
        End If
     
        If Me.Rprenom <> "" Then
            If f <> "" Then
                f = f & " & PRENOM LIKE ""*" & Me.Rprenom & "*"""
            Else
                f = "PRENOM LIKE ""*" & Me.Rprenom & "*"""
            End If
        End If
     
        If Me.Rnum <> "" Then
            If f <> "" Then
                f = f & " & N° LIKE ""*" & Me.Rnum & "*"""
            Else
                f = "N° LIKE ""*" & Me.Rnum & "*"""
        End If
     
        If Me.Rville <> "" Then
            If f <> "" Then
                f = f & " & VILLE LIKE ""*" & Me.Rville & "*"""
            Else
                f = "VILLE LIKE ""*" & Me.Rville & "*"""
            End If
        End If
     
        If Me.Rrue <> "" Then
            g = "RUE LIKE ""*" & Me.Rrue & "*"""
        End If
     
        If f <> "" And g <> "" Then
            strFiltre = f & " & " & g
        ElseIf f = "" And g <> "" Then
            strFiltre = g
        ElseIf f <> "" And g = "" Then
            strFiltre = f
        End If
     
     
        Me.Filter = strFiltre
        Me.FilterOn = True
     
    End Sub
    ... et dis-nous ...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 226
    Points : 261
    Points
    261
    Par défaut
    ou encore ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Private Sub CmdFiltre_Click()
    f = ""
    g = ""
    If Not IsNull(Me.Rnom) And Me.Rnom <> "" Then
      f = "NOM LIKE ""*" & Me.Rnom & "*"""
    End If
    If Not IsNull(Me.Rprenom) And Me.Rprenom <> "" Then
      f = f & IIf(Len(f)>0," And ","") & "PRENOM LIKE ""*" & Me.Rprenom & "*"""
    End If
    .....
    End Sub

  6. #6
    Membre expérimenté Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Points : 1 591
    Points
    1 591
    Par défaut
    ... mais pas tout à fait ...

    Si la condition "Me.Rnom <> """ est vraie, "Me.Rnom" ne peut être "Null". Donc, à mon avis, le "Not IsNull(Me.Rnom) And" est de trop


    D'autre-part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tu écris cela :  f = f & IIf(Len(f)>0, "" , " And " ) & "PRENOM LIKE ""*" & Me.Rprenom & "*"""
    Je crois que :   f = f & IIf(Len(f)>0, " And " , "" ) & "PRENOM LIKE ""*" & Me.Rprenom & "*"""
    ... serait plus juste ... mais effectivement, cela supprime quelques lignes de code !

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 226
    Points : 261
    Points
    261
    Par défaut
    bernardmichel ....

    tout à fait raison ... j'ai corrigé en même temps que tu me validais .....

  8. #8
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut
    bonsoir,

    Je viens d'essayer la sub de bernardmichel (elle comporte une petite erreur que j'ai corrigé : dans le paragraphe du filtre sur num il manque un end if à la fin)

    Malheureusement individuellement j'ai un résultat correct lorsqu'il y a 1 paramètre, mais dès qu'il y en a 2 je n'ai plus aucune proposition dans mon résultat (alors que je devrais en avoir 1)

    J'y ai pensé aujourd'hui et j'ai peut être une solution :
    Je créer une requête issue de la même table, et lorsque j'actionne mon bouton elle peut filtrer le formulaire par l'action "appliquer filtre" dans une macro. Mon seul soucis est que les critères de filtre peuvent être unique (ex :le nom uniquement) ou multiples (ex : le nom, le prenom, la ville).
    J'ai regardé le tutoriel de Charles A de plus prêt hier soir, afin de mieux comprendre son contenu, il y a l'air d'y avoir l'idée que je cherche. Malheureusement je n'arrive pas à écrire un code qui copie les critères dans la requête avant de l'utiliser comme filtre. Bien sûr il faudra qu'ils effacent les anciens en même temps.

    Qu'en pensez vous ?
    Etpouvez vous m'aider ?

    merci,

  9. #9
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut
    reponse à la proposition de mike020 :

    Je ne comprends pas la création de la variable g dans ton code : tu ne l'utilise pas après.

    D'autre part mes critères sont au nombre de 5 : nom, prenom, numéro (num), rue, ville.

    Par contre :

    f = f & IIf(Len(f)>0, " And " , "" ) & "PRENOM LIKE ""*" & Me.Rprenom & "*"""
    Peux tu m'expliquer cette ligne qui apparemment ajoute le critère du prenom à f contenant déjà le critère du nom. Ou alors me faire référence à un tutoriel s'il en existe un. Le tutoriel multi-critere de Charles A ne détaille pas cette ligne, et j'ai du mal à la comprendre.

    merci pour vos aides

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 226
    Points : 261
    Points
    261
    Par défaut
    Citation Envoyé par chrisaccess Voir le message
    reponse à la proposition de mike020 :
    Je ne comprends pas la création de la variable g dans ton code : tu ne l'utilise pas après.
    Ne te prens pas la tête, je n'ai fait que copier tes propres lignes de codes ....


    Citation Envoyé par chrisaccess Voir le message
    Par contre :

    f = f & IIf(Len(f)>0, " And " , "" ) & "PRENOM LIKE ""*" & Me.Rprenom & "*"""
    Peux tu m'expliquer cette ligne qui apparemment ajoute le critère du prenom à f contenant déjà le critère du nom.
    merci pour vos aides
    Effectivement, ce petit bout de code valide si déjà un critère est construit et permet de concaténer plus d'un critère dans la même variable.

    Et effectivement la variable 'g' n'a plus de raison d'être ..

    et je n'ai pas poursuivi tout le code .... je voulais simplement t'indiquer une possibilité de construction parmi tant d'autres.

    Pour cette fois ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub CmdFiltre_Click()
    Dim f as string
     
    f = ""
     
    If Len(Me.Rnom>0) Then
       f = "NOM LIKE ""*" & Me.Rnom & "*"""
    End If
    If Len(Me.Rprenom>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"PRENOM LIKE ""*" & Me.Rprenom & "*"""
    End If
    If Len(Me.Rnum>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"N° LIKE ""*" & Me.Rnum & "*"""
    End If
    If Len(Me.Rrue>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"RUE LIKE ""*" & Me.Rrue & "*"""
    End If
    If Len(Me.Rville>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"VILLE LIKE ""*" & Me.Rville & "*"""
    End If
    Me.Filter = "(f)"
    Me.FilterOn = True
     
    End Sub

  11. #11
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 143
    Points : 106
    Points
    106
    Par défaut
    BONSOIR mikego020,

    merci pour ton aide.
    J'ai installé ton programme et l'ai essayé : il m'affiche systématiquement un message : "entrer la valeur du paramètre f"

    J'ai constaté que le débogueur m'indiquer un problème sur la ligne :

    mefilter = "(f)"

    J'ai retiré les parenthèses sans succés.

    MAIS J AI FINALEMENT TROUVE LE PROBLEME :c'était les guillemets.
    ET EFFECTIVEMENT CE PROGRAMME FONCTIONNE

    Mille merci à vous deux pour cette aide précieuse.
    Je vais maintenant l'analyser pour l'utiliser dans d'autres programmes que j'ai en cours.

    ci joint le programme corrigé pour qu'il puisse être utiliser par d'autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     Private Sub CmdFiltre_Click()
    Dim f as string
     
    f = ""
     
    If Len(Me.Rnom>0) Then
       f = "NOM LIKE ""*" & Me.Rnom & "*"""
    End If
    If Len(Me.Rprenom>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"PRENOM LIKE ""*" & Me.Rprenom & "*"""
    End If
    If Len(Me.Rnum>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"N° LIKE ""*" & Me.Rnum & "*"""
    End If
    If Len(Me.Rrue>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"RUE LIKE ""*" & Me.Rrue & "*"""
    End If
    If Len(Me.Rville>0) Then
       f = f & IIf(Len(f)>0, " And " , "" ) &"VILLE LIKE ""*" & Me.Rville & "*"""
    End If
    Me.Filter = (f)
    Me.FilterOn = True
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/03/2010, 11h56
  2. [formulaire] recherche multi criteres
    Par Treuze dans le forum IHM
    Réponses: 3
    Dernier message: 10/01/2006, 10h36
  3. [Collections]Implémenter une recherche multi-critère performante
    Par ppaul127 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 29/12/2005, 14h38
  4. gui pour recherche multi critere
    Par komando dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 02/12/2005, 19h08
  5. Réponses: 14
    Dernier message: 15/06/2005, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo