Reccherche multicritere dans userform
Bonjour,
désolé je ne peux vous adresser le fichier en entier poru des raisons de confidentialité.
voici mon problème :
j'ai un classeur avec X onglets.
j'ai fais un userform avec listbox et textbox pour une recherche multicritere.
là ais deux problèmes :
mon code fonctionne mais ne "passe pas" par le code de recherche multi.
cela fais des jours que je teste nombre de code sans aucuns résultats.
aussi je viens vers vous car ais souvent suivi vos conseils éclairés.
voici les codes qui plantent puis le codes en entier.
J'espère que vous aurez de bonnes pistes pour moi car mon boss attends les résultats et là suis dans une impasse.
essai 1
Evaluate ("=sum(((Cells(x1, ""Q"").Offset(0, -12))= " & UserForm12.CI.Text & ") * ((Cells(x1, ""Q"").Offset(0, -13)) = " & UserForm12.TextAta.Text & ") * ((Cells(x1, ""Q"").Offset(0, -11))=" & UserForm12.ListeZone.Text & ") * ((Cells(x1, ""Q"").Offset(0, -10))=" & UserForm12.txtCadre.Text & ") * (Cells(x1, ""Q"").Offset(0, -9))=" & UserForm12.Txtlisse.Text & ") * ((Cells(x1, ""Q"").Offset(0, -14))= " & UserForm12.CoRSP.Text & ") * ((Cells(x1, ""Q"").Offset(0, -3))=" & UserForm12.Credac.Text & ") * ((Cells(x1, ""Q"").Offset(0, -8))=" & UserForm12.Motcle.Text & "))")essai 2
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 & "*" Thenessai3
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 & "*"essai 4
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)) Thenessai5
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 = "") Thenen 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
.Bonjour
damtrade a écrit :désolé je ne peux vous adresser le fichier en entier poru des raisons de confidentialité.
Pas besoin de tout
Tu enlèves tout ce qui n'est en rapport avec ton problème et si besoin s'en fait sentir tu anonymises les données personnelles
Une vingtaine de ligne dans les bases de données devrait suffire
c'est fait ais un spot perso
Bonjour
damtrade a écrit :c'est fait ais un spot perso
Si tu veux traduire en langage "vieux"
merci
voici le fichier sans info sensibles
merci d'avance
Dans un classeur, j'ai rapatrié sur plusieurs feuilles les fichiers dont j'ai besoin.
je souhaiterais via l'userform, faire une recherche basée soit sur un critère, soit sur plusieurs.
J'ai également un textbox pour une recherche syntaxique sur une colonne précise.
au finale, je voudrais que les résultats s'affichent dans les deux listview du usrf avec possibilité de l'imprimer avec mise en page ou de le copier dans un classeur a part.
Aucuns de mes essais de code ne fonctionnent. je désespère. j'ai même tenté via une feuille (nommée filtre) mais là aussi rien ne marche.
j'ai vraiment besoin de votre aide sur ce coup.
je vous joins le fichier oté des info sensibles..
C'est incroyable comment la politesse se perd (suis de l'ancienne génération )
Un essai : Juste la partie recherche
Bonsoir
Oupss
effectivement Banzai64 milles pardons pour mon incivilité mais tellement pris par mon problème que j'en ais oublié la bienséance.
pour ton fichier : MILLE MERCI !!!! c'est tout à fait ça !!!
et en plus ton code est tellement épuré !
bref du super beau et bon travail
tu m'enlève une sacrée épine du pied.
juste ..... si je peux ... ce serait la cerise sur le gâteau :
j'aimerais que l'utilisateur puisse choisir entre imprimer format excel le résultat ou l'enregistrer dans un autre classeur de son choix.
de plus est il possible de synchroniser les scroll des deux listview ?
encore merci pour ton aide
Chapeau bas
Bonsoir
Pas d'idée pour l'impression ou pour la sauvegarde
Banzai64 a écrit :est il possible de synchroniser les scroll des deux listview ?
Pourquoi ne pas tout mettre sur la même Listview ?
Bonsoir,
en fait je n'ai pas assez de place pour tout mettre dans une seule listview.
la partie commentaire prend bcp.
des idées ou des pistes pour placer dans un classeur ?
synchroniser l'ascenseur verticale des listview?
merci
Bonsoir
Le problème sera toujours le même, que tu aies 2 ListView ou 1 seule
Pour voir tout le commentaire il te faudra occulter les autres colonnes (c'est à dire que tu n'auras que la colonne commentaire pour la lire)
Ensuite il faudra bien diminuer cette colonne pour visualiser les autres colonnes
A quoi te sert d'avoir le numéro de ligne et accessoirement le nom de la page ?
Fais un exemple de résultat que tu voudrais obtenir
Pas trop compliqué car c'est la macro qui devra le faire