Liste déroulante "préremplie"
Bonjour,
J'ai un fichier excel qui me sert de base pour chiffrer une partie de mes affaires.
J'ai plusieurs onglets dont un qui s'appelle "à completer" et un qui s'appelle "base de données élément"
Dans l'onglet base de données, j'ai un tableau avec mes différents éléments, par exemple :
- > sonde de température extérieure,
- > sonde de température en gaine,
- > sonde de pression
- > ventilateur TOR
- > ventilateur régulé
J'ai en tout 170 entrées.
Sur mon onglet "à compléter" j'ai un tableau dans lequel je renseigne chaque élément que j'ai dans mon projet + d'autres données.
J'ai fait une liste déroulante de choix sur la désignation de l'élément qui a comme base la colone de mon onglet "base de données".
Mais c'est long de faire défiler mes 170 éléments pour trouver le bon !
Comment faire pour que quand je tape "Sonde de température" dans mon onglet à compléter ma liste déroulante ne me mette pas une erreur mais me propose tous les éléments commençant par "sonde de température" ?
D'avance merci pour votre aide.
Bonjour,
A voir,
Cela aurait été mieux sans lignes vides dans les désignations
Merci,
Les lignes vides sont pour des ajouts futurs à la base, pour conserver la base "rangée". Bon après si ça doit poser un vrai soucis, je peux m'arranger pour la condenser un peu dans les prochains jours... J'ai pas mal de capteurs à ajouter...
L'idée est là, mais j'aimerai que ça le fasse sur tout :
Je rentre : Thermostat, ça me filtre tous les thermostats de la liste
Ventilateur -> filtre tous les ventilateurs de la liste.
etc
En bref, ça me propose un filtre sur le début de ce que je tape :
S -> tout ce qui commence par S
Son -> tout ce qui commence par Son
Vent -> tout ce qui commence par Vent
Et ça affine au fur et à mesure que je tape.
Au départ je faisais remplir à mes chargés d'affaire le fichier en entrant le "ID Element" mais c'était un peu trop barbare pour eux. C'est pour cela que je souhaite trouver un moyen de fonctionner sur "désignation"
Est-ce possible ?
Bonjour le fil, bonjour le forum,
Une autre approche sans liste de validation de données et avec une UserForm de recherche. Sélectionne une cellule de la colonne C pour ouvrir cette UserForm. Tape le texte recherché dans la Textbox1. Au fur et à mesure de l'édition, la Listbox1 affiche la liste des articles commençants par le texte édité. Si la ListBox1 se vide c'est que le texte recherché n'existe pas... Il te suffit ensuite de sélectionner, dans la Listbox1, l'élément que tu veux inscrire dans la cellule active...
La touche [Échap] permet de fermer l'UserForm sans être obliger de cliquer sur sa croix en haut à droite...
Le code de l'onglet A compléter :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row = 1 Or Target.Row > ListObjects("Tableau10").ListRows.Count + 1 Then Exit Sub 'si la cellule sélectionnée se trouve dans la ligne 1 ou en dehors du tableau, sort de la procédure
If Target.Column <> 3 Or Selection.Cells.Count > 1 Then Exit Sub 'si la cellule active ne se trouve pas dans la colonne 3 (=C) ou si plusieurs cellules sélectionnées, sort de la procédure
UserForm1.Show 'affiche l'UserForm1
End Suble code de l'UserForm :
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim O As Worksheet 'déclare la variable O (Onglet)
Set O = Worksheets("Base données éléments") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
End Sub
Private Sub TextBox1_Change() 'au changement dans la TextBox1
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Me.ListBox1.Clear 'vide la ListBox1
If Me.TextBox1.Value = "" Then Exit Sub 'si la Textbox1 est effacée, sort de la procédure
K = 1 'initialise la variable K
For I = 2 To NL 'boucle sur toutes les lignes I du tableau des valeurs TV
If TV(I, 1) <> "" Then 'condition 1 : si la donnée ligne I colonne 1 de TV n'est pas vide
'condition 2 : si le texte édité dans la TextBox1 (converti en majuscule) correspond aux premiers caractères de la donnée (convertis en majuscule)
If UCase(Me.TextBox1.Value) = UCase(Left(TV(I, 1), Len(Me.TextBox1.Value))) Then
ReDim Preserve TL(1 To 1, 1 To K) 'redimensionne le tableau des lignes TL (1 ligne, K colonnes)
TL(1, K) = TV(I, 1) 'récupère dans la ligne colonne k de TL la donnée ligne I de TV =( Transposition)
K = K + 1 'incrémente la variable K (ajoute une colonne au tableau des lignes TL
End If 'fin de la condition 2
End If 'fin de la condition 1
Next I 'prochaine ligne de la boucle
If K > 1 Then 'condition 1 si K est supérieure à 1
If K = 2 Then ReDim Preserve TL(1 To 1, 1 To 2) 'si K est égale à 2, redimensionne TL pour permettre un affichage en ligne
Me.ListBox1.List = Application.Transpose(TL) 'alimente la Listbox1 avec le tableau TL transposé
End If 'fin de la condition
End Sub
Private Sub ListBox1_Click() 'au clic dans la Listbox1
With Me.ListBox1 'prend en compte la listbox1
ActiveCell.Value = .Column(0, .ListIndex) 'renvoie dans la cellule active la valeur de l'élément cliqué
End With 'fin de la prise en compte de la listbox1
Unload Me 'vide et ferme l'UserForm en cours
End Sub
Private Sub CommandButton1_Click() 'ce bouton est masqué derrière la Listbox1, sa propriété [Cancel] étant égale à [Vrai] permet de fermer l'userForm en cours avec la touche [Échap]
Unload Me 'vide et ferme l'UserForm en cours
End Suble fichier :
ça marche en effet,
Mais petit bémol : j'y connais rien en VBA... Est-ce que ça se met à jour automatiquement ? par exemple si j'ajoute des lignes, ça se passe comment pour la mise à jour de la sélection dans ta fonction VBA ?
Re,
C'est automatique. Mais le plus simple était de tester (en rajoutant des lignes) avant de poser la question, non ?
J'avais essayé en mettant hors du tableau.
Comme il est prévu que le fichier vive et pas que remplis par moi, va falloir que je sorte le fouet pour certains car c'est ce qui va se passer : ils vont pas augmenter le tableau mais écrire dessous...
Je les connais les zozos...
Merci dans tous les cas. Je vais sans doute revenir avec une autre question pour la partie synthèse derrière car j'ai pas réussi à faire ce que je veux
Bonjour Korentine, bonjour le forum,
Aucun problème ! La partie du code modifiée pour pouvoir s'en servir hors tableau :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row = 1 Then Exit Sub 'si la cellule sélectionnée se trouve dans la ligne 1, sort de la procédure
If Target.Column <> 3 Or Selection.Cells.Count > 1 Then Exit Sub 'si la cellule active ne se trouve pas dans la colonne 3 (=C) ou si plusieurs cellules sélectionnées, sort de la procédure
UserForm1.Show 'affiche l'UserForm1
End SubLe fichier V02 :