Forcer l'utilisateur à choisir parmi une liste de réponses existantes

  • Initiateur de la discussion Initiateur de la discussion Sebast
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

j'ai besoin de recueillir l'année de traitement souhaitée par l'utilisateur.
Jusqu'ici, je n'arrive qu'à afficher la question par msgbox() interposée mais la réponse est "libre" (hormis que je force à donner une valeur numérique)
Comment faire pour que dans la msgbox s'affichent les années présentes dans la base et donc que l'utilisateur ne puisse choisir que parmi celles-ci ? (sorte de menu déroulant)
En clair, ma base contient les années 2006 à 2014 (mais cette plage est appelée à évoluer) : je voudrais que s'affichent ces années et non que l'utilisateur puisse saisir par exemple 2015 si cette année n'existe pas.

j'ai défini la plage de données mais je ne connais pas les instructions pour que ces années s'affichent …

Quelqu'un a-t-il une idée ?

Merci d'avance pour vos lumières

Sebast



Code:
Sub Afficher_années_dans_menu_déroulant()

Dim AnnéeRéponse As Long
Dim PlagedeRecherche As Range

' définition de la plage contenant les années
Dim dernlig As Long
dernlig = Sheets("Source").Range("F" & Rows.Count).End(xlUp).Row
Set PlagedeRecherche = Sheets("Source").Range("F2:F" & dernlig)

' c'est ici que je voudrais que s'affiche un menu déroulant présentant les années existant dans la feuille Source
AnnéeRéponse = Application.InputBox("Donnez l'année souhaitée", Type:=1)
'
 'MsgBox "L'année choisie est " & AnnéeRéponse ' juste pour le contrôle
 
' traitement avec AnnéeRéponse exploitée ...
'
'
End Sub
 

Pièces jointes

Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

Re,

Je n'ai jamais dis que c'était la meilleur, mais c'est une solution simple à comprendre et à appliquer 😉

Bonne fin de journée à tous.

John
 
Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

Bonsoir à tous,

merci pour vos explications.

John : je comprends mieux, même si je dois encore assimiler par l'exemple ...

Si ... : je ne connaissais pas la technique

Robert : mon tableau peut aller jusqu'à 800 000 lignes. Tu penses que la différence peut être significative ?

à plus
Sebast
 
Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

Bonsoir le fil, bonsoir le forum,

800 000 lignes ! Alors dans ce cas il n'y a pas photo, Dictionary direct ! Je pense que VBA sera même plus rapide que les formules avec autant de données. Mais je ne suis pas un spécialiste et il m'arrive (trop souvent hélas) de dire des co...ries...
 
Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

Bonjour à tous,

merci pour ces précisions ! Vu la remarque de Robert, je vais effectivement passer au dictionary ...
et vba de toutes façons car je fais des traitements toutes les semaines.

Encore merci
 
Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

salut

un complément avec utilisations des listes de validation (mais toujours pas forcer à saisir ...).

Pour tester la vitesse, rajoute des lignes en lançant la macro a (un peu de patience ici !)
clique sur chaque bouton... et comme le dit Robert 😀 prends les photos !
Tu peux recommencer en changeant une date.

Il me semble avoir vu quelque part dans les discussions que le Dico, pour être rapide, n'était pas toujours le plus fulgurant mais je dis peut-être une ...nerie 😛.
 

Pièces jointes

Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

Bonjour à tous

Il est vrai que 800 000 lignes cela commence à faire beaoucoup.

Sinon en attendant les résultats des tests voici une macro qui permet d'extraire sur 1 colonne remplie de 1 048 576 de lignes des nombres de termes différents.

Code VBA:
Sub ExtraitSansDoublons()
t1 = Timer
Range("A1").Select
Range(Selection, Selection.End(xlDown)).Select
Columns("A:A").Select
Columns("A:A").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Selection.Copy
Sheets.Add
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort.SortFields.Add Key:=Range("A1:A101") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(ActiveSheet.Name).Sort
.SetRange Range("A1:A1048576")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Selection.End(xlDown).Select
Range(Selection, Selection.End(xlUp)).Select
MsgBox Timer - t1
End Sub





Le temps d'extraction est édifiant (testé sur XL2013 +Win 7 32 Bits):

Avec 1 terme = 2. 5 secondes
Avec 100 nombres différents= 6 secondes
Avec 10 000 nombres différents= 399 secondes 😱

Il faudrait tester avec le scripting dictionary qui devrait être plus performant en théorie 😱.

Et je vous le donne Emile, avec le scripting dictionary, il trouve le nombre de termes différents en environ 7,5 secondes de 1 à 10000 termes différents 🙂.

Code VBA:
Sub ScriptingCompteItems()
'JB Formation Excel VBA JB
t1 = Timer
'prendre l'objet Scripting Dictionary
Set Mondico = CreateObject("Scripting.Dictionary")
For Each c In Selection
Mondico(c.Value) = Mondico(c.Value) + 1
Next c
MsgBox Timer - t1
MsgBox Mondico.Count
'[C2].Resize(Mondico.Count, 1) = Application.Transpose(Mondico.keys)'
'[D2].Resize(Mondico.Count, 1) = Application.Transpose(Mondico.items)
'[C2].Sort Key1:=[D2], Order1:=xlDescending, Header:=xlNo
Set Mondico = Nothing
End Sub
 
Dernière édition:
Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

Salut Michel,

merci pour ta contribution.
Comme je dois lancer le programme toutes les semaines, extraire une liste à chaque fois est effectivement lourd. La solution du dictionary est rapide, d'autant qu'il y a peu d'items différents en matière d'année (2006 à 2014 réparties sur les 800 000 lignes environ).

Si ... : je vais tester

Merci à tous
 
Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

bonjour tous 🙂🙂

si on doit utiliser Dictionary

il faut passer directement par Dictionary

mais il faut cocher la reference Microsoft Scripting Runtime

un exemple avec..... plus je passe par un tablo plus rapide

Code:
Sub es()
Dim i As Long, t As Variant, m As Dictionary, s As Long
s = Timer
Set m = New Dictionary
t = Range("a2:a" & Cells(Rows.Count, 1).End(3).Row).Value
For i = LBound(t) To UBound(t): m(t(i, 1)) = "": Next i
MsgBox Timer - s
MsgBox m.Count
Set m = Nothing
End Sub
 
Re : Forcer l'utilisateur à choisir parmi une liste de réponses existantes

Bonjour Laetitia,

merci pour ces précisions.
La référence était bien cochée, un peu comme pour le calendrier DTPicker.

J'avoue être un peu débordé, je ne connais pas LBound et Ubound mais je vais me pencher dessus et tester ta proposition.

Encore merci pour ta contribution

Sebast
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
582
Réponses
5
Affichages
4 K
Compte Supprimé 979
C
Retour