XL 2021 Filtre Multi Critères Listview VBA

delsart59

XLDnaute Nouveau
Bonjour à tous,

Je viens à vous car j'arrive à la derniere étape de mon projet de fin d'étude qui consiste à créer une Database. J'ai donc créé un Userform et je vous met la capture ci dessous.

1713356854827.png


Pour chaque liste déroulante, j'arrive à filtrer les colonnes associées, (c'est déjà une bonne premiere étape). Maintenant, j'aimerais que ma listview prenne en compte plusieurs combobox et textbox pour affiner les recherches sans ajouter de bouton click. Actuellement ce n'est pas problématique car je n'ai pas beaucoup de lignes mais à l'avenir cela va se remplir.

Voici comment j'ai initialisé mes comboboxs :

''Copie des infos du formulaire dans la base de données

Function copy_from_form()
Dim lastRow As Long
lastRow = ActiveWorkbook.Sheets("Base de données").Range("A1000000").End(xlUp).Row
lastRow = lastRow + 1
With ActiveWorkbook.Sheets("Base de données")
.Range("A" & lastRow).Value = ComboBox6.Value
.Range("B" & lastRow).Value = ComboBox7.Value
.Range("C" & lastRow).Value = ComboBox1.Value
.Range("D" & lastRow).Value = ComboBox3.Value
.Range("E" & lastRow).Value = TextBox9.Value
.Range("G" & lastRow).Value = TextBox8.Value
.Range("F" & lastRow).Value = TextBox11.Value
.Range("H" & lastRow).Value = ComboBox4.Value
.Range("I" & lastRow).Value = ComboBox5.Value
.Range("J" & lastRow).Value = TextBox12.Value
.Range("K" & lastRow).Value = TextBox4.Value
End With
End Function



Voici laProcédure permettant d'afficher l'enregistrement selectionné dans les différents TextBox du formulaire

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
TxtProjet = ListView1.SelectedItem.SubItems(1)
TxtScope = ListView1.SelectedItem.SubItems(2)
TxtPhase = ListView1.SelectedItem.SubItems(3)
TxtGate = ListView1.SelectedItem.SubItems(4)
TxtCommodités = ListView1.SelectedItem.SubItems(5)
TxtProblèmerencontré = ListView1.SelectedItem.SubItems(6)
TxtDatedévènement = ListView1.SelectedItem.SubItems(7)
TxtourceProblème = ListView1.SelectedItem.SubItems(8)
TxtFamilledecause = ListView1.SelectedItem.SubItems(9)
TxtLiendAnalyse = ListView1.SelectedItem.SubItems(10)
TxtTempsperdu = ListView1.SelectedItem.SubItems(11)

' add hyperlink handling
Dim Link As String
Link = ListView1.SelectedItem.ListSubItems(10).Text
If Left(Link, 4) = "http" Then
ActiveWorkbook.FollowHyperlink (Link)
End If
End Sub

Voici ma fonction de recherche avec le combox6 (le premier)


Function FilterDataInListView()
Dim i As Long
Dim searchText As String
Dim j As Long
searchText = LCase(ComboBox6.Text)

ListView1.ListItems.Clear
For i = 1 To Sheets("Base de données").Cells(Rows.Count, 1).End(xlUp).Row
If InStr(1, LCase(Sheets("Base de données").Cells(i, 1).Value), searchText) > 0 Then
With ListView1.ListItems.Add(, , Sheets("Base de données").Cells(i, 1).Value)
For j = 1 To 11
.ListSubItems.Add , , Sheets("Base de données").Cells(i, j).Value
Next j
End With
End If
Next i

End Function

Et pour finir, voici le code permettant de faire appelle à la fonction :

Private Sub ComboBox6_Change()
Call FilterDataInListView
End Sub


S'il vous plait venez moi en aide cela fait deux jours que je cherche sur Internet.

Merci d'avance
 
Dernière édition:

delsart59

XLDnaute Nouveau
Bonjour Delsart59,

On m'a toujours dit, je suppose qu'ici c'est le cas aussi 🤔
Mieux vaut un fichier exemple qu'un long discours 😁
Bonjour,

Je comprends bien la demande, cependant je ne suis pas dans la possibilité de mettre ce fichier car il comporte des infos confidentielles. De plus, je n'aurais pas non plus acceès aux fichiers que vous pourriez me transmettre. Si je peux vous résumé mon probleme en 1 ligne, mes filtres fonctionnent indépendament des un des autres mais pas ensemble. Je n'arrive pas a mettre en mémoire le filtre appliqué sur la colonne précédente.

Cordialement
 

wDog66

XLDnaute Junior
Re,

Afin de test, il n'est pas compliqué, il me semble de :
- créer une copie du fichier
- supprimer un certain nombre de lignes (pas toutes)
- d'anonymiser les données restantes

En l'état, il faut changer la fonction avec un code du style
VB:
Function FilterDataInListView()
  Dim i As Long, j As Long
  Dim IndCrit As Integer, NbCbx As Integer
  Dim searchText As String

  ListView1.ListItems.Clear
  ' Pour Chaque ligne
  For i = 1 To Sheets("Base de données").Cells(Rows.Count, 1).End(xlUp).Row
    ' Mette le nombre de critères correspondant à 0
    IndCrit = 0
    ' Pour chaque Combobox numéroté de 1 à 7
    For NbCbx = 1 To 7
      searchText = LCase(Me.Controls("ComboBox" & NbCbx).Text)
      ' Si la valeur de la colonne correspond
      If InStr(1, LCase(Sheets("Base de données").Cells(i, NbCbx).Value), searchText) > 0 Then IndCrit = IndCrit + 1
    Next NbCbx
    ' Inscrire la ligne si tous les critères sont OK
    If IndCrit = 7 Then
      With ListView1.ListItems.Add(, , Sheets("Base de données").Cells(i, 1).Value)
        For j = 1 To 11
          .ListSubItems.Add , , Sheets("Base de données").Cells(i, j).Value
        Next j
      End With
    End If
  Next i
End Function

ATTENTION !
Il faudra que vos combobox de filtre soit numérotées de 1 à 7, ce qui n'est pas le cas actuellement

Si ce code ne fonctionne pas, pour moi, l'idée est là 🤔

A+
 

delsart59

XLDnaute Nouveau
Re,

Afin de test, il n'est pas compliqué, il me semble de :
- créer une copie du fichier
- supprimer un certain nombre de lignes (pas toutes)
- d'anonymiser les données restantes

En l'état, il faut changer la fonction avec un code du style
VB:
Function FilterDataInListView()
  Dim i As Long, j As Long
  Dim IndCrit As Integer, NbCbx As Integer
  Dim searchText As String

  ListView1.ListItems.Clear
  ' Pour Chaque ligne
  For i = 1 To Sheets("Base de données").Cells(Rows.Count, 1).End(xlUp).Row
    ' Mette le nombre de critères correspondant à 0
    IndCrit = 0
    ' Pour chaque Combobox numéroté de 1 à 7
    For NbCbx = 1 To 7
      searchText = LCase(Me.Controls("ComboBox" & NbCbx).Text)
      ' Si la valeur de la colonne correspond
      If InStr(1, LCase(Sheets("Base de données").Cells(i, NbCbx).Value), searchText) > 0 Then IndCrit = IndCrit + 1
    Next NbCbx
    ' Inscrire la ligne si tous les critères sont OK
    If IndCrit = 7 Then
      With ListView1.ListItems.Add(, , Sheets("Base de données").Cells(i, 1).Value)
        For j = 1 To 11
          .ListSubItems.Add , , Sheets("Base de données").Cells(i, j).Value
        Next j
      End With
    End If
  Next i
End Function

ATTENTION !
Il faudra que vos combobox de filtre soit numérotées de 1 à 7, ce qui n'est pas le cas actuellement

Si ce code ne fonctionne pas, pour moi, l'idée est là 🤔

A+
Bonjour,

Merci pour ce retour.
Je vais essayer ceci et je reviens vers vous.

PS : J'ai surement oublier de dire, j'ai une fonction de filtre pour chaque combobox. Ici j'en ai mis une seule.

Cordialement
 

delsart59

XLDnaute Nouveau
Re,

Afin de test, il n'est pas compliqué, il me semble de :
- créer une copie du fichier
- supprimer un certain nombre de lignes (pas toutes)
- d'anonymiser les données restantes

En l'état, il faut changer la fonction avec un code du style
VB:
Function FilterDataInListView()
  Dim i As Long, j As Long
  Dim IndCrit As Integer, NbCbx As Integer
  Dim searchText As String

  ListView1.ListItems.Clear
  ' Pour Chaque ligne
  For i = 1 To Sheets("Base de données").Cells(Rows.Count, 1).End(xlUp).Row
    ' Mette le nombre de critères correspondant à 0
    IndCrit = 0
    ' Pour chaque Combobox numéroté de 1 à 7
    For NbCbx = 1 To 7
      searchText = LCase(Me.Controls("ComboBox" & NbCbx).Text)
      ' Si la valeur de la colonne correspond
      If InStr(1, LCase(Sheets("Base de données").Cells(i, NbCbx).Value), searchText) > 0 Then IndCrit = IndCrit + 1
    Next NbCbx
    ' Inscrire la ligne si tous les critères sont OK
    If IndCrit = 7 Then
      With ListView1.ListItems.Add(, , Sheets("Base de données").Cells(i, 1).Value)
        For j = 1 To 11
          .ListSubItems.Add , , Sheets("Base de données").Cells(i, j).Value
        Next j
      End With
    End If
  Next i
End Function

ATTENTION !
Il faudra que vos combobox de filtre soit numérotées de 1 à 7, ce qui n'est pas le cas actuellement

Si ce code ne fonctionne pas, pour moi, l'idée est là 🤔

A+
Re bonjour,

Je viens de tester le code en modifiant les combobox. J'ai un petit soucis sur une ligne pourrais-tu m'aider à nouveau ?

searchText = LCase(Me.Controls("ComboBox" & NbCbx).Text) "Utilisation incorrect du mot clé Me"

Merci d'avance

Cordialement
 

delsart59

XLDnaute Nouveau
Re,

Ou se trouve la fonction, elle devrait être dans l'USF 🤔

A+
Effectivement je l'avais positionnée au mauvais endroit.

Merci à toi cela fonctionne parfaitement.

J'ai un autre soucis, j'ai un bouton qui m'ajoute des données dans une liste excel et qui renomme la plage.
Cette plage est affectée au combobox, cependant, lorsque j'ajoute une donnée, la mise a jour de mon combobox ne se fait pas. J'ai tenté de faire un Combobox1.clear à la fin de mon code bouton mais j'ai "erreur d'execution et une série de chiffres"

As-tu une solution pour ce problème s'il te plaît ?

Cordialement
 

ChTi160

XLDnaute Barbatruc
Bonjour le Fil
@delsart59 tu dis :
J'ai un autre soucis, j'ai un bouton qui m'ajoute des données dans une liste excel et qui renomme la plage.
Cette plage est affectée au combobox, cependant, lorsque j'ajoute une donnée, la mise a jour de mon combobox ne se fait pas. J'ai tenté de faire un Combobox1.clear à la fin de mon code bouton mais j'ai "erreur d'execution et une série de chiffres"

Question :
Ne peux tu utiliser un Tableau structuré plutôt qu'une plage Nommée
Autre Question : Tu as vraiment besoin de 6 Combobox de recherche pour affiner tes Filtres ?
As-tu fais une recherche avec "Combobox en Cascades"
Bonne fin de Journée
Jean marie
 

delsart59

XLDnaute Nouveau
Bonjour le Fil
@delsart59 tu dis :


Question :
Ne peux tu utiliser un Tableau structuré plutôt qu'une plage Nommée
Autre Question : Tu as vraiment besoin de 6 Combobox de recherche pour affiner tes Filtres ?
As-tu fais une recherche avec "Combobox en Cascades"
Bonne fin de Journée
Jean marie

Bonjour :)

Que veux tu dire par tableau structuré ? Actuellement j'ai une table et avec ma macro "ajout de données" dans ma table pour le combobox, elle renomme jusqu'à la derniere ligne nom vide la selection et je fais appelle à cette séléction dans les propriétés du combobox.

Pour ta deuxième question, je voulais mettre toutes ces combobox car à l'avenir j'aimerais que les personnes qui l'utilisent puissent affiner leurs recherches au maximum pour trouver exactement ce qu'ils veulent.

Je n'utilise pas de cascades ce sont des données indépendantes.

Encore merci pour l'aide.

Cordialement
 

delsart59

XLDnaute Nouveau
Bonjour delsart59
quand je dis : "As-tu fais une recherche avec "Combobox en Cascades""
sur le forum tu as la possibilité de faire des recherches (en haut à droite)
Quand je dis :"Tableau structuré"
Voir le Lien
dans l'attente
Bonne journée
jean marie
Je n'ai pas fait cette recherche car je ne pense pas qu'une combobox en cascade me soit utile ici.
Par contre oui, j'ai bien un tableau structuré pour faire mes listes.

Bonne journée
 

ChTi160

XLDnaute Barbatruc
Re
tu disais :" j'aimerais que ma listview prenne en compte plusieurs combobox et textbox pour affiner les recherches"
j'ai mal compris ton besoin (excuses)!
ca non plus je n'ai pas compris Lol
Je n'ai pas fait cette recherche car je ne pense pas qu'une combobox en cascade me soit utile ici
tu n'as pas regardé ce que veux dire des Combobox en Cascades !
Bonne continuation
Jean marie
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Quand les ComboBox doivent pouvoir être renseignées dans n'importe quel ordre, je les dis "liées" plutôt que "en cascade". Et il y a toujours mon objet ComboBoxLiées qui se charge de tout, réagissant tout seul aux saisies dans les ComboBox dont on lui aura confié la charge et déclenchant des évènements Change et Résultat (et ses dérivés Bingo et BingoUn) à l'intention de l'UserForm qui l'utilise.
 

delsart59

XLDnaute Nouveau
Re
tu disais :" j'aimerais que ma listview prenne en compte plusieurs combobox et textbox pour affiner les recherches"
j'ai mal compris ton besoin (excuses)!
ca non plus je n'ai pas compris Lol

tu n'as pas regardé ce que veux dire des Combobox en Cascades !
Bonne continuation
Jean marie

Re,
Je suis désolé je pensais avoir écrit que le problème de filtre était réglé; Je m'en excuse. Je sais ce qu'est les comboboxs en cascade, grace a l'entrée de la premiere valeur dans la premiere combobox, la seconde sort toutes les possibilités disponible et dans un sens ca fait une sorte de filtre. Mon nouveau problème est : lorsque je clique sur le bouton qui active la macro pour ajouter des valeurs à la colonne de mon tableau structuré qui correspond à la premiere combobox, j'aimerais que cette combobox soit mise à jour automatiquement sans avoir à fermer et ouvrir le userform. J'ai essayé Combobox1.clear dans la marco d'ajout de données mais ca me met un message d'erreur un peu bizarre.

Merci par avance.
 

Discussions similaires

Réponses
3
Affichages
147
Réponses
2
Affichages
164