Questions sur listes deroulantes
bonsoir,
1/peut-on re-dimensionner la fenêtre d'affichage d'une liste déroulante ?
2/ ma liste déroulante affiche 1 colonne. C'est insuffisant parfois pour choisir la rubrique.
j'aurais besoin d'afficher non pas 1 colonne mais 3 colonnes pour me permettre de mieux choisir ma rubrique
ex :
aujourd'hui ma liste affiche exclusivement la col1 d'une table qui comporte 3 col.
col1 col2 col3
AAA 100 101
BBB 150 151
BBB 150 152
BBB 150 153
CCC 200 201
etc...
la seule visualisation de la col 1 n'est pas suffisante pour choisir les codes BBB.
On me dira que je n'ai quà libelle mes 3 cellules BBB en BB1, BB2, BB3 etc...
sauf que ça apporte d'autres complications pour moi, donc j'élimine cette possibilté!
Donc ai-je la possibilté d'afficher en liste déroulante ces 3 colonnes?
3/ comment fait-on, à l'ouverture de la fenêtre, que le curseur pointe sur le début de la liste. (dans mon cas il est aprés le dernier!)
merci
cdt
sam
Bonsoir,
Pourrait tu nous mettre un copie de ton classeur, avec des données bidons !!
c'est toujours plus facile et surtout rapide pour t'aider, ca evite que l'on s'image ton classeur et qu'on le reproduise
Bonjour,
2 options : combobox multicolonnes ou combobox en cascade.
Je ne sais pas laquelle serait plus adaptée à ton projet.
Gelinotte
Bonsoir Sam, bonsoir le forum,
Regarde la propriété ColumnCount des Comboboxes. Si tu veux plus de précisions, commence par nous donner le code à défaut du fichier...
bonsoir,
dans le fichier ci joint vous verrez :
-1 onglet encours où j'ai une liste de saisie (pas de combobox! pour l'instant, ce sera dans une seconde étape)
avec une liste déroulante sur le "type" qui me renseigne en col B (le type) saisi
en col C le libellé type
en col D le libellé compl
en col E le code regrt
je voudrais savoir si je pouvais avoir la fenêtre déroulante avec les col A B C D de la table des types de l'onglet LISTES
D'autre part dans ce fichier exemple la fenêtre déroulante colle à la taille de la colonne ! alors que dans le fichier d'origine elle est bien plus grande !!! je vais y regarder de plus prés!
merci pour étudier le problème du multi colonnes de la fenetre déroulante
cdt
sam
bonjour
merci à sakman26
mais j'avais pensé à cette "concaténation" des 4 colonnes en 1 seule. c'est une façon de contourner le problème.
ça implique de faire cohabiter les 2 tables avec les maj éventuelles sur chacune d'elles
Ne peut-on pas avoir le même résultat sans passer par une table intermédiaire et en ayant l'affichage des 4 colonnes ?
NB. en l'absence de solution je crois que je me rabattrais sur celle là.
Ceci dit, si je passe par une combobox (userform etc...) y aurait-il une solution plus "simple" ?
à ce moment-là je me dépecherais de passer à cette étape (un peu plus compliquée par rapport à mes connaissances)
merci
sm
NB2. si je mets en place cette solution (colonnes concaténées) du coup le libellé devient beaucoup plus long à l'affichage.
et pour bien visualiser cet affichage y a t il un moyen d'agrandir la fenêtre de visualisation de cette fenêtre déroulante, sans agrandir la colonne B de l'onglet ENCOURS sur laquelle porte cette liste déroulante
Bonjour le fil, bonjour le forum,
Désolé j'avais confondu Liste de validation et Combobox...
Je te propose une solution VBA car par formule je ne sais pas faire. Elle utilise les deux événementielles Change et SelectionChange de l'onglet ENCOURS.
Le code :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'au chagement de sélection dans l'onglet
Dim L As Worksheet 'déclare la variable L (onglet Listes)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim LST As String 'déclare la variable LST (LiSTe de validation de données)
'condition : si la cellule sélectionnée se trouve dans la colonne 2 (=B) et dans une ligne supérieure à 5
If Target.Column = 2 And Target.Row > 5 Then
Set L = Worksheets("LISTES") 'définit l'onglet L
TV = L.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
For J = 1 To UBound(TV, 2) 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
LST = IIf(LST = "", TV(I, J) & "/", LST & TV(I, J) & "/") 'définit la variable LST
Next J
'à la fin de la ligne, redéfinit la liste LST en enlevant le dernier slash et en ajoutant une virgule
LST = Mid(LST, 1, Len(LST) - 1) & ","
Next I 'prochaine ligne de la boucle 1
With Target.Validation 'prend en compte la validation de la cellule sélectionnée
.Delete 'efface une éventuelle ancienne validation
.Add xlValidateList, Formula1:=LST 'ajoute la variable LST comme liste de validation de données
End With 'fin de la prise en compte de la validation de données
End If 'fin de la condition
End Sub
Private Sub Worksheet_Change(ByVal Target As Range) 'au chagement dans l'onglet
'condition 1 : si la cellule sélectionnée se trouve dans la colonne 2 (=B) et dans une ligne supérieure à 5
If Target.Column = 2 And Target.Row > 5 Then
If Target.Value = "" Then 'condition 2 : si la cellule est effacée
Application.EnableEvents = False 'désactive les macros événementielles
Target.Resize(1, 3).Value = "" 'efface les deux autre cellule à droite
Application.EnableEvents = True 'réactive les macros événementielle
Exit Sub 'sort de la procédure
End If 'fin de la condition 2
'renvoie dans la cellule en colonne D le texte après le troisième slash
Target.Offset(0, 2).Value = Split(Target.Value, "/")(3)
'renvoie dans la cellule en colonne C le texte entre le secondet le troisième slash
Target.Offset(0, 1).Value = Split(Target.Value, "/")(2)
Application.EnableEvents = False 'désactive les macros événementielles
'renvoie dans la cellule le texte avant le premier slash
Target.Value = Split(Target.Value, "/")(0)
Application.EnableEvents = True 'réactive les macros événementielle
End If 'fin de la condition 1
End Sub
Le fichier :
merci à tautheme
si j'ai bien compris (d'un rapide coup d'oeil de néophyte), c'est en fait la solution de sakman26.
sakman26 fait la concaténation "manuellement" et tauthème "dynamiquement" ; C'est ça?
je vais examiner vos solutions
merci
sam
désolé thautheme, je n'ai pas pu te répondre plus tôt!
j'ai des problèmes d'internet!
Ta solution m'interesse beaucoup!
comment puis-je la mettre en oeuvre dans mon fichier ?
merci pour ton aide
ça y est j'ai trouvé le code ! je crois que je vais y arriver!
merci!!
cdt
sam
bonsoir
un petit appel à thautheme :
je pensais pouvoir arriver à intégrer ton userform dans mon fichier d'origine mais je n'y arrive pas
pourrais tu me donner les différentes étapes, comment tu as fait les liens entre tou s ces éléments
par avance merci
sm
Bonjour le fil, bonjour le forum,
Ouvre les deux fichiers. Le "mien" et le tien.
Dans "mon" fichier, dans l'onglet ENCOURS, clique en bas avec le bouton droit et choisis l'option Visualiser le code. Copie les 5 lignes de la macro événementielle Worksheet_SelectionChange. Colle les au même endroit dans ton fichier.
Dans VBE, l'éditeur VBA, fait glisser l'Userform1 de mon fichier au tien. Voilà !...
Sinon envoie le bon fichier. On perdra moins de temps...
bonjour,
pour thauthème que je remercie pour son aide et sa patience !
1/j'avais déjà fait la copie de chez "toi" à chez "moi"
aprés quelques adaptations de cellules et autres, liées à mon fichier original,
j'ai fini par trouver les bons "réglages", mais au moment de "l'exécution" tout se bloque !!!
je ne peux plus rien faire (entrer, sortir, faire autre chose, quitter ...) rien!
obligé de me déconnecter et me reconnecter!
et repartir du début!
en désespoir de cause je me suis dit que j'allais t'envoyer un fichier original mais réduit en volume!
ce que j'ai fait :
j'ai donc pris mon fichier original enrichi avec tes modifs que j'ai rapatriées et adaptées, j'ai réduit le volume d'écritures dans les onglets concernés, supprimé des onglets qui n'intéressaient pas notre problème et à ce moment ... miracle, tout marche !!!
Je n'ai pas compris pourquoi !
Je rapatrie alors le code en question à nouveau dans mon fichier d'origine et .... rebelote ! ça replante !!!
Comprend pas ! ça marche sur le fichier d'origine réduit mais pas sur le fichier d'origine complet!
2/je voudrais créer un 2ème userform pour une autre colonne du même onglet.
il suffira de créer un userform2 avec une listbox2 ? d'accord ?
3/ y a t il une possibilté de faire "un encadrement" plus "design" ?
merci beaucoup
sam
Bonsoir,
Il est difficile voire impossible de t'aider sans le fichier. Il y aurait-il déjà des macro événementielles dans les onglets qui nous concernent ou dans le composant ThisWorkbook ? C'est peut-être la cause du plantage.
Quant à la seconde UserForm elle n'est pas forcément nécessaire. On pourrait peut-être faire avec une seule. Mais, là encore, sans fichier, difficile de t'en dire plus...
bonsoir thauthème,
j'ai trouvé!
l'anomalie vient bien du peu d'écritures qu'il y a dans l'onglet ENCOURS
je m'explique :
quand il y a une dizaine d'écritures, la fenêtre déroulante s'affiche au milieu de l'écran et elle reste accessible pour le choix d'une ligne.
Si tu essaies de rajouter une 50taine de lignes dans cet onglet tu verras la fenêtre s'affiche vers le bas parfois à moitié et ensuite elle disparait complètement vers le bas et elle est inaccessible!
Quand tu mets le son actif, tu entends la sonnerie de la cellule inaccessible!
Comme je travaillais pendant la nuit et que j'avais coupé le son pour ne déranger personne, je n'ai pas fait gaffe tout de suite.
En fait de blocage, c'est qu'il attendait un choix qui ne venait pas!
Comment donc rendre cette fenêtre visible (mais déplaçable dans le périmètre de l'écran) quelle que soit la ligne sur laquelle porte la saisie ?
Ne faut-il pas modifier le userform show dans le selectionchange ?
merci de ton aide
cdt
sam
Bonjour,
Dans le code d'initialisation de l'UserFom supprime les trois dernières lignes :
Me.StartUpPosition = 0 'définit la position d'ouverture par défaut de l'UserForm
Me.Left = ActiveCell.Left 'définit la position horizontale
Me.Top = ActiveCell.Top + 100 'définit la position verticale
Du coup l'Userform s'ouvrira systématiquement au centre de l'écran...
bonjour
grand merci à thauthème pour ton aide et ton assistance efficace
à + sur le forum pour d'autres questions
ps. j'avance grâce à toi, grâce au forum, dans l' apprentissage et mes connaissances de vba
bien cordialement
sam
bonsoir,
ThauThème a écrit :,
quant à la seconde UserForm elle n'est pas forcément nécessaire. On pourrait peut-être faire avec une seule....
J'ai essayé de le faire mais sans succés!
-cas1/en fait j'ai modifié dans les 5 lignes de SelectionChange le if target.colum = 4
j'ai rajouté "or target.column = 2", ça c'est ok!
-cas2/ ensuite il faut modifier l'initialisation de l'userform :
je sais à peu prés faire : sauf qu'étant donné qu'il va y avoir 2 initialisations je n'ai pas trouvé le moyen de les différencier
(j'ai essayé avec target.column = 2 ou 4 mais ça plante sur userform show dans SelectionChange !)
-cas3/ enfin modifier l'exploitation de la table : même problème pour séparer les 2 cas.
Selon toi, dans le cas1, le discriminant est le target.column, quels seraient-ils dans les cas 2 et 3
merci pour ton aide
cdt
sam
Bonjour Sam, bonjour le forum,
• Dans le module [Module3], en première ligne, déclare une variable publique du type :
Public CAS As Byte
• Ensuite dans la macro événementielle SelectionChange (tu adapteras...) :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'affiche l'UserForm1 si la cellule sélectionnée est seule,se trouve en colonne 2 (=B)
'et dans une une ligne supérieure à 5
If Target.Column = 2 And Target.Row > 5 And Selection.Cells.Count = 1 Then CAS = 1: UserForm1.Show
If Target.Column = 4 And Target.Row > 5 And Selection.Cells.Count = 1 Then CAS = 2: UserForm1.Show
End Sub
• Pour finir a l'initialisation de l'UserForm :
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim L As Worksheet 'déclare la variable L (onglet Liste)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
If CAS = 1 Then
Set L = Worksheets("LISTES") 'définit l'onglet L
TV = L.Range("A2:D" & L.Range("A" & Application.Rows.Count).End(xlUp).Row) 'définit le tableau des valeurs TV
Me.ListBox1.ColumnCount = 4 'définit le nombre de colonne de la ListBox1 (4 colonnes de 0 à 3)
Me.ListBox1.ColumnWidths = "40;40;120;130" 'définit la taille des colonnes de la ListBox1
Me.ListBox1.List = TV 'alimente la ListBox1
End If
If CAS = 2 Then
'nouvelles conditions
End If
End Sub
Éventuellement modifier aussi l'événement Click de la ListBox1 avec, là aussi deux conditions CAS = 1 et CAS = 2.
Ça devrait fonctionner...