Recherche multicritere via userform
Bonjour,
Je viens vers vous car j'ai un problème depuis plusieurs jours sur mon code vb sous excel.
j'ai un classeur dans lequel se trouve plusieurs feuilles.
j'ai un userform avec 3 listbox et 5 textbox.
l'idée est que quelque soit la ou les listbox et / ou textbox renseignés, le résultat est la ligne correspondante aux critères qui s'affiche dans deux listview.
tout fonctionne sauf :
le programme ne rentre pas dans mon code à la ligne où je demande la recherche par critère.
j'ai tenté ceci :
puis ça :
ça également :
et enfin :
en mode debogage, on voit bien le curseur passé mais ne pas calculer !
je vous joins également le code complet si cela peut vous servir ...
Merci pour votre aide !
Je viens vers vous car j'ai un problème depuis plusieurs jours sur mon code vb sous excel.
j'ai un classeur dans lequel se trouve plusieurs feuilles.
j'ai un userform avec 3 listbox et 5 textbox.
l'idée est que quelque soit la ou les listbox et / ou textbox renseignés, le résultat est la ligne correspondante aux critères qui s'affiche dans deux listview.
tout fonctionne sauf :
le programme ne rentre pas dans mon code à la ligne où je demande la recherche par critère.
j'ai tenté ceci :
RIEN
If C Like "*" And C.Offset(0, -13) Like "UserForm12.CI.Text" _
Or C.Offset(0, -14) Like "*" & UserForm12.TextAta.Text & "*" _
Or C.Offset(0, -12) Like "*" & UserForm12.ListeZone.Value & "*" _
Or C.Offset(0, -11) Like "*" & UserForm12.txtCadre.Text & "*" _
Or C.Offset(0, -10) Like "*" & UserForm12.Txtlisse.Text & "*" _
Or C.Offset(0, -15) Like "*" & UserForm12.CoRSP.Text & "*" _
Or C.Offset(0, -3) Like "*" & UserForm12.Credac.Text & "*" _
Or C.Offset(0, -9) Like "*" & UserForm12.Motcle.Text & "*" Then
puis ça :
RecH = C Like "*" And C.Offset(0, -13) Like "UserForm12.CI.Text" _toujours rien
Or C.Offset(0, -14) Like "*" & UserForm12.TextAta.Text & "*" _
Or C.Offset(0, -12) Like "*" & UserForm12.ListeZone.Value & "*" _
Or C.Offset(0, -11) Like "*" & UserForm12.txtCadre.Text & "*" _
Or C.Offset(0, -10) Like "*" & UserForm12.Txtlisse.Text & "*" _
Or C.Offset(0, -15) Like "*" & UserForm12.CoRSP.Text & "*" _
Or C.Offset(0, -3) Like "*" & UserForm12.Credac.Text & "*" _
Or C.Offset(0, -9) Like "*" & UserForm12.Motcle.Text & "*"
ça également :
pas mieux
'If C <> "" And (UserForm12.CI.Text = "" Or UserForm12.CI.Text = C.Offset(0, -13)) _
And (UserForm12.TextAta.Text = "" Or UserForm12.TextAta.Text = C.Offset(0, -14)) _
And (UserForm12.ListeZone.Text = "" Or UserForm12.ListeZone.Text = C.Offset(0, -12)) _
And (UserForm12.txtCadre.Text = "" Or UserForm12.txtCadre.Text = C.Offset(0, -11)) _
And (UserForm12.Txtlisse.Text = "" Or UserForm12.Txtlisse.Text = C.Offset(0, -10)) _
And (UserForm12.CoRSP.Text = "" Or UserForm12.CoRSP.Text = C.Offset(0, -15)) _
And (UserForm12.Credac.Text = "" Or UserForm12.Credac.Text = C.Offset(0, -3)) _
And (UserForm12.Motcle.Text = "" Or UserForm12.Motcle.Text = C.Offset(0, -9)) Then
et enfin :
sans plus de succès !!!
If C Like "*" And IIf(C.Offset(0, -13) = UserForm12.CI.Text, C.Offset(0, -13) = UserForm12.CI.Text, UserForm12.CI.Text = "") _
'And IIf(C.Offset(0, -14) = UserForm12.TextAta.Text, C.Offset(0, -14) = UserForm12.TextAta.Text, UserForm12.TextAta.Text = "") _
And IIf(C.Offset(0, -12) = UserForm12.ListeZone.Value, C.Offset(0, -12) = UserForm12.ListeZone.Value, UserForm12.ListeZone.Value = "") _
And IIf(C.Offset(0, -11) = UserForm12.txtCadre.Text, C.Offset(0, -11) = UserForm12.txtCadre.Text, UserForm12.txtCadre.Text = "") _
And IIf(C.Offset(0, -10) = UserForm12.Txtlisse.Text, C.Offset(0, -10) = UserForm12.Txtlisse.Text, UserForm12.Txtlisse.Text = "") _
And IIf(C.Offset(0, -15) = UserForm12.CoRSP.Text, C.Offset(0, -15) = UserForm12.CoRSP.Text, UserForm12.CoRSP.Text = "") _
And IIf(C.Offset(0, -3) = UserForm12.Credac.Text, C.Offset(0, -3) = UserForm12.Credac.Text, UserForm12.Credac.Text = "") _
And IIf(C.Offset(0, -9) = UserForm12.Motcle.Text, C.Offset(0, -9) = UserForm12.Motcle.Text, UserForm12.Motcle.Text = "") Then
en mode debogage, on voit bien le curseur passé mais ne pas calculer !
je vous joins également le code complet si cela peut vous servir ...
Merci pour votre aide !
Sub RecH()
'Déclaration des variables
Dim G, F, C, D, d1, firstAddress, n As Integer
Dim Plage, PlaGe1, PlaGe2, plage3
Dim LiGne, ligne1, RecH
Dim Nom, MSN, Fich As String
Dim x As Integer
Dim trouve As Boolean
' G représente la nouvelle ligne de la listview ou les données vont êtres écrites
' F représente le numéro de feuille qui va être analisée
' C représente chaque cellule de la plage A2 à A et le numéro de la dernière ligne de la colonne A
' D représente le nombre de colonnes de la listview à remplir sauf la première
' firstAddress représente la cellule de la colonne A dont les critères correspondes a la recherche
' si c'est le cas, on vérifie que l'adresse soit différente de la ligne de titre et différent de vide
' Plage représente "= Range(firstAddress).Offset(0, D)" soit la cellule trouvée plus le décalage a droite (D) de 1 à 5 (boucle)
'Suspension du raffraichissement de l'écran
Application.ScreenUpdating = False
'Vidage du contenu de la listview
UserForm12.ListView1.ListItems.Clear
UserForm12.ListView2.ListItems.Clear
'Mise à 1 de la variable G correspondante au nombre de lignes de recherche
G = 1
n = 1
'Mise en place de la recherche en partant de la dernière feuille vers la premiere
ligne1 = Workbooks("Occurences.xlsm").Sheets("Feuil1").Range("K" & "65536").End(xlUp).Row
Set plage3 = Workbooks("Occurences.xlsm").Sheets("Feuil1").Range("K" & "11:" & "K" & ligne1)
With plage3
For F = Sheets.Count To 1 Step -1
For x = 11 To Workbooks("Occurences.xlsm").Sheets("Feuil1").Range("K65536").End(xlUp).Row
Fich = Workbooks("Occurences.xlsm").Sheets("Feuil1").Cells(x, "k").Value
Nom = Workbooks("Occurences.xlsm").Sheets("Feuil1").Cells(x, "k").Offset(0, -10).Value
If Sheets(F).name = Nom Then
trouve = True
End If
If Not trouve Then
Exit For
End If
'Activation de la feuille
Sheets(Nom).Activate
'MsgBox (ActiveSheet.name)
'Définition de la plage de recherche sur la feuille active
LiGne = Sheets(Nom).Range("Q" & "8:" & "Q" & "65536").End(xlUp).Row + 1
Set Plage = Sheets(Nom).Range("Q" & "8:" & "Q" & LiGne)
For Each C In Plage
If C Like "*" And C.Offset(0, -13) Like "UserForm12.CI.Text" _
Or C.Offset(0, -14) Like "*" & UserForm12.TextAta.Text & "*" _
Or C.Offset(0, -12) Like "*" & UserForm12.ListeZone.Value & "*" _
Or C.Offset(0, -11) Like "*" & UserForm12.txtCadre.Text & "*" _
Or C.Offset(0, -10) Like "*" & UserForm12.Txtlisse.Text & "*" _
Or C.Offset(0, -15) Like "*" & UserForm12.CoRSP.Text & "*" _
Or C.Offset(0, -3) Like "*" & UserForm12.Credac.Text & "*" _
Or C.Offset(0, -9) Like "*" & UserForm12.Motcle.Text & "*" Then
RecH = C Like "*" And C.Offset(0, -13) Like "UserForm12.CI.Text" _
Or C.Offset(0, -14) Like "*" & UserForm12.TextAta.Text & "*" _
Or C.Offset(0, -12) Like "*" & UserForm12.ListeZone.Value & "*" _
Or C.Offset(0, -11) Like "*" & UserForm12.txtCadre.Text & "*" _
Or C.Offset(0, -10) Like "*" & UserForm12.Txtlisse.Text & "*" _
Or C.Offset(0, -15) Like "*" & UserForm12.CoRSP.Text & "*" _
Or C.Offset(0, -3) Like "*" & UserForm12.Credac.Text & "*" _
Or C.Offset(0, -9) Like "*" & UserForm12.Motcle.Text & "*"
' MsgBox (RecH)
' If C <> "" And (UserForm12.CI.Text = "" Or UserForm12.CI.Text = C.Offset(0, -13)) _
'And (UserForm12.TextAta.Text = "" Or UserForm12.TextAta.Text = C.Offset(0, -14)) _
'And (UserForm12.ListeZone.Text = "" Or UserForm12.ListeZone.Text = C.Offset(0, -12)) _
'And (UserForm12.txtCadre.Text = "" Or UserForm12.txtCadre.Text = C.Offset(0, -11)) _
' And (UserForm12.Txtlisse.Text = "" Or UserForm12.Txtlisse.Text = C.Offset(0, -10)) _
' And (UserForm12.CoRSP.Text = "" Or UserForm12.CoRSP.Text = C.Offset(0, -15)) _
' And (UserForm12.Credac.Text = "" Or UserForm12.Credac.Text = C.Offset(0, -3)) _
' And (UserForm12.Motcle.Text = "" Or UserForm12.Motcle.Text = C.Offset(0, -9)) Then
'If C Like "*" And IIf(C.Offset(0, -13) = UserForm12.CI.Text, C.Offset(0, -13) = UserForm12.CI.Text, UserForm12.CI.Text = "") _
' And IIf(C.Offset(0, -14) = UserForm12.TextAta.Text, C.Offset(0, -14) = UserForm12.TextAta.Text, UserForm12.TextAta.Text = "") _
'And IIf(C.Offset(0, -12) = UserForm12.ListeZone.Value, C.Offset(0, -12) = UserForm12.ListeZone.Value, UserForm12.ListeZone.Value = "") _
'And IIf(C.Offset(0, -11) = UserForm12.txtCadre.Text, C.Offset(0, -11) = UserForm12.txtCadre.Text, UserForm12.txtCadre.Text = "") _
'And IIf(C.Offset(0, -10) = UserForm12.Txtlisse.Text, C.Offset(0, -10) = UserForm12.Txtlisse.Text, UserForm12.Txtlisse.Text = "") _
'And IIf(C.Offset(0, -15) = UserForm12.CoRSP.Text, C.Offset(0, -15) = UserForm12.CoRSP.Text, UserForm12.CoRSP.Text = "") _
'And IIf(C.Offset(0, -3) = UserForm12.Credac.Text, C.Offset(0, -3) = UserForm12.Credac.Text, UserForm12.Credac.Text = "") _
'And IIf(C.Offset(0, -9) = UserForm12.Motcle.Text, C.Offset(0, -9) = UserForm12.Motcle.Text, UserForm12.Motcle.Text = "") Then
'Alors on place l'adresse de la variable de firstaddress
firstAddress = C.Address
If firstAddress = "$Q$" & LiGne And C <> "" Then
With ThisWorkbook.ActiveSheet
'On rempli la première colonne de la listview avec la valeur de la variable
UserForm12.ListView1.ListItems.Add , , n
'UserForm12.ListView2.ListItems.Add , , n
' Set PlaGe = Range(firstAddress).Offset(0, -1)
' UserForm12.ListView1.ListItems(G).ListSubItems.Add , , PlaGe
Set Plage = Range(firstAddress).Offset(0, -16)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , ActiveSheet.name
Set Plage = Range(firstAddress).Offset(0, -15)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , (Range(firstAddress).Offset(0, -16))
Set Plage = Range(firstAddress).Offset(0, -14)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -13)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -12)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -11)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -10)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -9)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -8)
UserForm12.ListView1.ListItems(G).ListSubItems.Add , , Plage
With ListView2
.ListItems.Add , , n
End With
Set Plage = Range(firstAddress).Offset(0, -7)
UserForm12.ListView2.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -5)
UserForm12.ListView2.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -4)
UserForm12.ListView2.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -3)
UserForm12.ListView2.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -2)
UserForm12.ListView2.ListItems(G).ListSubItems.Add , , Plage
Set Plage = Range(firstAddress).Offset(0, -1)
UserForm12.ListView2.ListItems(G).ListSubItems.Add , , Plage
n = n + 1
End With
'On rajoute 1 à G afin de déterminer la prochaine ligne à remplir dans la listview
G = G + 1
' End If
'LiGne = LiGne + 1
End If
End If
Next C
Next x
Next F
End With
If UserForm12.ListView1.ListItems.Count = 0 Then MsgBox "Pas de résultat trouvé", vbOKOnly, "FIN DE RECHERCHE"
Application.ScreenUpdating = True
End Sub