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

24fichier-test.xlsm (21.30 Ko)

bonjour,

Voir l'exemple en annexe.

bon courage.

30fichier-test.xlsm (21.01 Ko)

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 :

24sam-v01.xlsm (29.97 Ko)

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

Bonjour le fil, bonjour le forum,

Une version 02 avec une UserForm...

51sam-v02.xlsm (25.04 Ko)

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...

Rechercher des sujets similaires à "questions listes deroulantes"