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+

Softmama

XLDnaute Accro
Bonsoir,

Un essai en PJ.

dans le module de la feuille concernée :
VB:
Private Sub CheckBox1_Change()
  ComboBox1.Visible = CheckBox1.Value
  If ComboBox1.Visible Then ComboBox1.Activate
End Sub


Private Sub ComboBox1_LostFocus()
  If ComboBox1.Visible Then ComboBox1.Activate
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If ComboBox1.Visible Then Exit Sub
 
  'mettre ici l'event lié à la sélection d'une cellule
  MsgBox "feuille sélectionnée"
End Sub

La première macro affiche ou pas la liste déroulante selon case à cocher.
La deuxième redonne le focus à la liste déroulante tant qu'elle est visible.
La troisième interrompt le déclenchement d'un event SelectionChange tant que la liste déroulante est affichée.
 

Pièces jointes

  • UsineàGaz.xlsm
    22.2 KB · Affichages: 7

Dudu2

XLDnaute Barbatruc
Si c'est sur la dropdown liste affichée, c'est difficile car si l'évènement ComboBox1_DropButtonClick() permet à coup sûr de gérer le status affiché ou non de la liste, cet évènement est généré avant toute autre action sur la ComboBox, la feuille ou le classeur.

Donc sur un évènement ComboBox1_LostFocus() ou Worksheet_SelectionChange() on ne peut pas savoir si la liste était affichée ou non car elle aura été systématiquement préalablement rétractée.

Par contre avec une bidouille qui consiste à placer le ComboBox1.ListIndex à -1 lorsque la liste est affichée pour forcer un choix, on peut, si ce choix n'a pas été fait, sur un ComboBox1_LostFocus() ou un Workbook_BeforeClose() imposer le retour sur la ComboBox en générant un clic souris sur le dropdown bouton dont la position a été mémorisé à l'affichage de la dropdown liste.

Cela impose d'inclure dans le projet VBA un petit module que j'ai fait (Module_PositionCurseur) qui gère curseur et clic souris.

Edit: C'est vraiment une (petite) usine à gaz !
1650346700572.gif
 

Pièces jointes

  • ComboBox Active X Modale.xlsm
    26.5 KB · Affichages: 3
Dernière édition:

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour Lionel, softmama, dudu2, le forum

un simple Application.Interactive devrait faire le boulot
https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.interactive

"Si vous définissez cette propriété sur False, Excel bloque toutes les entrées du clavier et de la souris (à l’exception des entrées dans les boîtes de dialogue affichées par votre code). Boolean (en lecture/écriture)."

Cordialement, @+
 

Pièces jointes

  • Test-2.xlsm
    30 KB · Affichages: 10

Usine à gaz

XLDnaute Barbatruc
Bonjour @Dudu2 :)
Merci pour le fichier qui fonctionne bien mais ce n'est pas ce que je souhaite.
Je Voudrais tout simplement ne pas pouvoir cliquer dans la feuille dans que la sélection dans Combo1 n'est pas faites ... mais peut-être qu'il me faudra passer par un UserForm ?
lionel :)
 

Usine à gaz

XLDnaute Barbatruc
Bonjour Lionel, softmama, dudu2, le forum

un simple application.interactive devrait faire le boulot
https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.interactive

"Si vous définissez cette propriété sur False, Excel bloque toutes les entrées du clavier et de la souris (à l’exception des entrées dans les boîtes de dialogue affichées par votre code). Boolean (en lecture/écriture)."

Cordialement, @+
Bonjour Bernard :)
ça a l'air génial ton code et ton fichier ..... je continue à tester :)
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
re,

dans le code de ta feuille 🤣🤣🤣
j'ai juste ajouté des Application.Interactive, rien modifié d'autre.

Cordialement, @+

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
   If Not Application.Intersect(Target, Range("F6:F15")) Is Nothing Then
      Cancel = True
      Application.Interactive = False
      With Me.Combo1
         .List = Array("Metropole 33", "988 Nouvelle-Calédonie  687", "987 Polynésie française 689", _
            "974 La Réunion  262", "973 Guyane 594", "972 Martinique 596", "971 Guadeloupe 590")
         .Left = Target.Offset(, 1).Left   '<-- position horizontale
         .Top = Target.Top '<-- position verticale
         .Width = 202 '<-- largeur
         .Height = 1 '<-- hauteur '= Target.Height
         .Visible = True
         .DropDown
         End With
      End If
   End Sub
Private Sub Combo1_Change()
   Application.Interactive = True
   If Combo1.MatchFound Then
      Combo1.Visible = False
      ActiveCell.Value = Right$(Combo1.Text, 3) & Right$(ActiveCell.Value, 9)
      Combo1.Text = ""
      [a1].Select
      End If
   End Sub
 

Discussions similaires

Statistiques des forums

Discussions
314 629
Messages
2 111 351
Membres
111 111
dernier inscrit
houndemint