XL 2010 Appelez les données dans le Listbox

Mody200

XLDnaute Junior
Bonjour,
Il y a un problème lors du choix de la recherche entre la date de début et la date de fin et la recherche par trois critères n'a pas récupéré les données requises et les données sont venues vides dans la listbox1
 

Pièces jointes

  • Relevé de compte avec plus d'un standard.xlsm
    449.3 KB · Affichages: 13

ChTi160

XLDnaute Barbatruc
Bonsoir Mody200
Je pense que pour ce qui est des Dates références de ta recherche
Code:
CLng(CDate(Me.TextBox_Start_Date.Value))
CLng(CDate(Me.TextBox_End_Date.Value))
il te faut rechercher les dates par leur valeur Numérique.
soit pour
VB:
sh.Range("B1:u" & ish).AutoFilter Field:=2, Criteria1:=">=" & CLng(CDate(Me.TextBox_Start_Date.Value)) _
        , Criteria2:="<=" & CLng(CDate(Me.TextBox_End_Date.Value))

Dans l'attente
Bonne fin de Soirée
Jean marie
 
Dernière édition:

cp4

XLDnaute Barbatruc
Bonjour Mody200, ChTi160,

@Mody200 : ton code plante chez moi sur cette ligne '***
il y avait des virgules (,) que j'ai remplacé par des points-virgules (;), ceci dans Private Sub UserForm_Initialize()
ensuite, pourquoi refaire la même chose dans la procédure Private Sub cmdSearch_Click()
VB:
With Me.ListBox1
        .ColumnCount = 20
        .ColumnHeads = True
        .ColumnWidths = "40;90;90;90;90;80;70;70;70;50;50;50;50;50;50;50;50;50;50;50" '***'
        '.RowSource = "Database!B2:u" & iRow
    End With
le code de ChTi160 ne fonctionnera qu'à la condition que tes dates soient vraiment des dates. Or, chez toi ce n'est pas le cas. Tu as des dates réelles et du texte. Il faut convertir le texte au format date.

Tu as mis des bordures jusqu'à la fin de la feuille. Très mauvaise idée, tu alourdis ton fichier inutilement et tu prolonge le temps d’exécution des macros.
Je te conseille de supprimer les bordures et transforme ta plage de données en tableau structuré.

Bonne journée.
 

cp4

XLDnaute Barbatruc
Bonjour Mody200, ChTi160,

@Mody200 : ton code plante chez moi sur cette ligne '***
il y avait des virgules (,) que j'ai remplacé par des points-virgules (;), ceci dans Private Sub UserForm_Initialize()
ensuite, pourquoi refaire la même chose dans la procédure Private Sub cmdSearch_Click()
VB:
With Me.ListBox1
        .ColumnCount = 20
        .ColumnHeads = True
        .ColumnWidths = "40;90;90;90;90;80;70;70;70;50;50;50;50;50;50;50;50;50;50;50" '***'
        '.RowSource = "Database!B2:u" & iRow
    End With
le code de ChTi160 ne fonctionnera qu'à la condition que tes dates soient vraiment des dates. Or, chez toi ce n'est pas le cas. Tu as des dates réelles et du texte. Il faut convertir le texte au format date.

Tu as mis des bordures jusqu'à la fin de la feuille. Très mauvaise idée, tu alourdis ton fichier inutilement et tu prolonge le temps d’exécution des macros.
Je te conseille de supprimer les bordures et transforme ta plage de données en tableau structuré.

Bonne journée.
edit: ton fichier en retour
 

Pièces jointes

  • Copie de Relevé de compte avec plus d'un standard.xlsm
    850.3 KB · Affichages: 7

ChTi160

XLDnaute Barbatruc
Bonjour le Fil
ce que j'avais mis et Modifié
j'ai d'abords transformé la plage de données en tableau structuré.
puis mis toutes les dates en Format "dddd dd mmmm yyyy"
il faut aussi savoir que tu n'as que des données de 2020!
je n'utilise pas car pas compétent les "AutoFilter" Lol
je pense dans tes procédures de Filtre les filtres s'annulent (a voir )
si Tu ôtes une partie de ces Filtres, ça Fonctionne.
Y'avait aussi chez Moi l'erreur dans l'affichage des "Columnwidths" avec des Virgules plutôt que des Points virgule (peut être une question de paramètres) (cp4 a modifié aussi)
je constate aussi que tu n'as pas modifié en fonction de ce que je t'ai donné plus haut
tu as mis par exemple pour la Condition 1
VB:
 'condition1
If Me.CMB_Type.Value = "All" And Me.CMB_Status.Value <> "All" Then
        sh.Range("B1:u" & ish).AutoFilter Field:=2, Criteria1:=">=" & CDate(Me.TextBox_Start_Date.Value) _
        , Criteria2:="<=" & CDate(Me.TextBox_End_Date.Value)    
'         sh.Range("B1:u" & ish).AutoFilter Field:=19, Criteria1:=Me.CMB_Status.Value
 End If
et moi je suggérais
Code:
sh.Range("B1:u" & ish).AutoFilter Field: =2, Criteria1:=">=" & CLng(CDate(Me.TextBox_Start_Date.Value))_
        , Criteria2:="<=" & CLng(CDate(Me.TextBox_End_Date.Value))
pour mes essais j'ai supprimé le filtre sur
Code:
'   sh.Range("B1:u" & ish).AutoFilter Field:=19, Criteria1:=Me.CMB_Status.Value
c'est pourquoi le fait qu'il y ai des dates au Format Numérique ne gêné pas Lol
La recherche ce fait sur la valeur Numérique des dates.
Pour ma part j'ai filtré via un Tableau temporaire.
y' plein d'autre choses à modifier (j'y regarderai) !
Bonne Journée
Jean marie
 

Pièces jointes

  • Mody200_1.gif
    Mody200_1.gif
    969.2 KB · Affichages: 19

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
@Mody200
le problème des dates se résout avec datevalue quand elle sont formatée avec les noms de mois ou de jour
mais il y a un plus gros problème
c'est qu'au bout de certain nombre de ligne les date sont en n° serie de date
somme toute dans la feuille pour le filtre c'est pas un problème puisqu'il faut filtrer avec le clng
mais le problème réside au fait que dans le textbox les dates sont formaté
j'ai vu récemment sur certaines version récentes d'excel que le filtre devait alors se faire en texte
et oui a partir du moment ou il y a plusieurs formats dans une colonnes les filtres doivent être textuels (difficile dans ce cas de faire un filtre date min date max
bref c'est pas la joie

un conseil :
décide sous quel format devront être tes dates dans les colonnes du tableau ( et!! toutes!!) après on pourrait éventuellement décider du mode de filtrage

questions:
la liste filtré doit elle apparaître dans la listbox1?
si c'est le cas a tu pensé a indexer les lignes dans une éventuelle colonne supplémentaire?
il me semble pas avoir vu ça dans ton code
et si c'est la cas aussi ne pas utiliser rowssource mais .list
et bien d'autre encore par la suite

mais pour l'instant ;au niveau de tes filtres , tu n'a pas pensé au jocker au cas ou tu ne rechercherais que par date par exemple ou que par slip type ou autre (d'ailleurs tes problèmes de filtres multi colonnes viennent de là )

remarques:
travailler avec un Tableau structuré aurait été plus simple (en lecture et en écriture)

dans l’analyse du code maintenant

déjà le initialyse tu oublie sert toi du Activate car a un moment dans ton initialyse tu appelle le click du bouton
ON APPELLE PAS LE CLICK D UN BOUTON DANS LE INITIALYSE D'UN USERFORM
donc

VB:
Private Sub UserForm_Activate()

'to load listbox1 when show this userform

    Dim iRow As Long
    iRow = Sheet2.Range("C" & Rows.Count).End(xlUp).Row    'to find out last non blank row number

    'to clear filter from sheets

    ThisWorkbook.Sheets("Database").AutoFilterMode = False
    ThisWorkbook.Sheets("SearchData").AutoFilterMode = False
    'to clear the SearchData Sheet

    ThisWorkbook.Sheets("SearchData").Cells.Clear

    '-----------------------------------------------
    'Now Populate ListBox1
    Call CommandButton1_Click
    With UserForm1.CMB_Type: .List = Array("All", "Cash Withdrawal", "Money Transfer"): .ListIndex = 0: End With
    With UserForm1.CMB_Status: .List = Array("All", "Successful", "Fail"): .ListIndex = 0: End With
    With UserForm1.ComboBox1: .List = Array("All", "Bhim", "Google Pay", "Paytm"): .ListIndex = 0: .Value = "All": End With

    UserForm1.TextBox_Start_Date.Value = Format(Date, "dd-mmm-yyyy")
    UserForm1.TextBox_End_Date = Format(Date, "dd-mmm-yyyy")
    Me.Text_count.Value = Me.ListBox1.ListCount - 1

    With Me.ListBox1
        .ColumnCount = 20
        .ColumnHeads = True
        .ColumnWidths = "40;90;90;90;90;80;70;70;70;50;50;50;50;50;50;50;50;50;50;50"
          End With
    TextBox21.Value = 0
End Sub
le bouton 1 click maintenant
VB:
Private Sub CommandButton1_Click()
' ---------- Show All ---------------
    Dim sh As Worksheet
    Set sh = Sheets("Database")
    Dim iRow As Long
    iRow = sh.Range("C" & Rows.Count).End(xlUp).Row
    'to populate listbox  from Database sheet
    With Me.ListBox1
           .List = Sheets("Database").Range("B2:u" & iRow).Value
    End With
    'Now run & See
    Me.Text_count.Value = Me.ListBox1.ListCount - 1

End Sub

bref faudrait avoir une vue plus globale du projet si tu veux faire quelque chose de propre et pérenne
;)
 

ChTi160

XLDnaute Barbatruc
Re
Quelques Vidéos pour Imager ce sur quoi j'ai travaillé !
je passe par une autre méthode pour le choix du tri par dates.

Je ne sais pas s'il faut inclure dans la recherche par dates les Trois rubriques (Combobox) ?

Dans l'attente
Bonne fin de Journée
Jean marie
 

Pièces jointes

  • Mody200_2.gif
    Mody200_2.gif
    889.2 KB · Affichages: 15
  • Mody200_3.gif
    Mody200_3.gif
    915.6 KB · Affichages: 12
  • Mody200_4.gif
    Mody200_4.gif
    627.8 KB · Affichages: 9
  • Mody200_5.gif
    Mody200_5.gif
    906.3 KB · Affichages: 12

patricktoulon

XLDnaute Barbatruc
re
Bonsoir @ChTi160
perso j'ai abandonné le autofilter sur ce fichier
et je tri en fonction des dates et les deux combos les colonnes(4 ,10 et 20) la 3 eme combob n’étant pas encore bien située en terme d'utilité je ne l'ai pas prise en compte
le code du bouton
et j'ai mis mon calendrier la toute derniere mouture avec une peau proche de son interface
VB:
Private Sub cmdSearch_Click()
    Application.ScreenUpdating = False
    Dim sh As Worksheet, sht As Worksheet, ish&, isht&, DateMin&, DateMax&, ft1, ft2, T(), I&, a&, c&
    Set sh = ThisWorkbook.Sheets("Database"): Set sht = ThisWorkbook.Sheets("SearchData")

    DateMin = CLng(DateValue(TextBox_Start_Date.value)): DateMax = CLng(DateValue(TextBox_End_Date.value))

    If Me.CMB_Type.value = "All" Then ft1 = "*" Else ft1 = "*" & Me.CMB_Type.value & "*"
    If Me.CMB_Status.value = "All" Then ft2 = "*" Else ft2 = "*" & Me.CMB_Status.value & "*"

    With sh.Range("A1:u" & sh.Range("C" & Application.Rows.Count).End(xlUp).Row)
        For I = 1 To .Rows.Count
            If .Cells(I, 3) >= DateMin And .Cells(I, 3) <= DateMax Then
                If .Cells(I, 11) Like ft1 And .Cells(I, 20) Like ft2 Then
                    a = a + 1: ReDim Preserve T(1 To 20, 1 To a)
                    For c = 1 To 20
                    T(c, a) = .Cells(I, c)
                    If c = 4 Then T(c, a) = CStr(.Cells(I, c).Text)
                    If c = 3 Then T(c, a) = Format(.Cells(I, c).value, "ddd-dd-mmm-yyyy")
                    Next
                End If
            End If
        Next

    End With

    If a > 0 Then
        With sht.[A1].Resize(a, 20)
           .value = Application.Transpose(T)
      Me.ListBox1.List = Application.Transpose(T)
   End With
        Me.Text_count.value = Me.ListBox1.ListCount - 1
 Else
        ListBox1.Clear
        MsgBox "No record found."
    End If
End Sub
demo.gif
 

Mody200

XLDnaute Junior
Bonjour Mody200, ChTi160,

@Mody200 : ton code plante chez moi sur cette ligne '***
il y avait des virgules (,) que j'ai remplacé par des points-virgules (;), ceci dans Private Sub UserForm_Initialize()
ensuite, pourquoi refaire la même chose dans la procédure Private Sub cmdSearch_Click()
VB:
With Me.ListBox1
        .ColumnCount = 20
        .ColumnHeads = True
        .ColumnWidths = "40;90;90;90;90;80;70;70;70;50;50;50;50;50;50;50;50;50;50;50" '***'
        '.RowSource = "Database!B2:u" & iRow
    End With
le code de ChTi160 ne fonctionnera qu'à la condition que tes dates soient vraiment des dates. Or, chez toi ce n'est pas le cas. Tu as des dates réelles et du texte. Il faut convertir le texte au format date.

Tu as mis des bordures jusqu'à la fin de la feuille. Très mauvaise idée, tu alourdis ton fichier inutilement et tu prolonge le temps d’exécution des macros.
Je te conseille de supprimer les bordures et transforme ta plage de données en tableau structuré.

Bonne journée.
re
Bonsoir @ChTi160
perso j'ai abandonné le autofilter sur ce fichier
et je tri en fonction des dates et les deux combos les colonnes(4 ,10 et 20) la 3 eme combob n’étant pas encore bien située en terme d'utilité je ne l'ai pas prise en compte
le code du bouton
et j'ai mis mon calendrier la toute derniere mouture avec une peau proche de son interface
VB:
Private Sub cmdSearch_Click()
    Application.ScreenUpdating = False
    Dim sh As Worksheet, sht As Worksheet, ish&, isht&, DateMin&, DateMax&, ft1, ft2, T(), I&, a&, c&
    Set sh = ThisWorkbook.Sheets("Database"): Set sht = ThisWorkbook.Sheets("SearchData")

    DateMin = CLng(DateValue(TextBox_Start_Date.value)): DateMax = CLng(DateValue(TextBox_End_Date.value))

    If Me.CMB_Type.value = "All" Then ft1 = "*" Else ft1 = "*" & Me.CMB_Type.value & "*"
    If Me.CMB_Status.value = "All" Then ft2 = "*" Else ft2 = "*" & Me.CMB_Status.value & "*"

    With sh.Range("A1:u" & sh.Range("C" & Application.Rows.Count).End(xlUp).Row)
        For I = 1 To .Rows.Count
            If .Cells(I, 3) >= DateMin And .Cells(I, 3) <= DateMax Then
                If .Cells(I, 11) Like ft1 And .Cells(I, 20) Like ft2 Then
                    a = a + 1: ReDim Preserve T(1 To 20, 1 To a)
                    For c = 1 To 20
                    T(c, a) = .Cells(I, c)
                    If c = 4 Then T(c, a) = CStr(.Cells(I, c).Text)
                    If c = 3 Then T(c, a) = Format(.Cells(I, c).value, "ddd-dd-mmm-yyyy")
                    Next
                End If
            End If
        Next

    End With

    If a > 0 Then
        With sht.[A1].Resize(a, 20)
           .value = Application.Transpose(T)
      Me.ListBox1.List = Application.Transpose(T)
   End With
        Me.Text_count.value = Me.ListBox1.ListCount - 1
 Else
        ListBox1.Clear
        MsgBox "No record found."
    End If
End Sub
Regarde la pièce jointe 1125585
Merci beaucoup, pouvez-vous télécharger le fichier ?
 

Mody200

XLDnaute Junior
Bonjour Mody200, ChTi160,

@Mody200 : ton code plante chez moi sur cette ligne '***
il y avait des virgules (,) que j'ai remplacé par des points-virgules (;), ceci dans Private Sub UserForm_Initialize()
ensuite, pourquoi refaire la même chose dans la procédure Private Sub cmdSearch_Click()
VB:
With Me.ListBox1
        .ColumnCount = 20
        .ColumnHeads = True
        .ColumnWidths = "40;90;90;90;90;80;70;70;70;50;50;50;50;50;50;50;50;50;50;50" '***'
        '.RowSource = "Database!B2:u" & iRow
    End With
le code de ChTi160 ne fonctionnera qu'à la condition que tes dates soient vraiment des dates. Or, chez toi ce n'est pas le cas. Tu as des dates réelles et du texte. Il faut convertir le texte au format date.

Tu as mis des bordures jusqu'à la fin de la feuille. Très mauvaise idée, tu alourdis ton fichier inutilement et tu prolonge le temps d’exécution des macros.
Je te conseille de supprimer les bordures et transforme ta plage de données en tableau structuré.

Bonne journée.
Merci beaucoup, super idée
 

Discussions similaires

Statistiques des forums

Discussions
312 211
Messages
2 086 295
Membres
103 171
dernier inscrit
clemm