Récupération données sélectionnées dans listbox
Bonjour le Forum
Je cherche à récupérer certaines données d'une ligne que j'aurai sélectionné dans un "ListBox" et les affichées dans plusieurs "TextBox"
Par la même occasion comment puis-je faire pour agrandir la hauteur de la ligne des titres du "ListBox"
J'ai placé en pèce jointe le fichier
D'avance merci pour votre aide et votre disponibilité
Bonjour,
Je voudrais faire une petite remarque : je crois que tu désires positionner correctement ton UserForm INVEST avec les fonctions Me.Left et Me.Top
Mais en ce qui me concerne, sur mon ordinateur, cet UserForm n'est que partiellement visible, ce qui est bien gênant c'est que les boutons qu'il contient et que tu as positionnés à droite, on ne les vois pas
De plus les valeurs obtenues avec Me.left et Me.Top sont toutes deux négatives !!!
Ceci n'est pas trop grâve si ce n'est que je dois déplacer l'UserForm pour accéder aux boutons
Pour la suite je vais regarder de plus pres
Bonjour Jacky
Merci pour ta remarque et pour ton aide
Avec les fonctions Me.Left et Me.Top que j'utilise tout le temps mes Userforms sont toujours centrés milieu d'écran quelque soit le pC
Bien sûr, mais pour moi cela ne convient pas car j'ai un écran de 971pts et ton formulaire a une largeur de 192,5 pts, donc il me manque toute la partie droite dépassant la largeur de mon écran.
Je ne crois pas être le seul a avoir un écran de cette taille.
Personnellement j'adapte mes formulaires aux tailles des différents écrans des utilisateurs apres avoir relevé leurs dimensions. Mais évidemment il me faut agencer ce formulaire en fonction des dimensions trouvées et surtout positionner correctement tous les contrôles à l'intérieur de ce formulaire.
Voici comment je fais :
1) je crée un Module dans lequel j'écris une fonction qui me dimensionnera les objets concernés
Function presentation(form, w, h, t, g)
With form
.Width = w
.Height = h
.Top = t
.Left = g
End With
End Function2) A l'activation de mon formulaire je détermine d'abord ses dimensions et sa position, dans l'exemple je lui ai donné les dimensions de mon écran et ai choisi des valeurs pour Top et Left. Ensuite je fais de même pour chacun de mes contrôles en calculant leurs valeurs de Left, Top, Widht, Height en fonction de la largeur l et de la hauteur h de mon écran, et surtout en fonction de ce que je veux voir
Certes c'est un peu plus complexe mais ça a la qualité de te construire un formulaire très proprement, quel que soit l'écran utilisé.
Private Sub UserForm_Activate()
l = Application.Width ' largeur en points de la fenêtre
h = Application.Height ' hauteur en points de la fenêtre
With Menu
' agencement du Formulaire "Menu" et de ses objets
Call presentation(Mon_formulaire, l, h, -20, 0)
Call presentation(Titre, 4 * l / 10, 35, h / 10, 3.5 * l / 10)
Call presentation(Image1, 5 * l / 10, 2 * h / 4, h / 4, 3 * l / 10)
etc.....
End WithA toi de voir
Je reste à ta disposition
Merci pour ton explication
Honnêtement je ne comprends pas trop bien
Aurais tu, stp, un exemple fichier?
D'avance merci
Voici un fichier exemple
En accédant au code du Formulaire, ammuses toi à modifier, dans les lignes ci dessous, les valeurs de Widht, left, Height et Top des différents Controls.
En sachant que l est la largeur et h la hauteur de l'écran sur lequel le fichier est utilisé, d'après ma première ligne ci dessous le Formulaire aura les dimensions de mon écran. Si tu modifies le l et le h l'écran sera de taille différentes mais surtout ne donne pas de valeurs supérieures à l ou à h sinon tu auras le problème que j'ai avec ton fichier
Call presentation(Usf_Menu, l, h, -20, 0)
Call presentation(Titre, 4 * l / 10, 35, h / 10, 3.5 * l / 10)
Call presentation(Image1, 5 * l / 10, 2 * h / 4, h / 4, 3 * l / 10)
Call presentation(Bt_Quitter, l / 10, h / 14, 7.5 * h / 10, 12 * l / 14)
Un petit truc en plus
Regardes le control "Quitter" dans le formulaire, lors de sa construction, est en haut à drote et est gtrès haut.
Avec le code suivant :
Call presentation(Bt_Quitter, l / 10, h / 14, 7.5 * h / 10, 12 * l / 14)il se positionne en bas à droite et a une hauteur normale
Encore moi,
Encore un conseil : tu as tout intérêt à donner un nom à tes controles, en effet j'ai eu quelques difficultés à trouver tes ComboBox, quel est le ComboBox 1, quel est le combobox 2 etc ..., même chose pour les textBox
Enfin ce n'est qu'un simple conseil
Ensuite
ComboBox4.List = F.Range("A2:A" & F.Range("A65536").End(xlUp).Row).Valueest dépassé, je te conseille d'écrire
Cells(Rows.Count, 1).End(xlUp).Row
plutôt que
Range("A65536").End(xlUp).Row)pour aller chercher la dernière cellules de la colonne A
J'espère ne pas trop t'indisposer avec toutes mes remarques
Evidemment je reste à ton entière disposition pour la suite
Hello,
Il me semble qu'il y a des erreurs dans le classeur initial :
1 - Les cellules N74:078 dans INVEST sont en erreur #REF!
2 - Dans la procédure ConboBox1.Click() tu fais :
Set RngFiltre = WsD.[A1].CurrentRegion.Offset(1) .Resize(WsF.[A1].CurrentRegion.Rows.Count - 1)Cela te sélectionne l'ensemble des lignes de la feuille INVEST , j'aurais plutôt mis :
Set RngFiltre = WsF.[A1].CurrentRegion.Offset(1).Resize(WsF.[A1].CurrentRegion.Rows.Count - 1)Pour récupérer la ligne sélectionnée utiliser l'événement AfterUpdate de la ListBox.
Plutôt que d'utiliser une ListBox j'aurais utilisé une ListView qui permet de redimensionner les colonnes , formater les noms dans les entêtes de colonnes etc...
Ami calmant, J.P
Re bonjour,
Je ne sais pas sii tu suis toujours ton post !!
J'ai adapté ton UserForm de façon à ce qu'il apparaisse dans son intégralité quelle que soit la taille de l'écran de l'utilisateur
N'ayant actuellement qu'un seul écran je n'ai pas vérifier sur un écran de plus grande taille que le mien.
Si mes interventons t'intéressent toujours, dis moi ce que cela donne sur ton écran et ensuite si tu le désires je répondrai à tes autres questions
Cordialement
Bonjour Jacky ,Jurassic Pork et le Forum
Je suis là Malade mais bien là
Jacky ton fichier une fois exécuter ma planter le PC (lorsque j'ai voulu déplacer le formulaire d'un écran vers un autre) mais j'ai bien compris l'exercice
Je rajoute une commande non modal au lancement de mes formulaires
Jurassic Pork merci pour le signalement des erreurs mais les tableau va être complètement remplacer
Je cherche à sélectionner une seule ligne de mon premier filtre dans la "ListBox", et faire apparaitre certaines données dans les "TexteBox" de la première ligne de la "Frame1"
"TextBox1" = col E "TextBox2" = col F "TextBox3" = col G "TextBox4" = col H "TextBox5" =col N "TextBox6" = col O de la ligne sélectionnée
Dans le fichier
Cas n°1 j'ai un devis qui corresponds à l'articles, je remplis les objets de la ligne 2 "Frame1" et je lance "CommandButton1" qui doit aller remplir la ligne du tableau correspondante
Cas n°2 je dois créer une ligne supplémentaire, mais je vais devoir imputer une ligne existante
Je sélection la ligne que je veux imputer dans la "ListBox" je lance "CommandButton2" qui me fait apparaître les "Frame 2 et 3"
Je saisis les données à imputer et j'active "CommandButton3" pour la création d'une nouvelle ligne (à créer juste en dessous de la ligne sélectionnée en "Frame1" et imputer la ligne d'origine
Désolé Jurrasic Pork je n'avais pas vu ton dernier post
As-tu un fichier stp?
Bonjour,
En espérant que ce ne soit pas trop grave je te souhaite un prompt rétablissement
ton fichier une fois exécuter ma planter le PC (lorsque j'ai voulu déplacer le formulaire d'un écran vers un autre)
bien sûr, quand tu ouvres le fichier sur l'écran 1 il prend les dimensons de cet écran et si tu le transmets sur ub autre écran il conserve les dimmensions de l'écran 1 qui ne correspondent pas à celles du nouvel écran et réciproquement
Pour la suite je vois que Jurrasic Pork te fais des propositions intéressantes donc je te laisse travailler avec lui
Toutefois au cas où ....... je suis toujours disponible
Réponse à la question initiale de la discussion (je n'interviendrai plus ici car cela commence à dériver) :
Private Sub ListBox1_AfterUpdate()
TextBox1.Text = ListBox1.List(ListBox1.ListIndex, 4)
TextBox2.Text = ListBox1.List(ListBox1.ListIndex, 5)
TextBox3.Text = ListBox1.List(ListBox1.ListIndex, 6)
TextBox4.Text = ListBox1.List(ListBox1.ListIndex, 7)
TextBox5.Text = ListBox1.List(ListBox1.ListIndex, 13)
TextBox6.Text = ListBox1.List(ListBox1.ListIndex, 14)
End SubAmi calmant, J.P
Bonjour Le Forum
Bonjour Jacky, Bonjour Jurassic Pork
Merci pour votre coup de main
Je sui désolé j'ai bien trouvé comment faire pour créer une "Listview"
Je ne demandais pas à ce qu'on créé mon fichier de A à Z
Quand je demande un fichier c'est juste avec un exemple afin que je décortique moi-même ce qui m'a été proposé, c'est ma façon d'apprendre
Merci beaucoup pour votre aide et vos remarques
Bonjour Eole,
merci pour ce retour,
Quand je demande un fichier c'est juste avec un exemple afin que je décortique moi-même ce qui m'a été proposé, c'est ma façon d'apprendre
je l'avais très bien compris et je trouve que c'est très honnête de ta part de procéder ainsi
Pour ce que je t'ai proposé ce n'était qu'une simple idée à prendre ou à laisser, quand à la suite de ta question je n'y ai absolument pas répondu, désolé
Bon courage et au plaisir
Hello,
Bon comme c'est demandé gentiment plutôt que de mettre un classeur, je vais expliquer comment utiliser une ListView à la place d'une ListBox pour que cela profite à tout le monde.
1 - Dans le Initialize du formulaire on initialise les propriétés de la ListView et ses colonnes (avec les titres et les largeurs).
Dim colw, c, ColName
colw = Array(35.4, 39, 39.6, 54, 39.6, 34.8, 28.2, 170.4, 77.4, 35.4, 36, 70, 66, 92.4, 48, 51.6, 70, 39.6)
ColName = WsD.[A1].CurrentRegion.Rows(1).Value
With ListView1
.View = lvwReport
.CheckBoxes = False
.FullRowSelect = True
.Gridlines = True
.ListItems.Clear 'Ici
.ColumnHeaders.Clear 'Ic
For c = 1 To UBound(ColName, 2)
With .ColumnHeaders
' .Add , , ColName(1, c), 70
.Add , , ColName(1, c), colw(c - 1)
End With
Next c
End With
L' astuce pour avoir les bonne largeurs de colonne c'est dans un premier temps d'utiliser la ligne qui met une largeur fixe de 70 (celle qui est en commentaire), de lancer le formulaire, de régler les largeurs de colonne et de double-cliquer sur la listView sachant qu'on a la procédure du double-clic :
Private Sub ListView1_DblClick()
Dim i, colw
For i = 1 To ListView1.ColumnHeaders.Count
colw = colw + Replace(CStr(ListView1.ColumnHeaders.Item(i).Width), ",", ".") + ","
Next i
Debug.Print colw
End SubOn récupère ce qui est affiché dans la fenêtre d'exécution et on le met dans la ligne qui initialise le colw ( colw = Array())
Pour charger les données dans la ListView on utilise cette procédure :
Private Function RemplirLV2D(mylistView, arr) As Boolean
Dim i As Integer
Dim j As Integer
mylistView.ListItems.Clear
For i = LBound(arr, 1) To UBound(arr, 1) - 1
mylistView.ListItems.Add , , arr(i, 1)
For j = LBound(arr, 2) + 1 To UBound(arr, 2)
mylistView.ListItems(i).ListSubItems.Add , , arr(i, j)
Next j
Next i
End Functionqu'on appelle comme ceci :
Set RngFiltre = WsF.[A1].CurrentRegion.Offset(1).Resize(WsF.[A1].CurrentRegion.Rows.Count - 1)
Dim arr
arr = RngFiltre.Value
RemplirLV2D Me.ListView1, arret pour remplir les textbox quand on sélectionne une ligne de la ListBox on utilise l'événement ItemClick
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
Dim RowIndex
RowIndex = Item.Index
TextBox1.Text = Item.SubItems(4)
TextBox2.Text = Item.SubItems(5)
TextBox3.Text = Item.SubItems(6)
TextBox4.Text = Item.SubItems(7)
TextBox5.Text = Item.SubItems(13)
TextBox6.Text = Item.SubItems(14)
End SubAmi calmant, J.P
Bonjour Le Forum
Bonjour Jacky, Bonjour Jurassic Pork
Alors le sujet n'était pas clot
Un grand merci à vous deux
c'est grâce à vous que j'ai progressé ces derniers jours
Merci beaucoup
