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

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
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+

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour Gérard :)

Effectivement, tu as raison (comment en douter lol) mon précédent fichier fonctionnait au 1er clic hors combo1 mais ne fonctionnait plus à l'éventuel clic suivant hors combo1.
Jusqu'à maintenant, je n'étais pas parvenu à résoudre le souci.
J'essayais de passer par un double clic simulé avec senkey mais je n'arrive pas à le faire.

Vraiment merci pour ta patience et tout le temps que tu m'as encore consacré pour arriver à résoudre mon besoin... Génial de chez génial ... super vraiment et nickel !!!
Merci encore Gérard :)
lionel :)
 

job75

XLDnaute Barbatruc
Plus simple, pas besoin de la variable "ferme", fichier (3) :
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
        With Combo1
            .List = Array("Métropole 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, pour masquer la zone de texte
            .Text = "" 'RAZ
            .Visible = True
            Do
                DoEvents
                Target.Offset(, -5).Select 'déplace la sélection en colonne A mais est-ce bien utile ???
                .DropDown
            Loop
        End With
    End If
End Sub
 
Private Sub Combo1_Change()
    If Not Combo1.MatchFound Then Exit Sub
    Dim x$
    ActiveCell(1, 6) = Right$(Combo1.Text, 3) & Right$(ActiveCell(1, 6), 9)
    x = ActiveCell(1, 2) 'colonne B
    x = Replace(Replace(x, " - Métropole", ""), " - Outre Mer", "")
    Application.EnableEvents = False 'si c'est vraiment nécessaire...
    ActiveCell(1, 2) = x & IIf(Left(ActiveCell(1, 6), 2) = "33", " - Métropole", " - Outre Mer")
    Application.EnableEvents = True
    End 'arrête la boucle Do/Loop
End Sub
 

Pièces jointes

  • ComBo1_Gérard(3).xlsm
    32.9 KB · Affichages: 0
Dernière édition:

job75

XLDnaute Barbatruc
Une solution plus élaborée dans ce fichier (4) :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Intersect(Target, Range("f6:f15")) Is Nothing Then Exit Sub
    Cancel = True
    With Combo1
        .List = Array("Métropole 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, pour masquer la zone de texte
        .Text = "" 'RAZ
        .Visible = True
        ThisWorkbook.Names.Add "Affiche", 1, Visible:=False 'nom défini masqué pour la macro Workbook_BeforeClose
        Do
            DoEvents
            Me.Visible = xlSheetVisible 'si la feuille est masqiée
            Application.Goto Target.Offset(, -5) 'déplace la sélection en colonne A mais est-ce bien utile ???
            .DropDown
        Loop
    End With
End Sub
  
Private Sub Combo1_Change()
    If Not Combo1.MatchFound Then Exit Sub
    Dim x$
    ActiveCell(1, 6) = Right$(Combo1.Text, 3) & Right$(ActiveCell(1, 6), 9)
    x = ActiveCell(1, 2) 'colonne B
    x = Replace(Replace(x, " - Métropole", ""), " - Outre Mer", "")
    Application.EnableEvents = False 'si c'est vraiment nécessaire...
    ActiveCell(1, 2) = x & IIf(Left(ActiveCell(1, 6), 2) = "33", " - Métropole", " - Outre Mer")
    Application.EnableEvents = True
    ThisWorkbook.Names("Affiche").Delete 'RAZ
    End 'arrête la boucle Do/Loop
End Sub
Avec dans ThisWorkbook :
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If IsError([Affiche]) Then Exit Sub
Me.Names("Affiche").Delete 'RAZ
Sheets("Gérard").OLEObjects("Combo1").Activate: ActiveCell.Activate 'ferme la liste
Me.Save 'enregistre pour éviter l'invite à la fermeture
End Sub
Bonne nuit.
 

Pièces jointes

  • ComBo1_Gérard(4).xlsm
    35.8 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjour Lionel, le forum,
Merci Gérard : très bonne idée de fermer la liste à la fermeture du fichier.
Une autre solution est d'empêcher la fermeture du fichier tant que la liste est affichée, fichier (5) :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Intersect(Target, Range("f6:f15")) Is Nothing Then Exit Sub
    Cancel = True
    With Combo1
        .List = Array("Métropole 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, pour masquer la zone de texte
        .Text = "" 'RAZ
        .Visible = True
    End With
    ThisWorkbook.Names.Add "MaCell", Target, Visible:=False 'nom défini masqué
    Application.OnTime 1, Me.CodeName & ".Affiche" 'lance la macro
End Sub

Sub Affiche()
    On Error Resume Next
    Do
        DoEvents
        Me.Visible = xlSheetVisible 'si la feuille est masqiée
        Application.Goto [MaCell].Offset(, -5) 'déplace la sélection en colonne A mais est-ce bien utile ???
        Combo1.DropDown
    Loop While Err = 0
    Combo1.Activate: ActiveCell.Activate 'ferme la liste
    ThisWorkbook.Names("MaCell").Delete 'sécurité
End Sub

Private Sub Combo1_Change()
    If Not Combo1.MatchFound Then Exit Sub
    Dim x$
    ActiveCell(1, 6) = Right$(Combo1.Text, 3) & Right$(ActiveCell(1, 6), 9)
    x = ActiveCell(1, 2) 'colonne B
    x = Replace(Replace(x, " - Métropole", ""), " - Outre Mer", "")
    Application.EnableEvents = False 'si c'est vraiment nécessaire...
    ActiveCell(1, 2) = x & IIf(Left(ActiveCell(1, 6), 2) = "33", " - Métropole", " - Outre Mer")
    Application.EnableEvents = True
    ThisWorkbook.Names("MaCell").Delete 'arrête la boucle Do/Loop
End Sub
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If TypeName([MaCell]) <> "Range" Then Exit Sub
    Cancel = True 'empêche la fermeture du fichier
    Application.OnTime 1, [MaCell].Parent.CodeName & ".Affiche" 'relance la macro
End Sub

A+
 

Pièces jointes

  • ComBo1_Gérard(5).xlsm
    35.8 KB · Affichages: 1
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour Gérard, le Forum,
Je vous souhaite une très belle journée :)

@Gérard :)
Mes élucubrations de la nuit lol 🤣
J'ai voulu "aller" jusqu'au bout :
Je suis parti de tes codes (bien évidemment) et voilà ce que j'ai voulu faire :
Quand Combo1 est affiché, sans altérer les actions des codes
Le but est de :
1 Garder Combo1 affichée et active OK
2 Interdire la saisie où que ce soit OK
3 Empêcher la sortie de la feuille OK
4 Empêcher la fermeture d'Excel OK
Ferme combo1 si double clic
Résolu avec "CB" en P1
et peut-être que j'y suis arrivé ??? :)
Je joins le fichier test,
J'ai changé le titre du fil qui me semble plus approprié suite aux évolutions.
lionel :)
 

Pièces jointes

  • ComBo1_Gérard(4)_1.xlsm
    45 KB · Affichages: 4
Dernière édition:

job75

XLDnaute Barbatruc
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+
 

Pièces jointes

  • ComBo1_Gérard(6).xlsm
    44.8 KB · Affichages: 6

Discussions similaires

Statistiques des forums

Discussions
311 709
Messages
2 081 766
Membres
101 815
dernier inscrit
sgep59