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
 

meyscal

XLDnaute Occasionnel
Re
qu'entends-tu par :

J'ai office 365 si c'est une question !
ce que j'ai recouvert intégralité du TextBox "TBx_1" avec un label peut import sa couleur de Fond, je l'ai mis en Transparent dans les propriétés et ça marche chez moi Lol

jean marie
J'ai fait de même comme dans tes gifs mais le résultat n'y est pas.
Oui moi également avec Office 365. Peut-être aurais-je dû le faire plus haut et plus large.
Je retente.
Merci
 

patricktoulon

XLDnaute Barbatruc
Bonjour tous
Juste en passant
il faudrait que l'on m'explique pourquoi faire un tri doublons sur un TS qui normalement ne devrait pas en avoir
et ce genre d'inutilité ,le fichier en est farci
1682834755830.png


pour info quand on utilise des TS pour créer des menus(list/combo)box c'est les TS que l'on nettoie

quand au filtre(avec la boucle à reculons dans une boucle to ubound)
ben souhaitons que ce ne soit pas une liste avec trop de lignes
sachant que c'est déclenché au change d'un textbox (me semble t-il) et bien l on doit s'attendre a un soucis de delay et certainement un soucis de perte de lettre tapées et ce serait tout à fait normal entre deux lettres tapées le moulin tourne

à prendre ou à laisser
perso pour avoir une listbox intuitive ou filtrée (filtrable)

  1. la variable tableau=prendre la source + 1 colonne
  2. dans la colonne sup une petite boucle pour mettre les index de ligne 1,2,3,etc..
  3. faire un tri quick sort pour mettre les lignes dans l'ordre alphabétique
  4. le change du textbox on oublie c'est l'event keydown avec la condition keycode=13(touche enter) cela suffit pour un filtre "commence par" sans code de filtre étant donné que les lignes sont en ordre alphabétique

  5. au pire on a des dictionnaire ou des object collections pour trier par "*expression*"
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @patricktoulon :),

Selon moi, il faut répondre en prenant en compte le niveau de l'utilisateur en VBA et avancer pas à pas dans les réponses pour être quelque peu didactique. En général on commence simple (ce qui n'est ni forcément le plus efficient ni le plus compliqué) puis, on une fois assimilé, on augmente les difficultés pour arriver à un code plus efficace ou rapide.

Rien ne sert de présenter des méthodes élaborées pour quelqu'un qui se forme au VBA et qui ne maitrise pas certains des éléments de base de la programmation.

Même si tes remarques sont frappées du coin du bon sens 👍👍, je ne suis pas certain qu'un novice (même volontaire comme l'est @meyscal) puisse les assimiler et que cela lui soit d'un grand secours.

Qu'en penses-tu ?

nota : c'est le lancement du "troll" du week-end pour devancer celui de fin de semaine de @Usine à gaz qu'il n'a pas encore eu le temps de lancer me semble-t-il, non 😝?

edit : @Usine à gaz que je salue amicalement bien sûr ;).
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
@mapomme bonjour

ce que j'ai dis n'est qu'un raisonnement
et je pense que plus tôt on oriente un débutant vers des raisonnements sensés et limpides , plus vite il avancera dans le bon sens
surtout que sur le forum il a tout ce qu'il faut (tout prémâché )
et là je parles de la base
  1. des tableaux pour Menu propres(sans doublons) (faut pas être un grand développeur pour comprendre cela )
  2. d'exemple simple dans le cadre de combo ou list box intuitive (quasiment sans code) on en trouve à foison
  3. la fonction quicksort qui est toute prête à l'emploi @job75 ou moi même en avons diffusé plusieurs fois des versions et même en multi colonnes
dans le cas ou on oriente pas le débutant dans ce sens
cela produit des codes simples oui mais difficilement modifiables
car en général, un codage dans ce contexte est rarement fini(et pérenne d'ailleurs) et demande donc des ajustements
qui parfois deviennent impossibles car la structure du code ne le permet pas
et demande donc tout un nouveau travail (rebelotte) de fond structurel de code et de raisonnement
raisonnement qui est celui dont je parles
;)
 

meyscal

XLDnaute Occasionnel
Bonjour à tous,

ok j'entends bien vos arguments. Sur la pédagogie, je pencherais plutôt pour l'approche de @mapomme ayant été formateur pendant plus de 10 ans. En effet, je comprends pour l'instant tout ce qui a été fait et j'arrive à travailler dessus pour le faire coller à mon besoin.

Maintenant @patricktoulon : tu (vous) veux dire que ce code va provoquer des erreurs et que mon fichier ne sera plus sur le long ou moyen terme utilisable ?
Comme déjà expliqué, la cosmétique m'importe peu, je souhaites avoir un outil fonctionnel, si le code n'est pas optimisé mais qu'il marche, je m'en contenterai.
Si par contre il est déjà certain que ça va poser problème, je ne peux pas me permettre de passer 3 jours à tout remettre en ordre le temps que l'outil redevienne fonctionnel.
Vous aurez compris, je pense, que ce qui sera saisi dans les formulaires sont des situations urgentes à communiquer et traiter très rapidement.

Merci encore à vous tous pour vos bons conseils et votre aide précieuse.
 

meyscal

XLDnaute Occasionnel
Bonjour à tous,

voilà après quelques heures de travail où j'en suis (fichier en PJ). C'est certainement perfectible mais bon c'est fonctionnel. J'ai utilisé pour cela les fichiers travaillées par @vgendron & @ChTi160
J'ai modifié le formulaire d'édition des cartes Alerte :

- ajout d'un bouton pour filtrer par date
- ajout d'un bouton pour filtrer par statut
- ajout d'un bouton pour filtrer par secteur
- ajout d'un bouton pour le filtre par mot clé (en tenant compte de la remarque de @patricktoulon afin d'éviter de faire mouliner en boucle avec l'évènement Change)
- ajout de données pour 2021 & 2022

Ce que je n'arrive pas à faire : garder l'index pour les modifications et suppression après avoir filtrer par date et/ou statut et/ou secteur.

Ce que j'aimerais faire : faire le filtre sur date/statut/secteur puis afficher dans la listbox les résultats du (des) filtres avec encore possibilité de filtrer une dernière fois par mot clé. J'arrive à afficher les résultats après filtre (SpecialCells(xlCellTypeVisible) mais si je veux saisir un mot clé, la listbox ne les prends plus en compte et si pas de mot clé, l'indexation n'est plus bonne :(

Pour ce point, je ne pense pas être capable de le faire sans votre aide ! Pleeeaaaaassse

Je vais m'attaquer maintenant à 2 précédentes demandes auxquelles je pense pouvoir trouver la solution par moi-même :

- ne pas tenir compte des caractères spéciaux dans la recherche par mot clé
- repartir d'un numéro de carte "0001" à chaque changement d'année

Bonne journée
 

Pièces jointes

  • Cartes Alertes.xlsm
    134.7 KB · Affichages: 9

ChTi160

XLDnaute Barbatruc
Bonjour le Fil
Je vois que peu de chose, de mon fichier, font l'affaire Lol

Tu avances à grand pas, sans pour autant valider ou non, ce qui est proposé en réponse à ce que tu demandais !
Exemple : limité à l'année en cours la saisie de certaines dates alors que d'autres peuvent être sur l'année Suivante etc etc .......
Bonne continuation
Jean marie
 

meyscal

XLDnaute Occasionnel
Exemple : limité à l'année en cours la saisie de certaines dates alors que d'autres peuvent être sur l'année Suivante etc etc .......
Bonjour @ChTi160

oui comme expliqué plus tôt dans la conversation :

- la date d'émission est le jour où on saisi la carte donc forcément l'année en cours (saisie faite à J ou max J+1)
- la date de clôture est le jour où on met en place les actions donc forcément également l'année en cours car ce sera renseigné le jour où c'est réalisé
- le "délai" quant à lui représente une estimation du temps nécessaire pour mettre en place les actions donc soit l'année en cours soit si on est en fin d'année, l'année suivante

Enfin si le "délai" est loin dans le temps, il est obligatoire de mettre en place une "mesure conservatoire"

sans pour autant valider ou non, ce qui est proposé en réponse à ce que tu demandais !

Au temps pour moi. Oui la solution apportée est top ! Donc je valide ;)

Mais comme souvent lors des tests, on se rend compte que le besoin n'est pas tout à fait assouvi. Ici en reprenant ma BDD réelle, je me rends compte que même avec un mot clé je me retrouve avec un grand nombre de résultats.
C'est pour cette raison que réduire au préalable la liste avec les champs "année" (année d'émission), "statut" et "secteur" serait parfait. Surtout si je peux me permettre comme ici de garder le même fichier pendant plusieurs années 😁

Sinon, j'ai visiblement réussi à repartir de 0001 à chaque nouvelle année avec le code ci-dessous. Ca vous semble ok ? Semble ok d'après les test que j'ai fait.
Pour les accents et caractères spéciaux, je laisse tomber. Il y aura juste un message "Aucun résultat ! Vérifiez votre saisie."

VB:
With Range("t_BDD_Alertes").ListObject

ValCarte = Format(Date, "yy") & "-" & "0001"

ValCarte = Val(Right(.ListRows(.ListRows.Count).Range(1, 1), 4)) + 1 'On récupére le chiffre de la derniére Carte


ValCarteAnnee = Val(Left(.ListRows(.ListRows.Count).Range(1, 1), 2)) 'On définit l'année sur le format de carte

If ValCarteAnnee <> Format(Date, "yy") Then 'Si l'année est différente de la dernière carte
Me.LBl_Numero_Carte.Caption = Format(Date, "yy") & "-" & "0001" 'On reprend de puis 0001 avec la nouvelle année

Else

Me.LBl_Numero_Carte.Caption = Format(Date, "yy") & "-" & Format(ValCarte, "0000") ' Sinon on continue d'incrémenter

End If
End With
 

ChTi160

XLDnaute Barbatruc
Bonsoir
Ce que j'aurais mis : à tester (Perfectible)
VB:
With Range("t_BDD_Alertes").ListObject
       YearCarte = Val(Left(.ListRows(.ListRows.Count).Range(1, 1), 2)) 'on récupére l'année de la dernière saisie
         ValCarte = IIf(YearCarte < Format(Date, "yy"), Val(1), Val(Right(.ListRows(.ListRows.Count).Range(1, 1), 4)) + 1)   'On definit ll'index (chiffre) de la derniére Carte
    Me.LBl_Numero_Carte.Caption = Format(Date, "yy") & "-" & Format(ValCarte, "0000")  'Puis On formate le Numéro de la Carte en fonction de l'année plus un si année en cours ,1 si Nouvelle année
    End With
jean marie
 

meyscal

XLDnaute Occasionnel
Bonsoir à tous,

Merci encore à vous tous pour votre aide précieuse.
Malheureusement, je ne suis pas parvenu à terminer tout seul.
J'avoue qu'à l'usage et lors des tests mes besoins ont évolué mais à force de patience et de recherche j'ai trouvé un modèle du regretté par beaucoup Boisgontier Jacques.
J'ai réussi à adapter son code mais je rencontre un dernier problème.

Dans un souci de cohérence, je marque ce poste en résolu et j'en ouvre un autre.
Un grand merci à @mapomme pour sa pédagogie, @vgendron et @ChTi160 pour le temps passé et l'aide apportée.
Sans oublier @cp4, @Lolote83 et tous les autres !

Pour la résolution du problème, je marque la solution de @ChTi160 qui devance @vgendron d'une courte tête 😁

Bien à vous,
meyscal

Edit :
pour ceux qui auraient la gentillesse ou la patience d'apporter encore leur contribution à ce projet presque abouti ! Voici le lien du nouveau post :
 
Dernière édition:

Discussions similaires

Réponses
17
Affichages
798
Réponses
4
Affichages
190

Statistiques des forums

Discussions
312 047
Messages
2 084 858
Membres
102 688
dernier inscrit
Biquet78