Filtrer une listview entre deux dates

Bonjour,

Je viens vers vous car je ne trouve pas la solution à mn problème, je charge correctement ma listview, mais dés que je veux entrer une date, j'ai ce message qui apparait.

ereur2

en suite je regarde ou c'est le problème est la c'est le textbox2 qui pose problème apparemment, mais je vois pas du tout ce que cela peut-être.

erreur1

Je joins mon code , si quelqu'un à la solution à mon soucis.

D'avance merci

Dim C As Variant, Lg As Long, list As ListItem, i As Integer
Dim Key2 As Boolean, Key1 As Boolean

Private Sub TextBox1_Change()
TextBox1.MaxLength = 10
If Len(TextBox1) = 2 Or Len(TextBox1) = 5 Then TextBox1 = TextBox1 & "."
Filtre_dates
End Sub

Private Sub TextBox2_Change()
TextBox1.MaxLength = 10
If Len(TextBox2) = 2 Or Len(TextBox2) = 5 Then TextBox2 = TextBox2 & "."
Filtre_dates
End Sub

Private Sub UserForm_Initialize()
C = Feuil1.Range("A1:M" & Feuil1.Range("A6500").End(xlUp).Row).Value
With UserForm1.ListView1
   .ListItems.Clear
With .ColumnHeaders
        .Clear
    .Add Text:="N° Main", Width:=40, Alignment:=fmAlignmentLeft
    .Add Text:="Lieu", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Secteur", Width:=70, Alignment:=lvwColumnCenter
    .Add Text:="Machine", Width:=160, Alignment:=lvwColumnCenter
    .Add Text:="Descriptif maintenance", Width:=250, Alignment:=lvwColumnCenter
    .Add Text:="Spécial", Width:=140, Alignment:=lvwColumnCenter
    .Add Text:="Genre", Width:=60, Alignment:=lvwColumnCenter
    .Add Text:="Par qui", Width:=50, Alignment:=lvwColumnCenter
    .Add Text:="Procédure", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Sécurité", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Compteur", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Antérieure", Width:=60, Alignment:=lvwColumnCenter
    .Add Text:="Prochaine", Width:=60, Alignment:=lvwColumnCenter

    End With
    .Gridlines = True
    .BorderStyle = ccFixedSingle
    .FullRowSelect = True
    .View = lvwReport
    '.Width = 1100
For Lg = 2 To UBound(C)
Set list = ListView1.ListItems.Add(, , Format(C(Lg, 1), "00"))
    With list
    For i = 2 To 13
    .ListSubItems.Add , , C(Lg, i)
            'C(Lg, 9) = Format(C(Lg, 9), "0# ## ## ## ##")
    Next i:
    End With:
    Next Lg:
End With
End Sub

Private Sub Filtre_dates()
    If Len(TextBox1) = 10 Then deb = CDate(TextBox1)
    If Len(TextBox2) = 10 Then fin = CDate(TextBox2)
    ListView1.ListItems.Clear
For Lg = 2 To UBound(C)
Select Case True
    Case deb <> "" And fin = "": Key1 = C(Lg, 13) >= deb
    Case deb <> "" And fin <> "": Key1 = C(Lg, 13) >= deb
    Key2 = C(Lg, 13) <= fin: Key1 = Key1 And Key2
    Case deb = "" And fin = "": Key1 = True
End Select
If Key1 Then
    Set list = ListView1.ListItems.Add(Text:=C(Lg, 1))
    For i = 2 To UBound(C, 2)
    list.SubItems.Add , , C(Lg, i)
    'C(Lg, 9) = Format(C(Lg, 9), "0# ## ## ## ##")
Next i
End If

End Sub

Autre chose , je dois filtrer la 13ème colonne c'est la que j'ai mes dates.

Bonsoir Claude Mettraux,

Quand on souhaite filtrer sur une fourchette de date, il faut attendre d'avoir les deux dates inscrites dans les textbox avant de lancer le filtre.

Private Sub TextBox1_Change()
TextBox1.MaxLength = 10
If Len(TextBox1) = 2 Or Len(TextBox1) = 5 Then TextBox1 = TextBox1 & "."
'ICI LANCEMENT d'UN PREMIER FILTRE
Filtre_dates
End Sub

Pourquoi opérer un premier filtre?

Si je choisis le 10/04/2023 j'aurais donc toutes les lignes qui ont communément cette date.

Ensuite si mon choix se porte sur le 16/04/2023 pour le deuxième textbox, il bloque, sauf si la date précédente dans celle-ci est le 10/04/2023.

Lancer le filtre une fois que les deux dates sont présentes dans les textbox. Donc uniquement après le changement dans le 2ième textBox

Bonjour,

Toujours en soucis malgré mon changement, j'ai mis un bouton pour déclencher mon filtre et il me donne encore une erreur,

ereur3

J'ai mis aussi modifier le 1 er filtre et cela fonctionne, il m'enlève les dates avant.

mais moi je veux entre les deux.

Voici mon code modifier

Dim C As Variant, Lg As Long, list As ListItem, i As Integer
Dim Key2 As Boolean, Key1 As Boolean

Private Sub CommandButton1_Click()
TextBox1.MaxLength = 10
If Len(TextBox2) = 2 Or Len(TextBox2) = 5 Then TextBox2 = TextBox2 & "."
Filtre_dates2
TextBox3.Text = ListView1.ListItems.Count
End Sub

Private Sub TextBox1_Change()
TextBox1.MaxLength = 10
If Len(TextBox1) = 2 Or Len(TextBox1) = 5 Then TextBox1 = TextBox1 & "."
'ICI LANCEMENT d'UN PREMIER FILTRE
Filtre_dates1
 TextBox3.Text = ListView1.ListItems.Count
End Sub

Private Sub TextBox2_Change()
TextBox1.MaxLength = 10
If Len(TextBox2) = 2 Or Len(TextBox2) = 5 Then TextBox2 = TextBox2 & "."
'Filtre_dates
TextBox3.Text = ListView1.ListItems.Count
End Sub

Private Sub UserForm_Initialize()
C = Feuil1.Range("A1:M" & Feuil1.Range("A6500").End(xlUp).Row).Value
With UserForm1.ListView1
   .ListItems.Clear
With .ColumnHeaders
        .Clear
    .Add Text:="N° Main", Width:=40, Alignment:=fmAlignmentLeft
    .Add Text:="Lieu", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Secteur", Width:=70, Alignment:=lvwColumnCenter
    .Add Text:="Machine", Width:=160, Alignment:=lvwColumnCenter
    .Add Text:="Descriptif maintenance", Width:=250, Alignment:=lvwColumnCenter
    .Add Text:="Spécial", Width:=140, Alignment:=lvwColumnCenter
    .Add Text:="Genre", Width:=60, Alignment:=lvwColumnCenter
    .Add Text:="Par qui", Width:=50, Alignment:=lvwColumnCenter
    .Add Text:="Procédure", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Sécurité", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Compteur", Width:=40, Alignment:=lvwColumnCenter
    .Add Text:="Antérieure", Width:=60, Alignment:=lvwColumnCenter
    .Add Text:="Prochaine", Width:=60, Alignment:=lvwColumnCenter

    End With
    .Gridlines = True
    .BorderStyle = ccFixedSingle
    .FullRowSelect = True
    .View = lvwReport
    '.Width = 1100
For Lg = 2 To UBound(C)
Set list = ListView1.ListItems.Add(, , Format(C(Lg, 1), "00"))
    With list
    For i = 2 To 13
    .ListSubItems.Add , , C(Lg, i)
            'C(Lg, 9) = Format(C(Lg, 9), "0# ## ## ## ##")
    Next i:
    End With:
    Next Lg:
End With
End Sub

Private Sub Filtre_dates1()
    If Len(TextBox1) = 10 Then deb = CDate(TextBox1)
    ListView1.ListItems.Clear
For Lg = 2 To UBound(C)
Select Case True
    Case deb <> "": Key1 = C(Lg, 13) >= deb
    Case deb <> "": Key1 = C(Lg, 13) >= deb
    Case deb = "": Key1 = True
End Select
If Key1 Then
    Set list = ListView1.ListItems.Add(Text:=C(Lg, 1))
    For i = 2 To UBound(C, 2)
    list.ListSubItems.Add , , C(Lg, i)
    'C(Lg, 9) = Format(C(Lg, 9), "0# ## ## ## ##")
Next i
End If
Next Lg
End Sub
Private Sub Filtre_dates()
    If Len(TextBox2) = 10 Then deb = CDate(TextBox2)
    ListView1.ListItems.Clear
For Lg = 2 To UBound(C)
Select Case True
    Case deb <> "": Key2 = C(Lg, 13) <= deb
    Case deb <> "": Key2 = C(Lg, 13) <= deb
    Case deb = "": Key2 = True
End Select
If Key1 Then
    Set list = ListView1.ListItems.Add(Text:=C(Lg, 1))
    For i = 2 To UBound(C, 2)
    list.ListSubItems.Add , , C(Lg, i)
    'C(Lg, 9) = Format(C(Lg, 9), "0# ## ## ## ##")
Next i
End If
Next Lg
End Sub
Private Sub Filtre_dates2()
    If Len(TextBox1) = 10 Then deb = CDate(TextBox1)
    If Len(TextBox2) = 10 Then fin = CDate(TextBox2)
    ListView1.ListItems.Clear
For Lg = 2 To UBound(C)
Select Case True
    Case deb <> "" And fin = "": Key1 = C(Lg, 13) >= deb
    Case deb <> "" And fin <> "": Key1 = C(Lg, 13) >= deb
    Key2 = C(Lg, 13) <= fin: Key1 = Key1 And Key2
    Case deb = "" And fin = "": Key1 = True
End Select
If Key1 Then
    Set list = ListView1.ListItems.Add(Text:=C(Lg, 1))
    For i = 2 To UBound(C, 2)
    list.ListSubItems.Add , , C(Lg, i)
    'C(Lg, 9) = Format(C(Lg, 9), "0# ## ## ## ##")
Next i
End If
Next Lg
End Sub

Il me semble qu'il n'arrive pas à aller chercher la valeur du Textbox2, mais je ne comprends pas pourquoi?

merci de votre aide

Bonjour,

A quoi ressemble la date dans la textbox2?

Cdlt

Bonjour Arturo, C'est la même programmation que dans le Textbox1, c'est à dire que je je tappe: 01.10.2023 et je recherche dans la même colonne.

TextBox1.MaxLength = 10
If Len(TextBox1) = 2 Or Len(TextBox1) = 5 Then TextBox1 = TextBox1 & "."
'ICI LANCEMENT d'UN PREMIER FILTRE
Filtre_dates1
 TextBox3.Text = ListView1.ListItems.Count
End Sub

Private Sub TextBox2_Change()
TextBox1.MaxLength = 10
If Len(TextBox2) = 2 Or Len(TextBox2) = 5 Then TextBox2 = TextBox2 & "."
'Filtre_dates
TextBox3.Text = ListView1.ListItems.Count
End Sub

Bonjour;

Essayez ceci:

deb = CDate(Replace(TextBox2, ".", "/"))

Cdlt

Bonjour,

J'ai teste votre ligne de code est cela fait la même chose

Private Sub Filtre_Dates()
If Len(TextBox11) = 10 Then deb = CDate(TextBox11)
If Len(TextBox12) = 10 Then fini = CDate(TextBox12)
ListView1.ListItems.Clear
For Lg = 2 To UBound(C)
Select Case True
Case deb <> "" And fini = "": Key1 = C(Lg, 13) >= deb
Case deb <> "" And fini <> "": Key1 = C(Lg, 13) >= deb
Key2 = C(Lg, 13) <= fini: Key1 = Key1 And Key2
Case deb = "" And fini = "": Key1 = True
End Select
If Key1 Then
Set List = ListView1.ListItems.Add(Text:=C(Lg, 1))
For i = 2 To UBound(C, 2)
List.ListSubItems.Add , , C(Lg, i)
'C(Lg, 9) = Format(C(Lg, 9), "0## ### ## ##")
Next i
End If
Next Lg
End Sub

Bonjour,

J'ai trouvé la solution pour mon problème. J'ai changer le nom de la variable "Fin" en "Fini" et cela fonctionne.

Je n'ai pas vraiment trouvé pourquoi mais je suppose que c'est qu'une autre variable s'appelle "fin"

Rechercher des sujets similaires à "filtrer listview entre deux dates"