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

Macros et VBA Excel Discussion :

[VBA-E]Filtre multi-critères


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club Avatar de ippo_master
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Points : 67
    Points
    67
    Par défaut [VBA-E]Filtre multi-critères
    Bonjour,

    Je souhaiterais effectuer une recherche avec 2 mots clés à chercher dans 2 colonnes différentes ( ces 2 colonnes contenant plusieurs phrases, à considérer comme des champs texte grosso modo)

    Avec le code ci-dessous, il fait la recherche en considérant la recherche Mot1 ou Mot2 alors que je veux faire Mot1 et Mot2

    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
    Mot1 = "toto"
    Mot2 = "zero"
     
    Set PlageA = Worksheets("Feuil1").Range("A1:F10000")
    Set PlageB = Worksheets("Feuil1").Range("C1:H10000")
     
    Set c = PlageA.Find(Mot1, LookIn:=xlFormulas)
    Set d = PlageB.Find(Mot2, LookIn:=xlFormulas)
    If Not c Is Nothing Then
    firstaddress = c.Address
    firstaddress2 = d.Address
    Do
    UserForm1.ListBox1.AddItem d
    Set c = .FindNext(c)
    Set d = .FindNext(d)
    Loop While Not c Is Nothing And c.Address <> firstaddress And Not d Is Nothing And d.Address <> firstaddress2
    End If
    End With
    Merci d'avance
    Merci de votre aide et en espérant pouvoir vous aider la prochaine fois

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Points : 542
    Points
    542
    Par défaut
    bonjour,

    tu peux verifier que les recherches renvoie qq chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Not c Is Nothing And Not d Is Nothing Then

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    je connais pas vraiment, mais ma logique perso me dis que find cherche C puis cherche d. donc si ton but est deux trouver deux occurence dans la meme ligne moi je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Set PlageA = Worksheets("Feuil1").Range("A1:F10000")
    Set c = PlageA.Find(Mot1, LookIn:=xlFormulas)
    if not c is nothing
    Set PlageB = Worksheets("Feuil1").Range(cells(c.row,1),cells.row,nbcolonne)
    Set d = PlageB.Find(Mot2, LookIn:=xlFormulas)
    end if
    .....reste de ton code
    Set c = .FindNext(c)
    j'édit juste pour dire que j'ai pas testé, et j'ai écris le code a main levée

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu n'as pas besoin de définir tes deux plages si le mot recherché est sur la même ligne.
    Par contre, si ce n'est pas le cas, la recherche telle que tu la mets risque de poser un pb car d'un mot1 trouvé, tu passes au mot2 trouvé et tu peux avoir raté un mot1 situé entre les deux. Enfin, je vois ça comme ça.
    Peux-tu préciser ta demande ?
    A+

  5. #5
    Membre du Club Avatar de ippo_master
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Apercu du type de tableau:

    Colonne1|Colonne2|Colonne3
    A| 6 |toto
    A| 0 |mario
    A| 2 |toto
    A| 8 |luigi
    B| 4 |tod
    B| 2 |koopa

    Objectif : lister les lignes répondant au critère "A" en colonne1 et "toto" en colonneB

    En creusant à partir du code d'alsimbad :

    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
    Mot1 = "A"
    Mot2 = "toto"
     
    'recherche sur 1er critère
    Set Plage1= Worksheets("Feuil1").Range("A1:A100")
    Set c = Plage1.Find(Mot1, LookIn:=xlFormulas)
    If Not c Is Nothing Then
    ' = lancement de la recherche sur le 2ème critère
    firstaddress = c.Address
    'recup du numéro de ligne
    Ligne = Right(firstaddress, 2)
    If Left(Ligne, 1) = "$" Then Ligne = Right(firstaddress, 1)
    'recherche sur colonne 3 pour mot2 en restreignant la plage à la valeur de la ligne correspondant au 1er critère
    Set Plage2 = Worksheets("Feuil1").Range(Cells(Ligne, 3), Cells(Ligne, 3))
    Set d = Plage2.Find(Mot2, LookIn:=xlFormulas)
    If Not d Is Nothing Then
    firstaddress2 = d.Address
    Do
    Set d = Plage2.FindNext(d)
    Loop While Not d Is Nothing And d.Address <> firstaddress2
    End If
    Do
    Set c = PlageS.FindNext(c)
    Loop While Not c Is Nothing And c.Address <> firstaddress 'ligne m'indiquant une erreur
    End If
    EDIT: Je pense que le fait de lancer une autre recherche alors que la première est en cours, lui fait perdre la valeur de c.
    Il faudrait pouvoir définir dans l'instruction find 2 arguments de recherche
    Merci de votre aide et en espérant pouvoir vous aider la prochaine fois

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par ippo_master
    Objectif : lister les lignes répondant au critère "A" en colonne1 et "toto" en colonneB
    C'est quand même plus clair
    Alors tu prends un bout du code d'alsimbad et tu ajoutes qqs lignes du mien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PlageA = Worksheets("Feuil1").Range("A1:F10000")
    Set c = PlageA.Find(Mot1, LookIn:=xlFormulas)
    if not c is nothing
         if Cell.offset(0,1) = Mot2 then
             Adres1 = Cell.address
             Adres2 = Cell.Offset(0,1).address
             'et après, avec ces adresses, tu fais ce que tu veux
             '.....reste de ton code
          else
             'Mot2 inexistant dans colonne B
         endif
      else
         'mot1 pas trouvé
    endif
    En espérant que ça réponde à ta demande vraie

  7. #7
    Membre du Club Avatar de ippo_master
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Dur dur de bien exposer son problème

    Citation Envoyé par ippo_master Voir le message
    Apercu du type de tableau:
    Colonne1|Colonne2|Colonne3
    BDEFAG| 6 |un jour toto a...
    FGADSAZZ| 0 |mario est...
    BVCA| 2 |toto suit...
    ATRSX| 8 |demain, luigi sera...
    BUIJNSQ| 4 |tod n'est pas...
    ZSWBB| 2 |un koopa est...

    Objectif : lister les lignes contenant la lettre "A" en colonne1 et contenant le mot "toto" en colonneB

    -> le vrai besoin de recherche au coeur de la cellule

    La méthode offset me renvoit une erreur systématique ("objet requis")
    Merci de votre aide et en espérant pouvoir vous aider la prochaine fois

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Dans mon code, remplace la ligne
    if Cell.offset(0,1) = Mot2 then
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         if Cells(Cell.Adress).offset(0,1) = Mot2 then
    je n'avais pas testé
    Et je n'ai toujours pas testé Tu peux le faire pour moi ?
    A+

  9. #9
    Membre du Club Avatar de ippo_master
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Toujours la même erreur d'objet requis ?
    Puis-je mettre mon doc excel en pièce jointe pour que ce soit plus simple ?
    Merci de votre aide et en espérant pouvoir vous aider la prochaine fois

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par ippo_master Voir le message
    Toujours la même erreur d'objet requis ?
    Puis-je mettre mon doc excel en pièce jointe pour que ce soit plus simple ?
    Bien sûr mais mets ton code qu'on puisse le corriger
    A+

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    C'est quand même plus clair
    Alors tu prends un bout du code d'alsimbad et tu ajoutes qqs lignes du mien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PlageA = Worksheets("Feuil1").Range("A1:F10000")
    Set c = PlageA.Find(Mot1, LookIn:=xlFormulas)
    if not c is nothing
         if Cell.offset(0,1) = Mot2 then
    ...
    Dans ce code, ouskel'n'or a fait une erreur: chaque fois que tu lis Cell, il faudrait plutot écrire c !!!

  12. #12
    Membre du Club Avatar de ippo_master
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Je vous joins l'exemple
    J'y ai intégré le peu de code qui marche

    Merci d'avance
    Fichiers attachés Fichiers attachés
    Merci de votre aide et en espérant pouvoir vous aider la prochaine fois

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Tiens, tiens! Je reconnais un code que j'ai pondu tout recemment...

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Citation Envoyé par Singular Voir le message
    Dans ce code, ouskel'n'or a fait une erreur: chaque fois que tu lis Cell, il faudrait plutot écrire c !!!
    Exact ! Heureusement qu'il y en a un qui suit

  15. #15
    Membre du Club Avatar de ippo_master
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Singular Voir le message
    Tiens, tiens! Je reconnais un code que j'ai pondu tout recemment...
    Carrément Singular, c'est déjà ton code qui m'a servi à pondre la première partie de recherche.
    Saurez-vous me sauver ?

    Merci de votre aide et en espérant pouvoir vous aider la prochaine fois

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Comme Singular a l'air de vouloir se contenter du rôle d'observateur, je corrige mon code selon ses dernières recommandations
    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
    Dim PlageA as range, c as range
    PlageA = Worksheets("Feuil1").Range("A1:F10000")
    Set c = PlageA.Find(Mot1, LookIn:=xlFormulas)
    if not c is nothing
         if Range(c.address).offset(0,1) = Mot2 then
             Adres1 = c.address
             Adres2 = Range(c.Address).Offset(0,1).address
             'et après, avec ces adresses, tu fais ce que tu veux
             '.....reste de ton code
          else
             'Mot2 inexistant dans colonne B
         endif
      else
         'mot1 pas trouvé
    endif
    Par contre, je lui laisse le soin de corriger son code dans ton fichier
    Je suis !

  17. #17
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Voici qui résout ton problème, je crois.

    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
    Sub Macro1()
        Dim rngRecherche As Range
        Dim rngDepart As Range
        Dim wksRecherche As Worksheet
        Dim c As Range
        Dim sMot1 As String
        Dim sMot2 As String
        Dim sService As String
     
        sMot1 = "vilain"
        sMot2 = "toto"
        sService = "PFSE"
        Set wksRecherche = Worksheets("FA")
     
        ' Filtrer le tableau sur la colonne 2 (Serv Emetteur) d'après la valeur sService
        Set rngDepart = wksRecherche.Columns(2)
        wksRecherche.AutoFilterMode = False ' Assurer que le filtre est absent pour commencer
        rngDepart.AutoFilter Field:=1, Criteria1:=sService
     
        ' Rechercher les occurences de sMot1 dans la colonne 6 (Description)
        Set rngRecherche = wksRecherche.Cells(1, 6).Resize(wksRecherche.Rows.Count, 1)
        For Each c In rngRecherche
            If c.Value = vbNullString Then Exit For ' Arrêter dès qu'un vide est rencontré
     
            If Not InStr(1, CStr(c.Value), sMot1) = 0 Then ' Si sMot1 est présent
     
                ' Rechercher sMot2 dans deuxième colonne à droite
                If Not InStr(1, c.Offset(0, 2).Value, sMot2) = 0 Then
                    MsgBox sMot1 & " et " & sMot2 & " trouvés sur ligne : " & CStr(c.Row)
                End If
            End If
        Next c
    End Sub
    La méthode Find ne convient pas vraiment à ce genre de problème. Un filtre appliqué à une colonne, suivi d'une boucle sur une autre colonne est plus direct et facile à implémenter.

  18. #18
    Membre du Club Avatar de ippo_master
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Un grand merci à vous 2, nous en sommes arrivés à bout.
    Je garde en mémoire cette instruction Instr que je ne connaissais pas

    Bravo encore
    Merci de votre aide et en espérant pouvoir vous aider la prochaine fois

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Une autre méthode n'utilisant que les filtres http://www.developpez.net/forums/sho...84#post2718884

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

Discussions similaires

  1. [AC-97] Comment amèliorer un filtre multi-critères à partir d'un formulaire
    Par louzignac dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/06/2009, 14h31
  2. filtre multi-critères
    Par Sami Xite dans le forum VBA Access
    Réponses: 1
    Dernier message: 06/05/2008, 14h49
  3. filtre multi-critères sans limitation du nombre de critères
    Par ouskel'n'or dans le forum Contribuez
    Réponses: 0
    Dernier message: 29/11/2007, 14h08
  4. Filtre multi-critères dans une base Paradox
    Par lohot dans le forum Bases de données
    Réponses: 10
    Dernier message: 10/02/2007, 22h54
  5. Filtre multi-critères
    Par lohot dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/02/2007, 13h35

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