Findnext à 2 conditions

Bonjour à tous!

Mon problème c'est que j'ai une recherche à 2 conditions. Je veux que quand je cherche les animaux mâles du lot n°5, il m'affiche tous les animaux mâles du lot 5. Avec le code ci dessous, je n'arrive qu'à afficher la première valeur trouvée et non les autres.

For Each c In Me.Sexe.Controls
  ligne = 1
Set PlageCible = ThisWorkbook.Sheets(NumCheptel.Value).Range("C:C")

    If c.Value = True And c.Caption = "Mâle" Then
    SexReq = "M"
    Set Trouvesexe = PlageCible.Find(SexReq, LookIn:=xlValues, lookat:=xlWhole)
        If NumLot = "" Then
            If Not Trouvesexe Is Nothing Then
            adresse = Trouvesexe.Address
                Do
                .ListItems.Add , , Trouvesexe.Offset(, -2)
                .ListItems(ligne).ListSubItems.Add 1, , Trouvesexe.Offset(, -1)
                .ListItems(ligne).ListSubItems.Add 2, , Trouvesexe
                .ListItems(ligne).ListSubItems.Add 3, , Trouvesexe.Offset(, 1)

                ligne = ligne + 1
                Set Trouvesexe = PlageCible.FindNext(Trouvesexe)
                Loop While Trouvesexe.Address <> adresse
            Else: MsgBox "Aucun animal ne correspond à vos critères!", , "Erreur animal"
            End If
        Else
        Set PlageLot = Trouvesexe.Offset(, 3)
        Set TrouveSexLot = PlageLot.Find(NumLot.Value, LookIn:=xlValue, lookat:=xlWhole)
            If Not TrouveSexLot Is Nothing Then
            adresse = TrouveSexLot.Address
                Do
                .ListItems.Add , , TrouveSexLot.Offset(, -5)
                .ListItems(ligne).ListSubItems.Add 1, , TrouveSexLot.Offset(, -4)
                .ListItems(ligne).ListSubItems.Add 2, , TrouveSexLot.Offset(, -3)
                .ListItems(ligne).ListSubItems.Add 3, , TrouveSexLot.Offset(, -2)

                ligne = ligne + 1
                Set Trouvesexe = PlageCible.FindNext(Trouvesexe)
                Set TrouveSexLot = PlageLot.FindNext(TrouveSexLot)
                Loop While TrouveSexLot.Address <> adresse
            Else: MsgBox "Aucun animal ne correspond à vos critères!", , "Erreur animal"
            End If
        End If

Je n'arrive pas bien à voir où est le problème! Si quelqu'un pourrait m'aider!

Bonjour à tous!

https://www.excel-pratique.com/~files/doc2/logiciel_caprin_2_.zip

Je bataille toujours avec ce code pour mon userform saisie pesée et je pense avoir trouver avec autofilter (ou peut-être que je suis carrément à côté aussi!).

Mais voilà quand j'applique le nouveau code il me lance un message erreur 91 "variable objet ou bloc with non défini", ensuite il me surligne .autofilter. Où est le problème je vous le demande? Merci de m'aider s'il vous plaît!!

Private Sub Chercher_Click()
Dim Trouvesexe As Range, PlageBase As Range, ligne%, PlageCible As Range, PlageFiltrée As Range, adresse$, c, SexReq$
With Me.ListView1

For Each c In Me.Sexe.Controls
  ligne = 1
Set PlageCible = ThisWorkbook.Sheets(NumCheptel.Value).Range("C:C")

    If c.Value = True And c.Caption = "Mâle" Then
    SexReq = "M"
    Set Trouvesexe = PlageCible.Find(SexReq, LookIn:=xlValues, lookat:=xlWhole)
        If NumLot = "" Then
            If Not Trouvesexe Is Nothing Then
            adresse = Trouvesexe.Address
                Do
                .ListItems.Add , , Trouvesexe.Offset(, -2)
                .ListItems(ligne).ListSubItems.Add 1, , Trouvesexe.Offset(, -1)
                .ListItems(ligne).ListSubItems.Add 2, , Trouvesexe
                .ListItems(ligne).ListSubItems.Add 3, , Trouvesexe.Offset(, 1)

                ligne = ligne + 1
                Set Trouvesexe = PlageCible.FindNext(Trouvesexe)
                Loop While Trouvesexe.Address <> adresse
            Else: MsgBox "Aucun animal ne correspond à vos critères!", , "Erreur animal"
            End If
        Else
        With ThisWorkbook.Sheets(NumCheptel.Value)
            Set PlageCible = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown)).Resize(, 50)
        End With
        With PlageBase
        .AutoFilter
        .AutoFilter field:=3, Criteria1:="M"
        .AutoFilter field:=6, Criteria1:=NumLot.Value
        End With
        Set PlageFiltrée = PlageBase.SpecialCells(xlCellTypeVisible)
            For Each d In PlageFiltrée.Range(Cells(2, 1).End(xlDown).Rows)
            If Not d Is Nothing Then
                .ListItems.Add , , d
                .ListItems(ligne).ListSubItems.Add 1, , d.Offset(, 1)
                .ListItems(ligne).ListSubItems.Add 2, , d.Offset(, 2)
                .ListItems(ligne).ListSubItems.Add 3, , d.Offset(, 3)

                ligne = ligne + 1
            Else: MsgBox "Aucun animal ne correspond à vos critères!", , "Erreur animal"
            End If
            Next d
      End If
End If

Next c
End With
End Sub

Bonsoir à tous,

Je pense qu'un filtre élaboré serait + approprié,

Envoie ton fichier avec seulement quelques lignes représentatives et les en-têtes

Amicalement

Claude.

Salut le forum et Claude!

Dans la feuille 98001 du document joint précédemment tu verras les entêtes et quelques lignes remplies! Au cas où je te l'ai remis ci-dessous!

https://www.excel-pratique.com/~files/doc2/logiciel_caprin_2_.zip

J'espère que ta soluce sera la bonne!!

A bientôt!

Bonjour,

Ne connaissant rien aux UseForm, je ne peux t'aider sur ce coup là ,

désolé !

Amicalement

Claude.

Bonjour à tous,

Greg, il semblerait que ta variable 'PlageBase' ne soit initialisée nulle part dans ta procédure 'Chercher'.

Salut tout le monde!

Merci vbanew! C'est vrai que je me suis trompé! A force de modifier je me suis un peu emmêler les pinceaux!

En fait, j'ai mis plagecible lau lieu de plagebase :

With ThisWorkbook.Sheets(NumCheptel.Value)

Set PlageBase = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown)).Resize(, 50)

end with

Mais maintenant, il me renseigne tous les éléments sans prendre en compte la plagefiltrée donc là je calle! J'ai essayé de modifier la plage de la boucle for each d pour lui dire de renseigner la première colonne de la plage filtrée en mettant comme suit:

For each d in PlageFiltrée.Columns(1)

mais là il me renseigne la première ligne c'est à dire les entêtes! Alors est que tu vois où çà plante?

Bonjour,

Il faut utiliser un 'resize' pour prendre la première colonne de la plage filtrée. De plus, pour travailler sur une plage filtrée, tu peux utiliser l'instruction 'Range("_FilterDataBase")'

Essaie en remplaçant :

                    For Each d In PlageFiltrée.Range(Cells(2, 1).End(xlDown).Rows)

par

                    For Each d In Range("_FilterDataBase").Offset(1, 0). _
                        Resize(Range("_FilterDataBase").Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)

Dans ce cas-là, ton

                    Set PlageFiltrée = PlageBase.SpecialCells(xlCellTypeVisible)

n'a plus lieu d'être.

Tu peux également ajouter

ListView1.ListItems.Clear

en début de procédure pour vider le contenu de ton listview

C'EST TROP FORT!!!GRAND MERCI A TOI VBA-NEW! Cà faisait un bout de temps que j'étais là dessus comme je débute en vba! Encore merci!

Une petite question quand même si je change de critères de recherche, je voudrais que la nouvelle recherche apparaisse en dessous de l'ancienne dans la listview au lieu de l'effacer. Comment faire?

Bonjour greg, forum,

Si tu changes de critères, sans fermer ta boîte de dialogue, enlève l'instruction 'ListView1.ListItems.Clear' pour laisser ton ancienne recherche.

Par contre, en fermant ta boîte de dialogue, les données sont vidées. Et Je ne sais pas trop comment garder les données précédentes

Il faudrait l'intervention d'une personne plus compétente en VBA.

Tant pis merci quand même et à bientôt! Tu m'as déjà donné un sacré coup de main!

Rechercher des sujets similaires à "findnext conditions"