Microsoft 365 Sélection ligne dans ListBox avec boutons précédent-suivant

meyscal

XLDnaute Occasionnel
Bonjour le forum,

voilà, j'ai bien cherché dans les forums mais je n'ai rien trouvé qui répondait exactement à mon besoin.
J'ai un champ de recherche avec 2 boutons "Précédent" et "Suivant".

Mon besoin serait qu'avec un évènement Textbox1_Change, la 1ère ligne de la ListBox1 contenant le champ soit sélectionnée. Avec les boutons "Suivant" et "Précédent", je souhaiterais accéder à la prochaine ligne contenant l'élément. Là ou éventuellement ça peut se compliquer c'est que le champ recherché peut être une date (toujours format jj/mm/aaaa), un nom (majuscules et minuscules variables) , se trouver au milieu d'une phrase, ...

J'ai déjà essayé plusieurs codes dont certains me renvoient le résultat souhaité ou trient la ListBox mais ce n'est pas ce que je souhaite et je ne vois pas comment faire ça.

Quelqu'un aurait une idée par hasard ?

Voici ci-dessous le code pour ma listbox (initialize userform) + lors de la sélection de la ligne (récupération des champs dans textbox et combobox).7
Par avance merci

PS : je ne pourrais pas mettre de fichier exemple avant ce soir par contre.

VB:
Private Sub UserForm_Initialize()
HideBar Me
Sheets("Année 2023").Activate
With ListBox1
.List = Range("A2:N" & Range("B1000").End(xlUp).Row).Value
.ColumnCount = 14
End With
ListBox1.ColumnWidths = "35;44;65;45;75;18;13;120;140;45;65;140;45;140"
Dim i As Integer
For i = ListBox1.ListCount - 1 To 0 Step -1
If ListBox1.List(i) = "" Then ListBox1.RemoveItem (i)
Next i
End Sub


Private Sub ListBox1_Click() ' au clic dans la ListBox1
Me.TextBox1.Caption = Cells(Me.ListBox1.ListIndex + 2, 1)
Dim X As Integer
For X = 2 To 14 'boucle sur les 13 textboxes sauf n°1
Me.Controls("TextBox" & X).Value = Cells(Me.ListBox1.ListIndex + 2, X)
Next X
End Sub
 

vgendron

XLDnaute Barbatruc
Je suis en train de regarder ton fichier
déjà, je pense qu'il serait utile de mettre des noms aux différents controles.. histoire de s'y retrouver plus facilement

exemple: Userform1 2 3 4 5.. pas top;; on ne sait pas à quoi ils servent
alors que
USF_MenuPrincipal (USF1)
USF_NewAlert (USF2)
USF_EditAlert (USF3)
USF_NewBDD (USF4)
c'est déjà beaucoup plus parlant

idem pour les noms de bouton
commandbutton12 3 4 5.. le nom ne permet pas de savoir simplement ce que ca fait..

ensuite.. dans le code: il faut utiliser l'indentation pour faciliter la lecture
lequel des deux codes suivants penses tu etre le plus lisible
VB:
Private Sub CommandButton2_Click()
If ActiveWorkbook.Name <> ThisWorkbook.Name Then ThisWorkbook.Activate

For x = 2 To 14
TextBox1.Caption = ""
TextBox2.Value = ""
TextBox3.Value = ""
TextBox4.Value = ""
TextBox5.Value = ""
TextBox6.Value = ""
TextBox7.Value = ""
TextBox8.Value = ""
TextBox9.Value = ""
TextBox10.Value = ""
TextBox11.Value = ""
TextBox12.Value = ""
TextBox13.Value = ""
TextBox14.Value = ""

With Me.ListBox1
Cells(.ListIndex + 2, x) = Me.Controls("TextBox" & x).Value 'On écrit dans chaque colonne les valeurs des différents controls
Cells(.ListIndex + 2, 1) = Me.TextBox1.Caption
End With
Next x

Sheets("Année 2023").ListObjects("Tableau1").Sort.SortFields _
.Clear
Sheets("Année 2023").ListObjects("Tableau1").Sort.SortFields _
.Add2 Key:=Range("Tableau1[[#All],[Numéro]]"), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Année 2023").ListObjects("Tableau1").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With

Unload USF_EditAlerte
USF_EditAlerte.Show

ThisWorkbook.Save

End Sub

Code:
Private Sub CommandButton2_Click()
    If ActiveWorkbook.Name <> ThisWorkbook.Name Then ThisWorkbook.Activate
    
    For x = 2 To 14
        TextBox1.Caption = ""
        TextBox2.Value = ""
        TextBox3.Value = ""
        TextBox4.Value = ""
        TextBox5.Value = ""
        TextBox6.Value = ""
        TextBox7.Value = ""
        TextBox8.Value = ""
        TextBox9.Value = ""
        TextBox10.Value = ""
        TextBox11.Value = ""
        TextBox12.Value = ""
        TextBox13.Value = ""
        TextBox14.Value = ""
        
        With Me.ListBox1
            Cells(.ListIndex + 2, x) = Me.Controls("TextBox" & x).Value 'On écrit dans chaque colonne les valeurs des différents controls
            Cells(.ListIndex + 2, 1) = Me.TextBox1.Caption
        End With
    Next x
    
    Sheets("Année 2023").ListObjects("Tableau1").Sort.SortFields.Clear
    Sheets("Année 2023").ListObjects("Tableau1").Sort.SortFields.Add2 Key:=Range("Tableau1[[#All],[Numéro]]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Année 2023").ListObjects("Tableau1").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Unload USF_EditAlerte
    USF_EditAlerte.Show
    
    ThisWorkbook.Save
End Sub
 

meyscal

XLDnaute Occasionnel
Sans conteste le 2eme.
Je suis en phase avec ce que tu dis mais ma prio est plus que ça fonctionne et je préfère traiter les points bloquants avant la cosmétique à ce niveau.
Pour les prochaines fois j'en prends bonne note de faire cela au fir et à mesure. Ta remarque a tout son sens.
 

vgendron

XLDnaute Barbatruc
autre chose.. je vois que ta feuille "Année 2023" contient les données sous forme de table structurée
+1 point
MAIS, il y a de nombreuses lignes vides à part le numéro en colonne A (-1 point)
ca n'a pas (ou peu) d'intérêt
en plus ca te fait du code à rallonge pour pas grand chose
et du coup. source d'erreur

dans ton fichier tel quel.. tu n'as pas la possibilité de mettre plus de 1000 lignes...

dans ta feuille BDD en colonnes A et B: pourquoi autant de doublons? y a t il une utilisation particulière?
quand tu remplis les combo de ton formulaire, tu fais tout un code pour les remplir sans doublons
(ca peut se faire en 3 lignes de code)

dans ton formulaire: la recherche (3 caractères minimum) se fait sur quel champ? (quelle colonne?)
 

meyscal

XLDnaute Occasionnel
Oui je sais bien j'ai un tout petit niveau et je fais plus du bricolage qu'autre chose avec des bouts de code récupérés par ci par là.

Sur Excel je me débrouille plutôt bien mais la VBA est assez nouveau pour moi.
Nouveau dans le sens où je n'y ai pas souvent recours car peu d'utilité dans mon métier comme dans ma vie de tous les jours.

Cependant ça me plaît beaucoup mais le temps me manque.

J'aurais souhaité faire l'incrémentation des nouvelles lignes en automatique mais ne voit pas comment récupérer le format des numéros de carte en colonne A en l'étirant au fur et à mesure des saisies.

Les doublons en A et B sont dûs à l'anonymisation du fichier où j'ai fait simple toujours pour une question de temps.

Pour les 1000 lignes j'ai compté très large. Ça devrait déjà tenir facile 4 à 5 ans.
 

meyscal

XLDnaute Occasionnel
Bonsoir le Fil
j'ai aussi testé le fichier et je me suis rendu Compte que si tu fais une recherche via le TextBox et le Bouton Ok (sur l'ensemble des Colonnes pour vgendron) tu n'as plus lacorrespondance des Lignes pour remplir tes TextBox dans "ListBox1_Click" et
VB:
Me.TextBox1.Caption = Cells(Me.ListBox1.ListIndex + 2, 1)' n'est plus bon
Bonne continuation
Jean marie
Effectivement c'est bien ça le problème. Le remplissage se fait selon l'ordre croissant des lignes.
 

vgendron

XLDnaute Barbatruc
sinon, ton problème de bug dans la macro
VB:
Private Sub Cmd_Filtrer_Click()
Dim clef, i&, j&, present As Boolean
Dim Txt_Filtre

   If Trim(Me.Txt_Filtre) = "" Then clef = "*" Else clef = "*" & LCase(Me.Txt_Filtre) & "*"
   For i = UBound(Ti) To 1 Step -1
      present = False
      For j = 1 To UBound(Ti, 2)
         If LCase(Ti(i, j)) Like clef Then present = True: Exit For
      Next j
      If Not present Then Me.ListBox1.RemoveItem i - 1
   Next i
   If Me.ListBox1.ListCount > 0 Then Me.ListBox1.ListIndex = 0
End Sub
ton tablo Ti est remplit avec le contenu de la feuille Année 2023 ==> OK
(au passage, la colonne supplémentaire pour y mettre le numéro de ligne me semble inutile puisque tu as la colonne "Numéro" qui contient déjà un numéro unique...
ensuite Ti est utilisé pour remplir la ListBox ==> OK
quand tu fais le filtre: tu supprimes les lignes qui ne répondent pas
MAIS à aucun moment tu ne recharges la listbox
donc; il y a un moment, ou la listbox est vide.. et supprimer une ligne qui n'existe pas. bah. ca plante
 

vgendron

XLDnaute Barbatruc
pour régler le problème (enfin . mettre un patch)
voici le code

VB:
Private Sub Cmd_Filtrer_Click()
Dim clef, i&, j&, present As Boolean
Dim Txt_Filtre
    Me.ListBox1.List = Ti
    If Trim(Me.Txt_Filtre) = "" Then clef = "*" Else clef = "*" & LCase(Me.Txt_Filtre) & "*"
    For i = UBound(Ti) To 1 Step -1
       present = False
       For j = 1 To UBound(Ti, 2)
          If LCase(Ti(i, j)) Like clef Then present = True: Exit For
       Next j
       If Not present Then Me.ListBox1.RemoveItem i - 1
    Next i
    If Me.ListBox1.ListCount > 0 Then Me.ListBox1.ListIndex = 0
End Sub
 

vgendron

XLDnaute Barbatruc
pourquoi ce test un peu partout ?
If ActiveWorkbook.Name <> ThisWorkbook.Name Then ThisWorkbook.Activate

autre chose
on est bien d'accord que ton code pour supprimer une ligne ne supprime rien. mais efface juste le contenu de la ligne..
alors qu'il suffirait de
ActiveSheet.ListObjects(1).ListRows(NumLigne).Range.delete
 
Dernière édition:

meyscal

XLDnaute Occasionnel
pourquoi ce test un peu partout ?
If ActiveWorkbook.Name <> ThisWorkbook.Name Then ThisWorkbook.Activate

autre chose
on est bien d'accord que ton code pour supprimer une ligne ne supprime rien. mais efface juste le contenu de la ligne..
alors qu'il suffirait de
ActiveSheet.ListObjects(1).ListRows(NumLigne).Range.delete
Ce test car j'ai eu des soucis lorsque j'avais 4 à 5 autres classeurs ouverts en même temps et même sans les sélectionner.

Oui on est d'accord mais je vais essayer ta proposition.

pour régler le problème (enfin . mettre un patch)
voici le code
Même résultat malheureusement
 

meyscal

XLDnaute Occasionnel
Bonjour à tous,

je pense avoir les idées plus claires au petit matin !
Je me rends compte qu'en fait le problème vient de là finalement :

Capture8.JPG


Effectivement là on se réfère (si je comprends bien) à l'ordre des lignes dans la Listbox.
Donc si après tri j'ai pour résultat les lignes : 5, 10, 15, 20 par exemple, les données répercutés dans les textbox seront celles des lignes du tableau 2, 3, 4, 5 car je conserve l'ordre ...

Et si je comprends toujours bien, je devrais là aussi me référer à "Ti" et non à Listindex.
A partir de ce constat, comment dois-je l'écrire ? Ceci évidemment ne fonctionne pas :

VB:
Me.TextBox1.Caption = Cells(Ti + 2, 1)
 

cp4

XLDnaute Barbatruc
Seulement le filtre ne fonctionne pas bien, dès que je tape 2 lettres la listbox est vide ...
Si la listbox est vide, cela veut tout simplement signifier qu'aucune ligne ne correspondant au critère.
Essaie avec Jacques et Julie:
J t'affichera les lignes de Jacques et Julie
Ja t'affichera les lignes de Jacques
Ju t'affichera les lignes de Julie

edit: et si tu tapes Juc la listbox sera vide car aucun prénom ne commence avec ces 3 lettres.
 
Dernière édition:

Discussions similaires

Réponses
17
Affichages
854
Réponses
4
Affichages
222

Statistiques des forums

Discussions
312 365
Messages
2 087 630
Membres
103 625
dernier inscrit
Smer