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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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

  2. #2
    Membre chevronné
    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
    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 Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 567
    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
    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 confirmé 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
    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

  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
    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 confirmé 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
    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")

  8. #8
    Membre chevronné

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    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 !!!

+ 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