Microsoft 365 ComboBox ne pas sortir si clic hors sélection dans la list

Usine à gaz

XLDnaute Barbatruc
Bonsoir à toutes et à tous :)

Quand on "lance " un UserForm" le choix modal ou non modal est possible :
Mon_UserForm.Show
modal :
Par défaut, un UserForm est "modal" ce qui implique que vous ne pouvez pas travailler sur une feuille tant que l'UserForm est ouvert.
Mon_UserForm.Show 0
non modal :
En mode "non modal", vous pouvez travailler sur une feuille tout en ayant un UserForm ouvert. Pour cela, ajoutez un "0" à l'ouverture.

Voici ma question
Dans mon fichier, j'ai un ComboBox mais sans UserForm :
Quand il est ouvert, est-il possible de bloquer la feuille comme pour "Mon_UserForm.Show" = modal ?

Jusqu'à maintenant, je n'ai pas trouvé.
Auriez-vous une solution ?
Merci à tous,
lionel :)
 
Solution
Bonjour Lionel, le forum,

Ton problème c'est que tu bricoles les codes qu'on te donne et après ils ne tiennent plus la route.

Ton test avec la cellule P1 est bien maladroit alors qu'il suffit de tester "MaCell".

Les macros Worksheet_Activate en Feuil1 et Feuil2 sont totalement inutiles puisque la macro "Affiche" renvoie toujours sur la feuille "Gérard".

Et la macro "désactive_alphabet' est vraiment sans intérêt puisqu'on peut entrer des chiffres ou d'autres caractères, il vaut mieux protéger la feuille, je l'ai fait avec le mot de passe toto.

Utilise donc ce fichier (6).

A+

Dudu2

XLDnaute Barbatruc
C'est vrai que Application.Interactive simplifie drastiquement le code...
VB:
Private ComboBox1_DropDown As Boolean

Private Sub ComboBox1_DropButtonClick()
    If Not ComboBox1_DropDown Then
        Application.Interactive = False
    Else
        If Me.ComboBox1.ListIndex <> -1 Then Application.Interactive = True
    End If
 
    ComboBox1_DropDown = Not ComboBox1_DropDown
End Sub

Edit: Cet évènement est très pratique. Contrairement à son nom, il ne se limite pas au clic sur le DropDown Button.
Il est activé aussi lors de la fermeture de la liste dans TOUS les cas (choix d'un item, perte de focus de la ComboBox pour quelque raison que ce soit).
Il permet de gérer un flag d'état affiché/masqué de la liste sûr à 100%.
 

Pièces jointes

  • ComboBox Active X Modale Interactive.xlsm
    21.5 KB · Affichages: 0
Dernière édition:

Dudu2

XLDnaute Barbatruc
On peut même réduire le code à ça car la seule façon de fermer la liste en Application.Interactive = False c'est de choisir un Item.
VB:
Private ComboBox1_DropDown As Boolean

Private Sub ComboBox1_DropButtonClick()
    Application.Interactive = ComboBox1_DropDown
    ComboBox1_DropDown = Not ComboBox1_DropDown
End Sub
 

Dudu2

XLDnaute Barbatruc
Par contre, rien n'empêche de rentrer dans la ComboBox, d'effacer la valeur puis de sortir de la ComboBox sans avoir affiché la liste.
Il faut donc protéger ce cas si on veut absolument une valeur dans le ComboBox.
Code:
Private ComboBox1_DropDown As Boolean

Private Sub ComboBox1_DropButtonClick()
    Application.Interactive = ComboBox1_DropDown
    ComboBox1_DropDown = Not ComboBox1_DropDown
End Sub

Private Sub ComboBox1_LostFocus()
    With Me.ComboBox1
        If .ListIndex = -1 Then .Activate
    End With
End Sub
 

Pièces jointes

  • ComboBox Active X Modale Interactive.xlsm
    21.7 KB · Affichages: 1

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re,
Que veut dire (en langage profane lol) : si tu bascules sur visual basic ouvert alors que la liste est affichée.
cela veut dire ce qu'une fois qu'application.interactive est sur false, tu ne peux plus lancer l'éditeur VB, mais s'il est déjà ouvert, tu peux l'activer par la barre des taches. Si tu fais cela alors que la liste est affichée, la liste se ferme sans exécuter change et, effectivement, si tu rebascules sur excel, l'application est bloquée. Maintenant, rien n'empêche d'avoir une macro pour le réactiver à partir de VBE, comme au post 28.
Si tu trouves un autre cas provoquant ce blocage, qui soit possible pour un utilisateur normal du fichier, je suis curieux de le connaitre.

Cordialement, @+
 

Usine à gaz

XLDnaute Barbatruc
Re,

cela veut dire ce qu'une fois qu'application.interactive est sur false, tu ne peux plus lancer l'éditeur VB, mais s'il est déjà ouvert, tu peux l'activer par la barre des taches. Si tu fais cela alors que la liste est affichée, la liste se ferme sans exécuter change et, effectivement, si tu rebascules sur excel, l'application est bloquée. Maintenant, rien n'empêche d'avoir une macro pour le réactiver à partir de VBE, comme au post 28.
Si tu trouves un autre cas provoquant ce blocage, qui soit possible pour un utilisateur normal du fichier, je suis curieux de le connaitre.

Cordialement, @+
Merci à toi : je testerai "dans tous les sens" dès je j'aurai du temps :)
 

Usine à gaz

XLDnaute Barbatruc
Re-Bonjour à tous,

J'aime beaucoup la solution de Gérard :)
Elle ne présente aucun inconvénient et permet de sortir de la ComBo1 soit au clic :
1650383411783.png

Ou au clic ailleurs dans la feuille, laissant "plus clairement" le choix à l'utilisateur d'affecter ou non.
J'aurais bien aimé mettre une couleur à : "Fermer = clic ICI ou ailleurs"
Mais je ne sais pas le faire lol,
Un p'tit coup de "main" ?
Je joins le fichier.
Merci par avance,
lionel :)
 

Pièces jointes

  • ComBo1_Gérard.xlsm
    28 KB · Affichages: 5
Dernière édition:

job75

XLDnaute Barbatruc
En plus tu as bricolé le code que j'ai donné au post #25.

Tu fais souvent ça, ne sois pas surpris ensuite que ça n'aille pas.

Tu passes ton temps à mettre des Select à tout bout de champ alors que tout le monde sait qu'en VBA il faut les éviter.
 

job75

XLDnaute Barbatruc
VB:
Private Sub Combo1_Change()
    If Combo1.MatchFound Then
        If Combo1.ListIndex Then ActiveCell.Value = Right$(Combo1.Text, 3) & Right$(ActiveCell.Value, 9)
        Combo1.Text = ""
        ActiveCell.Select
    End If
End Sub

Private Sub Combo1_LostFocus()
Combo1.Visible = False
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
314 629
Messages
2 111 345
Membres
111 110
dernier inscrit
chergui