Microsoft 365 msgbox avec liste de choix

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous,
joyeux Noel.gif

Je me tourne une nouvelle fois vers nos ténors ;)

J'ai fait des p'tits tests UF pour faire des choix de nombres ... Pas de souci particulier pour ça :)
Mais les UF, me semble-t-il, alourdissent les classeurs et les miens sont déjà plutôt lourds et "Usines à gaz" comme disent les Amis lol.

Je me demandais si ce ne serait pas mieux (si c'est possible ?) de faire ce choix à l'aide, par exemple, d'un msgbox avec liste de choix ?
J'ai fait des recherches et pas mal d'essais sans succès.

Si c'est possible, auriez-vous le bon code ?
En cas, je joins une fichier test.
Merci pas avance,
Amicalement,
lionel,
 

Pièces jointes

  • MsgBox_chiffres.xlsm
    27 KB · Affichages: 22
Dernière édition:
Solution
Bonsoir @Usine à gaz

' Astuce
' Création d'une comboBox sur la page Excel via une Msgbox
La derrière case de ce tableau : Array(10, 15, 20, 30, 45, 0)
c'est le code des boutons de la la MSGBOX soit : la description ici pour "Msgbox"

alors tbl c'est le tableau avec les valeurs que vous avez choisies sauf 0 bien sur
vous avez deviné : tbl(UBound(tbl)) La valeur c'est 0 bien sur pour "OK"
Bon sa sert a rien je pense mais, il faut utilisé Msgbox comme une fonction
qui va renvoyer 0, et donc 0 ne sert à rien dans votre liste...

Wayki

XLDnaute Impliqué
Bonsoir, et bonnes fêtes 🥳
Un msgbox va avoir un choix limité de réponses possibles.
Dans la majorité des cas, on peut y répondre par oui, non, annuler.
À chaque choix on peut assigner une procédure, cependant il me semble impossible d'y assigner une listbox pour faire un choix par exemple. On peut toute fois afficher une listbox après un choix msgbox suivant la situation, mais pas sûr que ça allège le fichier.
L'utilisation de tableaux VBA et l'option screenupdating améliorent déjà la rapidité des procédures lors de traitement de fichiers volumineux ou avec de grosses demandes de puissance de calcul.
A +
 

Wayki

XLDnaute Impliqué
Ce n'est souvent qu'un cache misère....
Un code n'a que rarement besoin d'activate ou pire de select...
Cordialement
C'est évident que des select ou activate ralentissent considérablement les codes.
Je parlais dans la mesure où le code calcule successivement des cellules en retranscrivant direct le résultat. Dans un fichier que j'avais fait, le sujet était de sortir un numéro aléatoire sans doublon, avec screenupdating l'opération était très longue alors que sans ça allait au moins 3x plus vite.
A +
 

laurent950

XLDnaute Accro
Bonsoir @Usine à gaz

' Astuce
' Création d'une comboBox sur la page Excel via une Msgbox
La derrière case de ce tableau : Array(10, 15, 20, 30, 45, 0)
c'est le code des boutons de la la MSGBOX soit : la description ici pour "Msgbox"

alors tbl c'est le tableau avec les valeurs que vous avez choisies sauf 0 bien sur
vous avez deviné : tbl(UBound(tbl)) La valeur c'est 0 bien sur pour "OK"
Bon sa sert a rien je pense mais, il faut utilisé Msgbox comme une fonction
qui va renvoyer 0, et donc 0 ne sert à rien dans votre liste (l'astuce)
Ensuite :
je redimensionne le tableau - 1 case = donc j'enlève le 0
Pour n'avoir que vos valeurs dans le tableau : 10, 15, 20, 30, 45 (soit tableau tbl)
Ensuite :
Je crée la combobox directement dans la feuille Excel.
j'y affecte les valeurs via la variable tableau tbl soit : oComb . object.List() = tbl

Dans la Feuil excel :
Je crée l'évènement "Combo1_Change" qui va récupérer la valeur (de la combobox) qui sera copiée dans la cellule active d'Excel sélectionné précédemment.

Enfin
je supprime cette comboBox créée est inutile dans la page.

VB:
Sub MsgBoxListeDeChoix()
Dim WS As Worksheet
    Set WS = ActiveSheet
Dim tbl() As Variant
    tbl = Array(10, 15, 20, 30, 45, 0)
' Msgbox
    tbl(UBound(tbl)) = MsgBox("Liste de choix", tbl(UBound(tbl)), "CLIC SUR LA BONNE REPONSE")
' Les valeurs
    ReDim Preserve tbl(UBound(tbl) - 1)
' La Liste Box
Dim oCombo As OLEObject
Dim L As Single, T As Single, W As Single, H As Single
    L = 180 '<-- position horizontale
    T = 80 '<-- position verticale
    W = 130 '<-- largeur
    H = 22 '<-- hauteur
' Si la liste existe
    For Each oCombo In WS.OLEObjects
        If oCombo.progID = "Forms.ComboBox.1" Then
            If oCombo.Name = "Combo1" Then
                oCombo.Delete
            End If
        End If
    Next
' Creation de la liste de choix
    Set oCombo = WS.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=L, Top:=T, Width:=W, Height:=H)
With oCombo
    .Name = "Combo1" '<-- nom du Combobox
    .Object.List() = tbl '<-- exemple de chargement des données
End With
Set oCombo = Nothing
End Sub

Code a copier dans le module de la feuille :
Code:
Option Explicit
Private Sub Combo1_Change()
    Dim WS As Worksheet
    Set WS = ActiveSheet
   Dim ctrl As OLEObject
   For Each ctrl In WS.OLEObjects
      If ctrl.progID = "Forms.ComboBox.1" Then
            If ctrl.Name = "Combo1" Then
            ' Valeur dans la combobox
            ' Copie dans la cellule active
                ActiveCell = ctrl.Object.Text
            ' Supprime la combobox
               ctrl.Delete
            End If
      End If
   Next
End Sub
 

Pièces jointes

  • MsgBox_chiffres MSGBOX Personnalisé.xlsm
    21.1 KB · Affichages: 46
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Chez moi ça ne marche pas tout à fait comme il faut : au lieu de s'afficher dans la MsgBox, la liste de choix s'affiche dans la feuille nommée "4 boutons".
Pour info, je suis sous Windows 10 Pro 64 21H1 avec Excel 2016 32 bits.
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re-Bonsoir laurent950,

Vraiment nickel et je te remercie :)
Je suis en train de préparer pour l'inclure dans mon "usine à gaz" lol.

Je suis en recherche des fonctions suivantes.
Affichage souhaité :
1640475275072.png

1- La Combo1 s'affiche sur le cellule cliquée,
2 - les chiffres se mettent à droite,
3 - le menu se déroule direct (Combo1.DropDown - que je n'ai pas sur placer pour l'instant)

Et là, ce serait super de chez super lol.
Je joins le fichier test et je continue à chercher,

@Marcel32 : Chez moi, ça fonctionne en Windows 10 Pro 64 21H1 avec Office365 64 bits.
lionel
 

Pièces jointes

  • MsgBox_Perso.xlsm
    30.9 KB · Affichages: 4
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Chez moi ça ne marche pas tout à fait comme il faut : au lieu de s'afficher dans la MsgBox, la liste de choix s'affiche dans la feuille nommée "4 boutons".
Pour info, je suis sous Windows 10 Pro 64 21H1 avec Excel 2016 32 bits.

@Marcel32 : Chez moi, ça fonctionne en Windows 10 Pro 64 21H1 avec Office365 64 bits.

Bon ben c'est le principal, vu que c'est toi qui veut cette fonctionnalité. 😁
 

laurent950

XLDnaute Accro
Re @Usine à gaz

La solution :

VB:
Sub MsgBoxListeDeChoix()
Dim WS As Worksheet
    Set WS = ActiveSheet
Dim tbl() As Variant
    tbl = Array(10, 15, 20, 30, 45, 0)
' Msgbox
    tbl(UBound(tbl)) = MsgBox("Liste de choix", tbl(UBound(tbl)), "CLIC SUR LA BONNE REPONSE")
' Les valeurs
    ReDim Preserve tbl(UBound(tbl) - 1)
' La Liste Box
Dim oCombo As OLEObject
Dim L As Single, T As Single, W As Single, H As Single
    'L = 180 '<-- position horizontale
    L = ActiveCell.Left
    'T = 80 '<-- position verticale
    T = ActiveCell.Top
    'W = 130 '<-- largeur
    W = ActiveCell.Width
    'H = 22 '<-- hauteur
    H = ActiveCell.Height
' Si la liste existe
    For Each oCombo In WS.OLEObjects
        If oCombo.progID = "Forms.ComboBox.1" Then
            If oCombo.Name = "Combo1" Then
                oCombo.Delete
            End If
        End If
    Next
' Creation de la liste de choix
    Set oCombo = WS.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=L, Top:=T, Width:=W, Height:=H)
With oCombo
    .Name = "Combo1" '<-- nom du Combobox
    .Object.List() = tbl '<-- exemple de chargement des données
    .Object.TextAlign = 3 ' Aligne le texte a droite
    .Object.DropDown ' Déroule le menu
End With
Set oCombo = Nothing
End Sub

Code a copier dans le module de la feuille :
VB:
   Dim ctrl As OLEObject
   For Each ctrl In WS.OLEObjects
      If ctrl.progID = "Forms.ComboBox.1" Then
            If ctrl.Name = "Combo1" Then
            ' Valeur dans la combobox
            ' Copie dans la cellule active
                ActiveCell = ctrl.Object.Text
            ' Supprime la combobox
               ctrl.Activate
               ctrl.Delete
            End If
      End If
   Next
End Sub

' Supprime la combobox
ctrl.Activate ' Required. A valid object.
ctrl.Delete
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour laurent950,
Bonjour Le Forum,

Merci pour tout ce travail :)
Je bosse aussi dessus sans arrêt depuis cette nuit (je suis mort lol)

J'ai appliqué des nouveaux qui fonctionnent.
Il reste un souci :
1640527190352.png

Hors cela, c'est nickel :)
Voir fichier joint feuille "test"
Merci à toi :)
lionel,
 

Pièces jointes

  • MsgBox_Perso.xlsm
    57.7 KB · Affichages: 9

laurent950

XLDnaute Accro
Bonjour Lionel,

Pour supprimer la combobox il faut ajouter cette ligne (Activate) avant Delete
' Supprime la combobox
ctrl.Activate
ctrl.Delete

VB:
Option Explicit
Private Sub Combo1_Change()
Dim WS As Worksheet
Set WS = ActiveSheet
Dim ctrl As OLEObject
   For Each ctrl In WS.OLEObjects
      If ctrl.progID = "Forms.ComboBox.1" Then
            If ctrl.Name = "Combo1" Then
            ' Valeur dans la combobox
            ' Copie dans la cellule active
                ActiveCell.Offset(0, -1).Value = ctrl.Object.Text + ActiveCell.Offset(0, -1).Value
            ' Supprime la combobox
               ctrl.Activate
               ctrl.Delete
            End If
      End If
   Next
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 185
Messages
2 086 010
Membres
103 090
dernier inscrit
Createlier