Tri multiple dans listview

Byfranck

XLDnaute Occasionnel
Contenu Listview suivant 2 critères

Bonjour à tous,
Je vois que la fréquentation du Forum commence à remonter ... hé oui ça sent la fin des vacances ...:(

Je me tourne vers vous pour un problème de tri qui va peut être vous sembler simple ... J'ai touvé des exemples dans des Posts à ce sujet: si vous ouvrez mon VB vous verrez que je m'en suis inspiré sans retenue .. jusqu'au moment où...

Voila mon problème:
J'ai une base hyper lourde (>6000 lignes et 250 colonnes)
Je filtre suivant un mot clef ce qui va aparaitre dans un Usf, mais en ne recherchant que sur certaines colonnes de ma feuille: ça j'y suis parvenu ... non sans mal mais vous verrez dans l'exemple ça fonctionne en ayant défini des plages.

Pour afiner la sélection, je voudrais ajouter d'autres critères, mais là les exemple que je trouve me posent problème car le tri se fait sur l'intégralité de la feuille et pas sur une plage définie :)

je n'arrive pas à faire fonctionner la sélection sur 2 critères à la fois..

Oui je sais c'est pas clair ... c'est pour ça que j'ai recréé un exemple alégé.
Pour comprendre lancez une recherche sur tomate et kilo ... et Tomate est pris en compte mais pas kilo !!! :(
(j'avais essayé avec une case à cocher pour faire le & mais j'ai abandonné).

Je vous lance donc un cordial SOS ... si vous aviez un peu de temps pour jetter un coup d'oeil sur ce qui coince ce serait cool.

Cordialament @+
Franck
 

Pièces jointes

  • ByFranck _V13.zip
    22.8 KB · Affichages: 95
Dernière édition:

Byfranck

XLDnaute Occasionnel
Re : Tri multiple dans listview

Bonsoir à tous du Forum,

Je vois que mon post a été regardé mais n'a inspiré personne pour l'instant :eek:

Je me pose alors maintenant une question : Y a-t-il une solution à ma demande? :(
Est-il possible de filtrer sur plusieurs critères en définissant une plage différente pour chacun des critères: critère1 recherché dans les colonnes C à G et critère2 recherché dans les colonne T à U (par exemple)
Le résultat dans le listview serait l'affichage des lignes qui correspondent aux 2 critères

Si quelqu'un pouvait se pencher sur mon problème ça m'arrangerait bigrement!

Cordialement votre
Franck
 
C

Compte Supprimé 979

Guest
Re : Tri multiple dans listview

Salut ByFranck,

Pas simple ton histoire ;):D
Enfin j'ai quand même trouvé :p

Perso je n'aurais pas fait comme ça, sachant que l'on peut restreindre le critère 1 à la colonne E et le criètre 2 à la colonne F

Ensuite il suffirait de parcourir chaque ligne par une boucle et de comparer les 2 critères aux 2 colonnes

A+
 

Pièces jointes

  • ByFranck _V13.xls
    103.5 KB · Affichages: 223
Dernière modification par un modérateur:

skoobi

XLDnaute Barbatruc
Re : Tri multiple dans listview

Bonsoir ByFranck, Bruno :),

Je te suggère de passer par le filtre élaboré en copiant le résultat temporairement sur une autre feuille par exemple, pour ensuite récupérer ce résultat dans la listview, si j'ai bien compris...
 

Byfranck

XLDnaute Occasionnel
Re : Tri multiple dans listview

Bonjour Bruno et Skoobi,

Merci pour ce précieux coup de main!
Reste que j'ai vraiment besoin de faire des recherches de mot clef par zones délimitées
en pièce jointe un Excel dans lequel j'a modifié la définition des plages de recherche pour être plus proche de la réalité (il y a 2 zones distincts de recherche):
Quand on cherche par exemple "Spaghetti" avec le Textbox de gauche (choix1) la recherche se fait uniquement sur les colonnes 1 à 5.
Quand on recherche "pièce" avec le Textbox de droite (choix 2) la recherche se fait uniquement sur les colonnes 6 à 10.


=> 1er problème: j'ai ajouté kilo dans une case colonne 3 de la feuille
choix1 = kilo, 1er click il trouve le client4, si je clique de nouveau il ne trouve plus rien :eek:

=> 2eme problème:
En voulant modifier les plages pour la recherche choix1 & choix2, à la fin du code j'ai trouvé des lignes que je ne comprend pas et du coup je ne sais pas comment les modifier pour être certain d'avoir la recherche correcte:
"Spaghetti" en choix 1 et "kilo" en choix 2 :
le résultat ne doit être que les ligne qui ont "Spaghetti" quelque part dans les colonnes 1 à 5 à condition que ces lignes (clients) aient aussi "kilo" dans les colonnes 6 à 10

Si vous avez le courrage de vous pencher encore un peu sur mon problème se sera super cool!

Cordialement
Franck
 

Pièces jointes

  • ByFranck _V15.zip
    28.9 KB · Affichages: 117
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Tri multiple dans listview

Salut ByFranck,

=> 1er problème: j'ai ajouté kilo dans une case colonne 3 de la feuille
choix1 = kilo, 1er click il trouve le client4, si je clique de nouveau il ne trouve plus rien
Logique, tu utilises des variables globales, donc sont vidées que lorsque tu quittes ton USF
Pour corriger le bug tu dois mettre tes variables à ZERO en début de procédure
Code:
Private Sub CommandButton1_Click()
  ' Mettre à ZERO les variables globales
  lastrow = 0: Firstaddress = ""
  ' Etc ....

=> 2eme problème:
En voulant modifier les plages pour la recherche choix1 & choix2, à la fin du code j'ai trouvé des lignes que je ne comprend pas et du coup je ne sais pas comment les modifier pour être certain d'avoir la recherche correcte:
"Spaghetti" en choix 1 et "kilo" en choix 2 :
le résultat ne doit être que les ligne qui ont "Spaghetti" quelque part dans les colonnes 1 à 5 à condition que ces lignes (clients) aient aussi "kilo" dans les colonnes 6 à 10
Chez moi ça fonctionne bien comme ça :confused:
Je ne vois pas ou est ton problème ?

Nota : ton fichier exemple est vraiment tiré par les cheveux !
Mettre l'unité "Kilo" dans un numéro de facture et un nom d'article dans une remise !?

A+
 

Byfranck

XLDnaute Occasionnel
Re : Tri multiple dans listview

Re-Bonjour
Pour corriger le bug tu dois mettre tes variables à ZERO en début de procédure

Je viens de faire la modif et ça roule pour la 1ere partie.

dans la deuxième question mon pb n'est pas réglé:
mets "kilo" dans la case C17.
Si tu cherches maintenant les clients avec choix1=kilo et choix2=Spaghetti
il ne trouve pas le Client10.

Je sais l'exemple est plus que farfelu ... je me suis inspiré des données que j'a trouvé dans un exemple du Forum ... on ne mélage pas encore les kilo et le facture LOL!

Pour comprendre mon besoin: j'ai des filtrages à faire sur des critères qui sont dans des colonnes qui ne sont pas les une à côté des autres:
entre la zone de recherche A et la zone de recherche C, il y a par exemple un groupe de colonnes B dans lequel il ne faut pas que la recherche se fasse.
Imagine si je reprend mon exemple qu'un client s'appelle "Spaghetti" .... ou Mortadelle .. ou que dans son adresse il y ait un des termes recherché!

J'imagine que la solution est par là dans la dernière partie du code:
Code:
        ' Restreindre la plage au fur et à mesure de la recherche
        Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(B.Row + 1,[B][COLOR="blue"] 5[/COLOR][/B]), .Cells(DerLgn,[COLOR="blue"][B] 6[/B][/COLOR])))
        ' Faire un recherche complète du 1er critère
        Set B = Plage.Offset(1, 0).Find(T, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
        On Error Resume Next  ' pour éviter l'erreur de fin de recherche
      Loop While Not B Is Nothing And B.Address <> Firstaddress

Il faudrait pouvoir chercher le critère1 dans la même zone que lorsqu'on cherche sur le critère 1 seul et ensuite lire dans la ligne trouvé si dans cette ligne il existe le critère2 dans les colonnes de la 2eme zone

Tu penses que c'est techniquement jouable?

Cordialement
Franck
 

skoobi

XLDnaute Barbatruc
Re : Tri multiple dans listview

Re bonjour ByFrank, Bruno,

Assaye alors en utilisant la fonction NB.SI à la place d'appeler une 2eme fois Find, ça devrait marcher:

Code:
Private Sub CommandButton4_Click()
Dim Cpte As Integer
  With Me.ListView1
    .ListItems.Clear
    With .ColumnHeaders
      .Clear
      .Add , , "Société", 100
      .Add , , "Num Facture", 50, lvwColumnCenter
      .Add , , "Référence", 50, lvwColumnCenter
      .Add , , "Article", 100, lvwColumnCenter
      .Add , , "Unité fact.", 85, lvwColumnCenter
      .Add , , "Quantité", 85, lvwColumnCenter
      .Add , , "Facturé", 40, lvwColumnCenter
      .Add , , "Remise", 40, lvwColumnCenter
      .Add , , "Date", 60, lvwColumnCenter
    End With
    T = Me.TextBox1
    If T = "" Then Exit Sub
    R = Me.TextBox2
    If R = "" Then Exit Sub
    .Sorted = False
    .FullRowSelect = True
    .Gridlines = True
    .LabelEdit = 1
    .View = lvwReport
  End With
  With ThisWorkbook.Worksheets("Feuil1")
    DerLgn = .Range("A65535").End(xlUp).Row
    TabTemp = .Range(.Cells(2, 1), .Cells(DerLgn, 250)).Value
    Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(DerLgn, 5)))  'Recherche limitée à cette Plage
    ' **************************************************
    ' ICI COMMENCE LA GALERE  !!!!!
    Set B = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows)
    If Not B Is Nothing Then
      Firstaddress = B.Address
      Do
        ' Définir la ligne de recherche du 2ème critère
        Set Ligne = Application.Intersect(.UsedRange.Cells, .Range(.Cells(B.Row, 6), .Cells(B.Row, 10)))
        ' Recherche du 2ème critère dans la ligne
        Cpte = Application.CountIf(Ligne, "*" & R & "*")
        ' Si la valeur est trouvée
        If Cpte > 0 Then
          With Me.ListView1
            .ListItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 1)
            x = .ListItems.Count
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 3)
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 4)
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 5)
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 6)
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 7)
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 8)
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 10)
            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(Ligne.Row, 2)
          End With
        End If
        'continuer la recherche
        Set B = Plage.FindNext(B)
      Loop While Not B Is Nothing And B.Address <> Firstaddress
    End If
  End With
End Sub
 
Dernière édition:

Byfranck

XLDnaute Occasionnel
Re : Tri multiple dans listview

Re-bonjour Skoobi

ça marche nickel avec nb.si

Soyons fous ... un filtrage sur 3 critères ... pas de plantage :) mais des choses étranges: je ne maitrise pas bien les If et les end If ... à mon avis je ne dois pas les placer au bon endroit!


Reste un autre détail : la recherche sur des valeurs numérique ne fonctionne pas ... :eek:
Je ne comprend pas car dans la V14 ça fonctionnait :confused:

On n'a pourtant pas changer grand chose!

Quelqu'un voit d'ou ça peut venir !!!

En tout cas après ça se sera super avec cette méthode: je vais me faire des filtrages de données au petits oignons !
Merci beaucoup pour votre aide Skoobi et Bruno

Cordialement
Franck

Rectificatif: C'est seulement avec le filtrage multiple que les chiffres ne fonctionnent plus
 
Dernière édition:

Byfranck

XLDnaute Occasionnel
Re : Tri multiple dans listview

Re-,

J'ai fait une autre modif (voir post ci-dessus), je ne sais pas si c'est utile mais j'ai ajouté:
Dim Cpte2 As Integer
et
lastrow = 0: Firstaddress = ""

textbox1 = tort
textbox2 = Kilo
textbox3 = toto
Résultat: Client15 <= C'est OK


En plus du problème des chiffres qui ne semblent pas être traités dans le filtrage, j'ai essayé de faire fonctionner la recherche en laissant "*" comme valeur dans les 2 derniers textbox, en espérant que cela fonctionne sans filtrer... mais ça ne marche pas ...
pourtant ce serait pratique:
tous les textbox avec * au démarrage = liste complète
textbox1 = tort
textbox2 = Kilo
textbox3 = *
On obtient: Client15 C'est pas bon
Résultat correct: Client8 , 15 et 27


Quelqu'un saurait comment dépatouiller ça ?

Merci d'avance
 

Pièces jointes

  • ByFranck _V16 quar.zip
    26.5 KB · Affichages: 180
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : Tri multiple dans listview

Bonjour ByFranck,

En plus du problème des chiffres qui ne semblent pas être traités dans le filtrage, j'ai essayé de faire fonctionner la recherche en laissant "*" comme valeur dans les 2 derniers textbox, en espérant que cela fonctionne sans filtrer... mais ça ne marche pas ...



Comme un textbox renvoi toujours du texte, et bien le nombre n'est pas trouvé!
Il faut vérifier que la saisie est un nombre comme ceci:
Code:
[/FONT][/SIZE][/FONT]
[FONT=Arial][SIZE=2][FONT=Arial]IIf(IsNumeric(R), Val(R), "*" & R & "*")[/FONT][/SIZE][/FONT]
[FONT=Arial][SIZE=2][FONT=Arial]
Cela signifie aussi que la recherche se fera partiellement, c'est à dire que la cellule devra contenir le critère, sauf pour un nombre bien-sûr.

Il n'y a pas besoin de mettre * pour dire que tout est recherché.
Il suffit de laisser le textbox vide et d'adapter le code comme ceci.

Code:
[/FONT][/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Private Sub CommandButton4_Click()[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]  Dim Cpte1 As Integer[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]  Dim Cpte2 As Integer, TableauLigne()[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3] [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]  ' Mettre à ZERO les variables globales[/SIZE][/FONT]
[FONT=Times New Roman]  [SIZE=3]lastrow = 0: Firstaddress = ""[/SIZE][/FONT]
[FONT=Times New Roman] [/FONT]
[FONT=Times New Roman][SIZE=3]  With Me.ListView1[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    .ListItems.Clear[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    With .ColumnHeaders[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Clear[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Société", 100[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Num Facture", 50, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Référence", 50, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Article", 100, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Unité fact.", 85, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Quantité", 85, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Facturé", 40, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Remise", 40, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      .Add , , "Date", 60, lvwColumnCenter[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    End With[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    T = Me.TextBox1[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    If T = "" Then Exit Sub[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    R = Me.TextBox2[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]'    If R = "" Then Exit Sub[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    S = Me.TextBox3[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]'    If S = "" Then Exit Sub[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3] [/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    .Sorted = False[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    .FullRowSelect = True[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    .Gridlines = True[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    .LabelEdit = 1[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    .View = lvwReport[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]  End With[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]  With ThisWorkbook.Worksheets("Feuil1")[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    DerLgn = .Range("A65535").End(xlUp).Row[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    TabTemp = .Range(.Cells(2, 1), .Cells(DerLgn, 250)).Value[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]    Set Plage = Application.Intersect(.UsedRange.Cells, .Range(.Cells(8, 1), .Cells(DerLgn, 5)))  'Recherche limitée à cette Plage[/SIZE][/FONT]
[FONT=Times New Roman]    [SIZE=3]Set B = Plage.Find(T, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows)[/SIZE][/FONT]
[FONT=Times New Roman]    If Not B Is Nothing Then[/FONT]
[FONT=Times New Roman][SIZE=3]      Firstaddress = B.Address[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]      Do[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        ' Recherche du 2ème et 3eme critère dans la ligne[/SIZE][/FONT]
[FONT=Times New Roman]        [SIZE=3]If R <> "" Then[/SIZE][/FONT]
[FONT=Times New Roman]          Cpte1 = WorksheetFunction.CountIf(.Range(.Cells(B.Row, 6), .Cells(B.Row, 10)), IIf(IsNumeric(R), Val(R), "*" & R & "*"))[/FONT]
[FONT=Times New Roman][SIZE=3]        Else: Cpte1 = 1[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        End If[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        If S <> "" Then[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]          Cpte2 = WorksheetFunction.CountIf(.Range(.Cells(B.Row, 11), .Cells(B.Row, 15)), IIf(IsNumeric(S), Val(S), "*" & S & "*"))[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        Else: Cpte2 = 1[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        End If[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        ' Si la valeur est trouvée[/SIZE][/FONT]
[FONT=Times New Roman]        [SIZE=3]If Cpte1 > 0 And Cpte2 > 0 Then[/SIZE][/FONT]
[FONT=Times New Roman]          With Me.ListView1[/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems.Add , , Sheets("Feuil1").Cells(B.Row, 1)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            x = .ListItems.Count[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 3)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 4)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 5)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 6)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 7)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 8)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 10)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]            .ListItems(x).ListSubItems.Add , , Sheets("Feuil1").Cells(B.Row, 2)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]          End With[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        End If[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        'continuer la recherche[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]        Set B = Plage.FindNext(B)[/SIZE][/FONT]
[FONT=Times New Roman]      [SIZE=3]Loop While Not B Is Nothing And B.Address <> Firstaddress[/SIZE][/FONT]
[FONT=Times New Roman]    End If[/FONT]
[FONT=Times New Roman][SIZE=3]  End With[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]End Sub[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]


Bon test.
 

application

XLDnaute Nouveau
Re : Tri multiple dans listview

Bonjour les amis ce n'est pas une reponse que je propose mais une question

J’ai un problème qui me donne mal de tète, je pense qu’il est certainement très simple a résoudre pour vous les pros le mieuxest d’ouvrir le petit fichier joint ainsi vous comprendrez ma problématique c’est plus simple qu’une longue explication
Meci d’avance j’ai hatte de comprendre la solution c’est le but aussi
Jony a+
 

Pièces jointes

  • Classeur jony.xls
    39 KB · Affichages: 176
  • Classeur jony.xls
    39 KB · Affichages: 186
  • Classeur jony.xls
    39 KB · Affichages: 186
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 571
Messages
2 089 804
Membres
104 276
dernier inscrit
helenevellocet