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 :

Methode Find a 2 criteres


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 75
    Points
    75
    Par défaut Methode Find a 2 criteres
    Bonjour, j'aimerais savoir si avec la méthode Find, on peut la faire avec deux criteres de recherche. Car j'aurrait besoin de copier des lignes en fonction de 2 criteres
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    Set a = .Range("A" & a.Row, "A" & dl).Find(nomjournal)
    Sa c'est ma recherche sur un seul critere, mais j'aurrait besoin aussi de rechercher des valeurs 'date' dans la colonne 'b', j'avait penser a sa :
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    Set a = .Range("A" & a.Row, "A" & dl).Find(nomjournal) And .Range("B" & a.Row, "B" & dl).Find(date1)
    Mais sa ne marche pas

  2. #2
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Pourquoi 2 critères ?

    Pourquoi pas chercher sur le premier critère et vérifier ensuite la valeur dans la colonne B selon la ligne trouvée ?

    Sinon AUTOFILTER permet 2 critères.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bonjour,

    Pour ma part, quand j'ai eu besoin de faire cela (et supprimer des doublons etc.), j'ai imbriqué 2 boucles avec donc 2 .Find. Cela fonctionne très bien.

    Bonne chance !

  4. #4
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    La méthode Find renvoie un objet range dinc une cellule. Tu ne peux pas faire d'opération booléen sur une cellule. Ca n'a strictement aucun sens

    Il va te faloir faire des boucle et imbriquer tout cas
    Un exemple d'algorithme (en pseudo code) je te laisse le traduire en VBA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tant que a exist
       a=Find(critère1)
       tan que b existe
          b=find(critère2)
          si a=b alors
             on quite les deux boucle a est la bonne valeur
          fin si
       fin tant que
    fin tant que
    Edit :

    J'ai relu ton message. En fait j'ai rien compris a ce que tu veux faire.

    essaye ca c'est peut être ce que tu souhaite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set a = Union(.Range("A" & a.Row, "A" & dl).Find(nomjournal) ,.Range("B" & a.Row, "B" & dl).Find(date1))

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Voilà, quand je disais imbriquer 2 boucles avec 2 .Find, c'est exactement l'algorithme de Krovax que j'utilise. Cela marche au poil !

    Je te le mets si je le retrouve (traduit en VBA).

    En gros, tu fais les 2 .Find imbriqués et si les 2 sont différents de Nothing alors tu peux copier ta ligne.

    D'ailleurs, je me demande si je l'avais pas utilisé spécialement pour ce cas...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 75
    Points
    75
    Par défaut
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    Set a = Union(.Range("A" & a.Row, "A" & dl).Find(nomjournal) ,.Range("B" & a.Row, "B" & dl).Find(date1))
    Ce code ne marche pas et pour le teste en 2 partie j'ai essayer de le coder, mais pas réussit lol.
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Do while a is not nothing
         Set a = .Range("A" & a.Row, "A" & dl).Find(nomjournal)
         Do while b is not nothing
           Set b = .Range("b" & a.Row, "b" & dl).Find(date1)
           if a = b then
               exit do
               exit do
           end if
         loop
    loop



    Voici mon code pour le moment avec une seule recherche, je verfie que date1 et date2 ne sont pas nul et je rentre dans ma boucle de recherche avec pour le moment qu'une seule condition de recherche :
    Code vba : 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
     If date1 <> "" Or date2 <> "" Then
            Set a = .Range("A" & a.Row, "A" & dl).Find(nomjournal)
            Sheets.Add After:=Worksheets(Worksheets.Count)
            ActiveSheet.Name = "Ecriture"
            irow = 0
            irow2 = 1
            For x = 1 To dl - 1
                irow = irow + 1
                'Emepeche le rafraichissement de l'écran, pour ne pas voir le traitement
                Application.ScreenUpdating = False
                If a <> "" Then
                    'création d'une nouvelle feuille et on l'a renomme
                    firstaddress = a.Address
                    'copie des lignes concerner
                    Sheets("Ecriture").Cells(irow2, 1).Columns("A:BP").Value = a.EntireRow.Value
                    irow2 = irow2 + 1
                    Sheets("Ecriture").Select
                End If
                'Set a = .Range("A" & a.Row, "A" & dl).Find(nomjournal) And .Range("B" & a.Row, "B" & dl).Find(date1)
                Set a = .Range("B" & a.Row, "B" & dl).Find(date1)
            Next x

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bonjour,

    Voilà ce que j'ai utilisé, c'est exactement ce que tu veux :

    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
    Dim FL1 As Worksheet
    Dim Valeur As Variant, c As Range, Valeur2 As Variant, d As Range
    Dim NoLigne As Long, DerLig As Long, NoLigne2 As Long, DerLig2 As Long
        Set FL1 = Worksheets("DATA2")
        NoLigne = 1
        Do
            If Not Cells(NoLigne, 4) = "" Then
                Valeur = Cells(NoLigne, 4)
                Valeur2 = Cells(NoLigne, 3)
                Do
                    With FL1.Range("D" & NoLigne + 1, [D65536].End(xlUp))
                        DerLig = 0
                        Set c = .Find(Valeur, LookIn:=xlValues, LookAt:=xlWhole)
                        If Not c Is Nothing Then
                            If c.Row > NoLigne Then
     
                                With FL1.Range("C" & NoLigne + 1, [C65536].End(xlUp))
                                Set d = .Find(Valeur2, LookIn:=xlValues, LookAt:=xlWhole)
                                If Not d Is Nothing Then
     
                                    DerLig = c.Row
                                    c.EntireRow.Delete
     
                                End If
                                End With
                            End If
                        End If
                        Set c = Nothing
                    End With
                Loop While DerLig > NoLigne
            End If
            NoLigne = NoLigne + 1
        Loop While NoLigne < FL1.Range("D65536").End(xlUp).Row
    A la place de tu y fais ta copie et c'est bon. Adapte quand même mais il va te falloir comprendre un peu le code avant

    Au plaisir !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 75
    Points
    75
    Par défaut
    Dsl de faire le pelo chiant, mais y aurrait moyen que tu mettes kelkes commentaires, trop du mal a comprendre :s

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Re,

    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
    Dim FL1 As Worksheet
    Dim Valeur As Variant, c As Range, Valeur2 As Variant, d As Range
    Dim NoLigne As Long, DerLig As Long, NoLigne2 As Long, DerLig2 As Long
        Set FL1 = Worksheets("DATA2") 'Tu travailles sur la feuille DATA2. Tu peux travailler sur 2 feuilles différentes si tu veux.
        NoLigne = 1 'Variable de ligne
        Do
            If Not Cells(NoLigne, 4) = "" Then
                Valeur = Cells(NoLigne, 4) 'Valeur recherchée en 1er : elle est en D1 puis D2, D3 etc...
                Valeur2 = Cells(NoLigne, 3) 'Valeur2 recherchée en 2eme : elle est en C1 puis C2...
                Do
                    With FL1.Range("D" & NoLigne + 1, [D65536].End(xlUp)) 'Dans la colonne D jusqu'à la dernière cellule non vide
                        DerLig = 0 'Initialisation dernière ligne
                        Set c = .Find(Valeur, LookIn:=xlValues, LookAt:=xlWhole) 'Le .Find avec Valeur
                        If Not c Is Nothing Then 'Si valeur trouvée
                            If c.Row > NoLigne Then 'Si valeur trouvée autre que valeur de départ
     
                                With FL1.Range("C" & NoLigne + 1, [C65536].End(xlUp)) 'Dans la colonne C jusqu'à la dernière cellule non vide
                                Set d = .Find(Valeur2, LookIn:=xlValues, LookAt:=xlWhole) 'Le .Find avec Valeur2
                                If Not d Is Nothing Then 'Si valeur2 trouvée
     
                                    DerLig = c.Row 'Dernière ligne devient celle de la valeur (la 1ère) trouvée
                                    c.EntireRow.Delete 'Effacement de cette ligne
     
                                End If
                                End With
                            End If
                        End If
                        Set c = Nothing 'Et on recommence !
                    End With
                Loop While DerLig > NoLigne 'Tant que Dernière Ligne > Ligne
            End If
            NoLigne = NoLigne + 1 'Incrémentation
        Loop While NoLigne < FL1.Range("D65536").End(xlUp).Row 'On continue jusqu'à la dernière ligne
    Comme tu as pu le voir, le code s'occupe d'effacer les lignes où des doublons sont trouvés sur 2 critères. Tu as donc : recherche de la valeur de départ. Si le doublon est trouvé, recherche dans la colonne C de la valeur correspondante. Si c'est la même, on efface sinon, ce n'est pas un "vrai" doublon. Et on continue comme ça jusqu'à la fin de la feuille.

    Il ne te reste plus qu'à adapter.

    Bonne chance.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 235
    Points : 75
    Points
    75
    Par défaut
    Oki merci, jvais essayer de me demerder. Merci pour les comms

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

Discussions similaires

  1. methode find ("critere")
    Par mohcultiv dans le forum ASP
    Réponses: 2
    Dernier message: 23/10/2007, 15h02
  2. "methode" Find sur une Recordset
    Par eclesia dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 18/01/2007, 08h55
  3. [VBA-E]methode find
    Par richou dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/03/2006, 12h28
  4. STL: les map et la methode find. que fait-elle?
    Par cokmes dans le forum SL & STL
    Réponses: 6
    Dernier message: 07/11/2005, 08h31
  5. methode find
    Par bachilbouzouk dans le forum ASP
    Réponses: 9
    Dernier message: 26/04/2005, 10h47

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