Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
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
Bonsoir chti160
Le problème persiste toujours à travers les trois autres critères lors de la recherche Veuillez télécharger le fichier après modification
@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é.
@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é.
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
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
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
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
@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é.
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
@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é.
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.