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,
' 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...
Bonjour Marcel32,
Merci pour le retour
OUI, si pas de solution pas MsgBox, je garderai l'un des UF.
Mais les MsgBox permettent aussi de faire des choix alors peut-être que ....
lionel,
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 +
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 +
' 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
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.
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é :
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
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.
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
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