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
- Messages
- 9'249
- Excel
- Vista Office 2007FR
- Inscrit
- 8.12.2007
- Emploi
- retraité Sce.Méthodes
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!
- Messages
- 9'249
- Excel
- Vista Office 2007FR
- Inscrit
- 8.12.2007
- Emploi
- retraité Sce.Méthodes
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!