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
Bonjour

il te suffit de créer tes deux boutons et y associer UNE ligne de code
pour le bouton qui déplace vers le bas
Me.ListBox1.ListIndex = Me.ListBox1.ListIndex + 1

pour celui qui déplace vers le haut de la liste
Me.ListBox1.ListIndex = Me.ListBox1.ListIndex - 1

il faudra aussi surement prévoir un test pour éviter le bug quand tu arrives en haut ou en bas de la liste
 

vgendron

XLDnaute Barbatruc
pour être complet
tu créés tes deux boutons que tu appelles VersleBas et VersleHaut

VB:
Private Sub VersleBas_Click()
    If Me.ListBox1.ListIndex + 1 = Me.ListBox1.ListCount Then Exit Sub 'déja en bas de la liste
    If Me.ListBox1.ListIndex = -1 Then 'aucune selection
        Me.ListBox1.ListIndex = 0 'selection du premier
    Else
        Me.ListBox1.ListIndex = Me.ListBox1.ListIndex + 1 'sélection du suivant
    End If
End Sub

Private Sub VersleHaut2_Click()
    If Me.ListBox1.ListIndex = 0 Then Exit Sub 'déja en haut de la liste
    If Me.ListBox1.ListIndex = -1 Then 'aucune selection
        Me.ListBox1.ListIndex = 0 'selection du premier
    Else
        Me.ListBox1.ListIndex = Me.ListBox1.ListIndex - 1 'sélection du précédent
    End If
End Sub
 

meyscal

XLDnaute Occasionnel
Bonsoir,

@Lolote83, à partir de ton fichier, j'ai ajouté quelques explications dans le fichier si ça peut aider ...
@vgendron, je n'ai pas pu encore testé le code transmis mais au cas où la demande n'était pas claire je pense que ça devrait être plus clair là...

Pour info les champs dans listbox viennent d'un tableau (données de A1 à N53) évolutif jusqu'à 1000 lignes max même si ça ne dépassera sûrement pas les 200 lignes au final.

Un grand merci
 

Pièces jointes

  • Copie de MEYSCAL - Bouton Precedent - Suivant.xlsm.xlsx
    21.4 KB · Affichages: 11

meyscal

XLDnaute Occasionnel
Bonjour

Merci beaucoup @Lolote83 c'est exactement ça ! J'ai juste placé un "Option Compare Text" au début pour ne pas tenir compte de la casse.

Juste quelques questions que je me pose :

ce n'est pas dans la demande initiale et je m'en excuse mais je me rends compte à l'utilisation qu'avec 3 boutons c'est pas super convivial.
Est-il possible de faire une boucle sur la liste avec défilement des éléments par clic sur 1 seul bouton ? Arrivé en fin de liste, on repart du début puis on redéfile la liste.
Ainsi uniquement un message d'erreur si rien n'est trouvé et griser bouton si Textbox vide.

Pour contextualiser tout ça, j'ai 1 image qui représente 1 carte avec le logo de la société et j'ai placé sur cette image des contrôles Textbox et Combobox.
Lorsqu'on clique sur une ligne de la Listbox qui est multicolonnes = répercussion des éléments de la Listbox dans les contrôles.
A partir de là, la personne peut modifier ou juste consulter puis en validant par clic d'un bouton les modifications sont faites dans le tableau.

L'avantage de n'avoir qu'un seul bouton serait de pouvoir visualiser la "carte" directement et si ce n'est pas ce qu'on recherche, on clique et ça passe à la suivante, etc ...
 

meyscal

XLDnaute Occasionnel
Re bonjour @Lolote83, @vgendron, le forum

Merci beaucoup ! Je suis très proche du but mais malheureusement je n'arrive pas à le mettre en place.
En cause 1 option explicit dans l'userform et dans ton code il y a des variables non-définies que je ne sais pas trop comment définir :rolleyes:
Il faudrait vraiment que j'augmente mon niveau qui est très basique.

Je ne sais pas par contre si ça reste compatible avec ce que j'ai déjà réalisé et en particulier avec le code du Userform Initialize déjà présent pour charger la listbox avec les données.

Je viens de me prendre un peu de temps pour anonymiser mon fichier que je mets en PJ ... ça sera certainement plus simple !
La plupart du temps, je me débrouille seul mais là je m'y casse les dents, la tête et m'arrache les cheveux alors que je ne pensais pas que ce serait la partie la plus compliquée ...

Je n'ai rien contre 1 filtre sur la listbox après avoir saisi le terme recherché mais ce qui m'inquiète c'est que lors de l'enregistrement des modifications vu qu'il y aura moins de lignes, cela modifie les mauvaises cellules.
C'est peut-être stupide de ma part de penser cela mais je suppose que listindex se base sur le nombre d'éléments dans la liste sans prendre en compte qu'il y ait un filtre appliqué. Ou bien ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @meyscal :), @vgendron ;), @Lolote83 ;),

Une version qui ne recherche pas mais qui filtre. J'ai laissé les boutons de déplacement mais, selon moi, ils deviennent inutiles avec un filtre.

Le code est relativement compact (encore plus si on supprime les boutons de déplacement ! ).
  • Cliquer sur le bouton Hop ! de la feuille Feuil1 pour afficher l'UserForm1.
  • Saisir les caractères du filtre dans la zone Filtre puis appuyez sur la touche Entrée ou bien cliquer sur le bouton Filtrer.
  • Pour tout ré-afficher saisir un filtre vide ou bien cliquer sur le bouton Tous.

edit : avec la version v1b sans les boutons de déplacement. Pour se déplacer, on utilise simplement les touches haut et bas du clavier.
 

Pièces jointes

  • MEYSCAL- Filtrer- v1.xlsm
    25.8 KB · Affichages: 11
  • MEYSCAL- Filtrer- v1b.xlsm
    24.5 KB · Affichages: 7
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
C'est peut-être stupide de ma part de penser cela mais je suppose que listindex se base sur le nombre d'éléments dans la liste sans prendre en compte qu'il y ait un filtre appliqué. Ou bien ?
Oui bien vu.

Il existe une pratique qui consiste à ajouter dans la listbox une colonne invisible (de largeur nulle).
Dans cette colonne, on inscrit le numéro de ligne de la feuille Excel.

Ainsi quoiqu'on fasse dans la listbox, on sait que la dernière colonne correspond au numéro de la ligne sur la feuille Excel.

Je peux faire un exemple qui illustre...
 

meyscal

XLDnaute Occasionnel
Re, je viens juste de rentrer du boulot et sur le chemin je mes suis dit : "tiens tu as pensé à enlever le mdp ?"
Bon le fichier est supprimé donc je vais modifier ça et le remettre ... Désolé

@mapomme : hello et merci 😁 j'en profiterai pour jeter 1 oeil à ta (votre au cas où car je ne veux pas paraître familier ...) solution et ferai un retour rapidement.
Oui effectivement je ne suis pas contre un exemple !

Merci pour votre aide si précieuse. Ce forum est vraiment de loin celui qui m'a le plus aidé !

PS : lorsque je vois la rapidité de la réponse de @mapomme je comprends clairement mieux l'utilité de joindre un fichier en exemple. J'imagine que de votre côté cela vous permet également de constater que le demandeur a bossé et n'est pas juste là pour avoir une solution avec rien en retour. Le fichier en exemple permettant également de servir à d'autres en galère par la suite !
 

mapomme

XLDnaute Barbatruc
Supporter XLD
J'imagine que de votre côté cela vous permet également de constater que le demandeur a bossé
Rassure-toi, en général on s'en aperçoit assez vite (fichier exemple fourni ou pas).

J'imagine que de votre côté cela vous permet également de constater que le demandeur a bossé
C'est vrai que ça fait toujours plaisir de voir l'implication du demandeur.
 

Discussions similaires

Réponses
17
Affichages
1 K
Réponses
4
Affichages
403

Statistiques des forums

Discussions
314 841
Messages
2 113 481
Membres
111 877
dernier inscrit
thierry@1965