Microsoft 365 Filtre sur LISTBOX

eric72

XLDnaute Accro
Bonjour à tous,
en cette semaine de reprise, je me permets de vous solliciter pour un problème sur un fichier que je ne parviens pas à résoudre.
J'ai un Userform qui se nomme UsfAjoutSolde avec une listbox et une Textbox du nom de TxtboxRech qui me permet de filtrer les données.
1) J'aimerais lorsque je valide une entrée, la recherche intuitive ne s'efface pas, exemple si je tape "aa" dans ma recherche, que j'entre un montant et que je valide, le filtre sur "aa" reste (dans ce cas que je puisse purger le filtre avec un bouton, peut-être en gardant en mémoire la saisie de TxtboxRech pour qu'elle se mette par défaut après la validation de l'entrée (juste une idée que je n'arrive pas à matérialiser!!!)
2) Autre problème, est-il possible au chargement de la listbox que seuls les comptes non saisis à la date par défaut, soit le dernier jour du mois M-1, apparaissent et non ceux qui ont déjà été saisis.
Si vous avez une idée pour la solution ça serait top.
Merci beaucoup pour votre aide.
Eric
 

Pièces jointes

  • test.xlsm
    251.1 KB · Affichages: 7

eric72

XLDnaute Accro
Après quelques investigations j'ai réussi à régler le problème 1) (voir fichier ci dessous).
Il me reste le problème 2), et là je cale!!!
2) est-il possible au chargement de la listbox que seuls les comptes non saisis à la date par défaut, soit le dernier jour du mois M-1, apparaissent et non ceux qui ont déjà été saisis.
Merci beaucoup pour vos idées
 

Pièces jointes

  • test (3).xlsm
    260 KB · Affichages: 4

TooFatBoy

XLDnaute Barbatruc
est-il possible au chargement de la listbox que seuls les comptes non saisis à la date par défaut, soit le dernier jour du mois M-1, apparaissent et non ceux qui ont déjà été saisis.
C'est quoi "les comptes non saisis" ???


Dans ta macro UserForm_Initialize(), je te proposerais de remplacer
VB:
    '--- valeurs initiales dans ListBox
    Dim Tbl()
    ReDim Tbl(1 To UBound(BD), 1 To Ncol + 1)
    For i = 1 To UBound(BD)
        C = 0
        For Each K In colVisu
            C = C + 1
            Tbl(i, C) = BD(i, K)
        Next K
        C = C + 1
        Tbl(i, C) = i + Decal
    Next i
    Me.LstSolde.List = Tbl
par
VB:
    '--- valeurs initiales dans ListBox
    Me.LstSolde.List = Range("TbCptHKyriba").Value


Ainsi tu vois facilement que, si tu sais filtrer ton TS nommé TbCptHKyriba (magnifique nom... 😅) avec ton critère de "compte non saisi à la date du dernier...", alors tu peux charger ta ListBox en utilisant ce code :
Enrichi (BBcode):
    '--- valeurs initiales dans ListBox
    Me.LstSolde.List = Range("TbCptHKyriba").SpecialCells(xlCellTypeVisible).Value
(code que tu peux aussi utiliser quand le TS n'est pas filtré, bien sûr)


[edit]
⚠️ Il est possible qu'en fait ça ne marche pas car, si j'ai bien compris, tu ajoutes dans la ListBox une colonne qui n'existe pas dans le TS, qui est le numéro de ligne du TS.
[/edit]
 
Dernière édition:

eric72

XLDnaute Accro
C'est quoi "les comptes non saisis" ???


Dans ta macro UserForm_Initialize(), je te proposerais de remplacer
VB:
    '--- valeurs initiales dans ListBox
    Dim Tbl()
    ReDim Tbl(1 To UBound(BD), 1 To Ncol + 1)
    For i = 1 To UBound(BD)
        C = 0
        For Each K In colVisu
            C = C + 1
            Tbl(i, C) = BD(i, K)
        Next K
        C = C + 1
        Tbl(i, C) = i + Decal
    Next i
    Me.LstSolde.List = Tbl
par
VB:
    '--- valeurs initiales dans ListBox
    Me.LstSolde.List = Range("TbCptHKyriba").Value


Ainsi tu vois facilement que, si tu sais filtrer ton TS nommé TbCptHKyriba (magnifique nom... 😅) avec ton critère de "compte non saisi à la date du dernier...", alors tu peux charger ta ListBox en utilisant ce code :
Enrichi (BBcode):
    '--- valeurs initiales dans ListBox
    Me.LstSolde.List = Range("TbCptHKyriba").SpecialCells(xlCellTypeVisible).Value
(code que tu peux aussi utiliser quand le TS n'est pas filtré, bien sûr)


[edit]
⚠️ Il est possible qu'en fait ça ne marche pas car, si j'ai bien compris, tu ajoutes dans la ListBox une colonne qui n'existe pas dans le TS, qui est le numéro de ligne du TS.
[/edit]
Bonjour,
Pour tenter d'être plus clair, la listbox récupère les données de "TbCptHKyriba", La date se met systématiquement au dernier jour du mois précédent.
On saisit un solde, puis on valide (on ajoute une ligne dans TbSolde).
La logique serait :
- Si le solde de ce compte, pour cette date (ici 31/082024), a déjà été saisi, alors on ne charge pas la ligne de ce compte dans la listbox afin d'épurer le choix au fur et à mesure de la saisie.
Cela te parait-il plus clair?
 

eric72

XLDnaute Accro
Bonjour à tous,
Je pense avoir trouvé un bout de solution, je m'explique:
- Quand je valide une entrée pour un compte, j'ai ajouté dans "TbCptHKyriba", une colonne qui indique la dernière date de saisie pour le compte.
- A partir de là, il ne reste plus , à l'initialize du Userform de filtrer les lignes, à savoir, si la colonne 9 de "TbCptHKyriba" est différente de la date qui se trouve dans TxtDate, alors on affiche, sinon on efface la ligne, j'ai donc essayé de modifier mon code, comme ceci:
VB:
Private Sub UserForm_Initialize()
'***********************
'COMMANDE CLIENT
'***********************
Application.ScreenUpdating = False

Usf_VisibleAjoutSolde = True
       TxtDate = DateSerial(Year(Date), Month(Date), 1) - 1

        Set f = Sheets("Comptes")
        Set rng = f.Range("a2:j" & f.[a1000000].End(xlUp).Row)                      ' BD (1 colonne de plus)
            colInterro = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)           ' colonnes à interroger (adapter)
            colVisu = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ' colonnes à visualiser (adapter)
            Decal = rng.Row - 1                                               ' début de la BD
            BD = rng.Value
            col = UBound(BD, 2): For i = LBound(BD) To UBound(BD): BD(i, col) = i + Decal: Next i 'no enreg
            NcolInt = UBound(colInterro) + 1
            Ncol = UBound(colVisu) + 1       ' : ReDim ancien(1 To 1, 1 To Ncol)
            Me.LstSolde.ColumnCount = UBound(colVisu) + 1
            Me.LstSolde.ColumnWidths = "0;60;100;90;100;80;0;0;80;0"
  '-- génération de choix()
    ReDim choix(1 To UBound(BD))
    col = UBound(BD, 2)
  For i = LBound(BD) To UBound(BD)
     For Each K In colInterro
       choix(i) = choix(i) & BD(i, K) & "|"
       If IsDate(BD(i, K)) Then BD(i, K) = Format(BD(i, K), "dd/mm/yyyy")
     Next K
     choix(i) = choix(i) & BD(i, col) & "|"   ' no enreg
  Next i

  '--- valeurs initiales dans ListBox
  Dim Tbl(): ReDim Tbl(1 To UBound(BD), 1 To Ncol + 1)
  For i = 1 To UBound(BD)
  If CDate(TxtDate) <> CDate(Tbl(i, 9)) Then   '
   C = 0
     For Each K In colVisu
       C = C + 1: Tbl(i, C) = BD(i, K)
     Next K
     C = C + 1: Tbl(i, C) = i + Decal
    End If                                                         '
   Next i
   Me.LstSolde.List = Tbl
   TExtboxRech_Change
   Me.LstSolde.ListIndex = -1
   TxtComptable.Value = Sheets("Données").Range("a2")

Application.ScreenUpdating = True

End Sub

mais cela ne fonctionne pas, ou est la boulette?
Merci beaucoup
 

Pièces jointes

  • test (3).xlsm
    258.6 KB · Affichages: 2

eric72

XLDnaute Accro
Après multiples essais, j'ai trouvé ce code à intégrer dans Initialize et cela semble fonctionner, n'hésitez pas à me dire si cela vous parait erroné ou pas!!!!

VB:
  '--- valeurs initiales dans ListBox
  Dim Tbl(): ReDim Tbl(1 To UBound(BD), 1 To Ncol + 1)
  For i = 1 To UBound(BD)

    [B]If CDate(TxtDate) <> CDate(BD(i, 9)) Then[/B]

        C = 0
            For Each K In colVisu
                C = C + 1: Tbl(i, C) = BD(i, K)
            Next K

        C = C + 1: Tbl(i, C) = i + Decal
    
    [B]End If[/B]
    
   Next i

J'ai vu qu'il y avait beaucoup de vue sur ce post, j'en profite pour vous remercier de vous être penché sur ce sujet.
Bonne journée à tous.
Eric
 

TooFatBoy

XLDnaute Barbatruc
Cela te parait-il plus clair?
Non, pas vraiment.


j'ai ajouté dans "TbCptHKyriba", une colonne qui indique la dernière date de saisie pour le compte.
Là ça me paraît plus clair, évidemment. Sinon je ne voyais pas bien comment tu pouvais savoir quelles lignes garder.


Mais du coup, si tu peux ajouter des colonnes, pourquoi ne pas en ajouter une contenant une formule pour calculer le numéro que tu ajoutes par macro dans la derniere colonne de ta ListBox ?
Ainsi ça t'éviterait ton usine à gaz pour remplir la TextBox.

Et au fait, à quoi sert ce numéro que tu ajoutes sur chaque ligne dans la derniere colonne de la TextBox ?
 
Dernière édition:

eric72

XLDnaute Accro
Non, pas vraiment.



Là ça me paraît plus clair, évidemment. Sinon je ne voyais pas bien comment tu pouvais savoir quelles lignes garder.


Mais du coup, si tu peux ajouter des colonnes, pourquoi ne pas en ajouter une contenant une formule pour calculer le numéro que tu ajoutes par macro dans la derniere colonne de ta ListBox ?
Ainsi ça t'éviterait ton usine à gaz pour remplir la TextBox.

Et au fait, à quoi sert ce numéro que tu ajoutes sur chaque ligne dans la derniere colonne de la TextBox ?
J'ai en partie résolu mon problème (fichier ci-joint), par contre j'aimerais ajouter cette partie:
VB:
        If CDate(TxtDate) <> CDate(Tbl(i, 9)) Then

end if
dans
Code:
Private Sub TExtboxRech_Change()
afin que la ligne s'efface aussi avec le filtre mais je ne sais pas ou le mettre, peux-tu m'aider encore une fois
J'y suis presque
Merci beaucoup
 

Pièces jointes

  • test (3).xlsm
    262.5 KB · Affichages: 3

eric72

XLDnaute Accro
Pour vous éviter de chercher la macro, la voilà:
VB:
'**************************************************************
'CONFIGURATION RECHERCHE INTUITIVE
'**************************************************************
Private Sub TExtboxRech_Change()
Application.ScreenUpdating = False
    TExtboxRech = Replace(TExtboxRech, ".", ",")
  If Me.TExtboxRech <> "" Then
     mots = Split(Trim(Me.TExtboxRech), " ")
     Tbl = choix
     For i = LBound(mots) To UBound(mots)
 
        Tbl = Filter(Tbl, mots(i), True, vbTextCompare)
        
     Next i
     If UBound(Tbl) > -1 Then
        Dim b(): ReDim b(1 To UBound(Tbl) + 1, 1 To Ncol + 1)
        For i = LBound(Tbl) To UBound(Tbl)

          A = Split(Tbl(i), "|")
          J = A(NcolInt) - 1 - Decal + 1
          For K = 1 To Ncol
            kk = colVisu(K - 1)
            xx = UBound(BD)
            b(i + 1, K) = BD(J, kk)
          Next K
          b(i + 1, K) = J + 1
          
        Next i
        Me.LstSolde.List = b
     Else
       Me.LstSolde.Clear
     End If
  Else
  End If
 
Application.ScreenUpdating = True

End Sub
 

Statistiques des forums

Discussions
313 865
Messages
2 103 078
Membres
108 521
dernier inscrit
manouba