Optimiser ma liste déroulante créée avec un ComboBox

  • Initiateur de la discussion Initiateur de la discussion Amilo
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Amilo

XLDnaute Accro
Bonsoir le forum,

J'ouvre une nouvelle discussion même si c'est la continuation de mon précédent message,

Le nouveau problème avec ma liste déroulante (clic sur la cellule A2 de la feuille1), c'est que lorsque je saisie une 1ère lettre par exemple le S dans ma liste déroulante,

il ne m'est pas possible choisir ce nom, je suis obligé de sélectionner un autre nom...!!

C'est pareil à chaque fois qu'un nom fait partie du 1er rang de la lettre saisie....!!!!

Dans la lancée d'une optimisation, est-il possible de refermer l'affichage de l'userform en cliquant sur Echap avec un ptit code ??

Autre demande svp, peut-on faire apparaitre la liste déroulante sur une plage donnée...par exemple dans les cellules A2 à A40 ??

Si vous avez d'autres suggestions je prends volontiers,


P.S : je me permets juste de vous indiquer ci-dessous le bout de code ci-dessous qui se trouve dans mon classeur,

J'ai l'impression qu'il n'est pas opérationnel alors je préfère le supprimer,

Mais je me demande pourquoi il ne fonctionne pas ???

If Noms = "" Then
MsgBox "Il faut saisir un nom.", vbCritical, "Attention !"
Exit Sub
End If


Et enfin, contrairement à un autre fichier perso, la ligne dans mon précédent message qui posait un problème d'affichage, ne pose pas de problème dans celui là....!!!!

Il s'agit de l'instruction suiivante :

.Width = 20 + plage.Width
col = ""



Merci d'avance

Cordialement
 

Pièces jointes

Dernière édition:
Re : Optimiser ma liste déroulante créée avec un ComboBox

Mais je me demande pourquoi il ne fonctionne pas ???

If Noms = "" Then
MsgBox "Il faut saisir un nom.", vbCritical, "Attention !"
Exit Sub
End If

Le code dans lequel se trouvent ces instructions ne s'exécute que s'il y a une saisie dans la combobox.... Et dès lors qu'il y a une saisie, il n'est plus à blanc

Ce code conviendrait dans une commandbutton qui valide la saisie : au cas où la combobox serait à blanc alors afficher le message

a+
 
Re : Optimiser ma liste déroulante créée avec un ComboBox

Bonjour Amilo,

A mon humble avis, une listbox est plus pratique pour la saisie:
  • si on tape sur une lettre, on se positionne sur le premier nom commençant par cette lettre
  • si ensuite on tape sur la même lettre, on sélectionne successivement les noms avec cette initiale
  • l'utilisateur a tout de suite une vue plus complète de la liste

La validation se fait par un double clique ou la touche entrée

La touche Esc annule la saisie

L'appel de la fenêtre de saisie se fait par double-clique
=> on peut le faire par l'évènevent SelectionChange (voir message #7 ) mais, c'est selon moi, polluant quand on navigue sur la feuille.

La fenêtre apparait si on double-clique dans une des cellule A2:B40.

Il a été défini un nom dynamique de classeur: Nom=lesNoms et Définition=DECALER(Feuil2!$A$1;1;0;NBVAL(Feuil2!$A:$A)-1;2). Ce Nom sert à la définition de RowSource de la liste.

Le code du module de Feuil1:
VB:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Count = 1 And Target.Row >= 2 _
    And Target.Row <= 40 And Target.Column <= 2 Then
  Cancel = True
  Saisie.Show
End If
End Sub

'Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'If Target.Count = 1 And Target.Row >= 2 _
'  And Target.Row <= 40 And Target.Column <= 2 Then Saisie.Show
' End Sub

Le code de la fenêtre de saisie:
VB:
Option Explicit

Private Sub UserForm_Initialize()
  ListeNoms.ListIndex = -1
End Sub

Private Sub ListeNoms_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Inscription ListeNoms.ListIndex
End Sub

Private Sub ListeNoms_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 27 Then Unload Me
  If KeyAscii = 13 Then Inscription ListeNoms.ListIndex
End Sub

Sub Inscription(Ligne As Long)
  If Ligne = -1 Then
    MsgBox "Il faut:" & vbLf & vbLf & " Soit sélectionner un nom." & _
      vbLf & vbLf & " Soit annuler la saisie (Esc)", vbCritical, "Attention !"
    Exit Sub
  End If
  Sheets("Feuil1").Select
  Cells(ActiveCell.Row, "a") = Range("LesNoms")(Ligne + 1, 1)
  Cells(ActiveCell.Row, "b") = Range("LesNoms")(Ligne + 1, 2)
  Unload Me
End Sub

nb:si on garde les deux évènements pour faire apparaître la fenêtre de saisie, il faudra peut-être utiliser les instructions Application.EnableEvents = False et Application.EnableEvents = true dans les procédures évènementielles afin de ne pas provoquer d'interaction entre les évènements (pas testée)
 

Pièces jointes

Dernière édition:
Re : Optimiser ma liste déroulante créée avec un ComboBox

Bonjour CHALET53,

Merci pour vos réponses,

Le code que vous proposez ne fonctionne malheureusement pas.

Pour votre 2ème message, vous avez raison et je pense également que le MsgBox a été prévu intinialement pour un formulaire avec bouton de validation, je vais donc le supprimer,

Merci encore, en attendant de voir pour les 2 autres optimisations

Cordialement
 
Re : Optimiser ma liste déroulante créée avec un ComboBox

(re)Bonjour,

Pour être cohérent avec le nota bene du message précédent, ne garder qu'une des procédures évènementielles et mettre l'autre entièrement en commentaire (de sub à end sub)
 

Pièces jointes

Dernière édition:
Re : Optimiser ma liste déroulante créée avec un ComboBox

Re,

Effectivement, c'est pas mal du tout avec une listeBox, surtout que les touches Echap et Entrée fonctionnent sans problème,

Cependant, dans le fichier actuellement sur le forum, dès que je rentre dans l'Editeur VB (Alt + F11) et que je consulte simplement le code dans l'Userform pour ensuite quitter tout le classeur et cela sans aucune modification, il apparait le message d'erreur "Mémoire insuffisante"....!!!

Et tout mon classeur se bloque

Avez-vous le même problème ??

L'autre 2ème soucis, mais j'étais loin d'avoir adapté l'ensemble du code à mon fichier perso....il m'est demandé de déclarer la variable listeNoms sous :

Private Sub UserForm_Initialize()
ListeNoms.ListIndex = -1

Pourtant, dans mes options VB sous Outils, il n'est pas coché "Déclarer des variables obligatoires"...!!!

Mais j'attends d'abord adapter l'ensemble du code à mon classeur perso et là on verra bien..

Mais ça me prendra un certain temps pour cela...je vous donnerai un retour...

Merci pour tout le travail et cette optimisation

Cordialement
 
Re : Optimiser ma liste déroulante créée avec un ComboBox

(re)Bonjour Amilo,

Avez-vous utilisé la version 2 en mettant en commentaire l'ensemble de la procédure évènementielle depuis Private Sub Worksheet_SelectionChange jusqu'à End Sub ?
 
Re : Optimiser ma liste déroulante créée avec un ComboBox

Re,

Pour le problème ci-dessous, il s'agissait du nom de la listeBox qui n'était pas à jour dans mon fichier perso...

L'autre 2ème soucis, mais j'étais loin d'avoir adapté l'ensemble du code à mon fichier perso....il m'est demandé de déclarer la variable listeNoms sous :

Private Sub UserForm_Initialize()
ListeNoms.ListIndex = -1

Pourtant, dans mes options VB sous Outils, il n'est pas coché "Déclarer des variables obligatoires"...!!!

Cordialement
 
Re : Optimiser ma liste déroulante créée avec un ComboBox

Re,

Je crois que c'est bon désormais, j'ai pu appliquer la listeBox et le code à mon fichier perso,

C'était loin d'être évident pour moi, car j'ai galéré à faire afficher le nom défini dans la listeBox (celle-ci était totalement vide et je ne comprenais pas)....finalement, j'avais oublié d'indiquer le nom défini dans les propriétés de la listeBox sous RowSource

Et pour le message "Mémoire Insuffisante", il n'apparaît plus par enchantement....!!!

Mille merci mapomme pour votre aide

Cordialement
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour