Userform : remplir plusieurs textbox à partir d'une combobox

Bonjour à tous,

Je suis en train d'apprendre à utiliser VBA et plus précisément le userform.

Ce que j'essaye d'accomplir, c'est de remplir différents textbox à partir de ma sélection combobox.

Mon code VBA récupère les données à partir d'une feuille Excel (qui pour le moment n'est pas très remplise mais qui ne tardera pas à l'être).

Vous verrez dans mon fichier que j'ai réussi à remplir les texbox mais ce que je n'arrive pas à faire c'est d'afficher les "bons" résultats.

Je peux afficher les "bons" résultats si je change le code :

Set C = .Find(Jeux, LookIn:=xlValues, lookat:=xlWhole)
If Not C Is Nothing Then
TrouverVentes = C.Offset(0, 2).Value

Donc changer le C.Offset pour avoir le résultat obtenu mais je compte avoir une liste de données exhaustives par la suite et aimerai avoir une solution à ce problème.

J'ai mis mon fichier ci-joint et je vous remercie pour votre aide.

455userform-vba.xlsm (28.86 Ko)

Bonjour pour la suite il suffira de faire une petite boucle qui incrémentera une variable de 1 à chaque fois. Cette variable prendra la place du 2 dans C.Offset(0, 2).Value ainsi vous vous déplacerez de façon automatique sur les colonnes...

Bonjour Patatedouce, Force rouge (c'est un jeu ou quoi ?....), bonjour le forum,

J'ai recodé différemment. Ça marche mais si je tape Fifa 13, l'userform ne peux afficher qu'une seule console pour la Nintendo alors qu'il y en a deux... Je pense que les Textboxes devraient être remplacées par de Comboboxes qui permettraient à l'utilisateur de choisir la bonne console. Plus généralement, mais ne sachant pas ce que tu veux exactement, je pense que l'utilisateur devrait choisir le jeu, puis la marque, puis la console et ainsi obtenir les ventes. Tout cela à l'aide de Comboboxes...

473patatedouce-v01.xlsm (27.86 Ko)
Force rouge a écrit :

Bonjour pour la suite il suffira de faire une petite boucle qui incrémentera une variable de 1 à chaque fois. Cette variable prendra la place du 2 dans C.Offset(0, 2).Value ainsi vous vous déplacerez de façon automatique sur les colonnes...

En faisant cela, il prendra uniquement les colonnes suivantes.

Ce que j'essaye de faire, c'est par exemple en sélectionnant fifa 13, j'aimerai que les texbox prennent les valeurs correspondantes en fonction de la console, la compagnie et les ventes si c'est possible.

eumcplx iqnryfn

C'est à dire remplir la texbox Ventes Sony : 10 et Console Sony : Playstation 3 au lieu de garder 2 et Wii.

Je ne sais pas si il y aurait un code (formule) exprès pour ça.

Merci de votre aide.

ThauThème a écrit :

Bonjour Patatedouce, Force rouge (c'est un jeu ou quoi ?....), bonjour le forum,

J'ai recodé différemment. Ça marche mais si je tape Fifa 13, l'userform ne peux afficher qu'une seule console pour la Nintendo alors qu'il y en a deux... Je pense que les Textboxes devraient être remplacées par de Comboboxes qui permettraient à l'utilisateur de choisir la bonne console. Plus généralement, mais ne sachant pas ce que tu veux exactement, je pense que l'utilisateur devrait choisir le jeu, puis la marque, puis la console et ainsi obtenir les ventes. Tout cela à l'aide de Comboboxes...

Merci beaucoup ThauThème pour toutes les explications sur le code !

J'avais complètement oublié les résultats avec plusieurs consoles..

Je garde les textbox car j'avais pour objectif d'être capable de modifier les valeurs des textbox (par exemple etre capable de modifier le nb de ventes).

Ce formulaire me permettra d'appuyer sur le bouton Submit qui enverra toutes les informations sur une feuille excel.

Salutation ThauThème, simple concours de circonstance...

patatedouce...Pour ma part, je suis plutôt "anti-userform" et je les évites au maximum car c'est joli et pratique quand ça fonctionne mais tous le contraire en cas de dysfonctionnement. Dans votre cas, qui s'approche de très près à une synthèse, un tableau croisé dynamique suffit amplement pour une approche statistique des ventes...Mais je ne suis pas inquiet pour le developpement de votre application, elle sera menée à bien grace à la participation des helpeurs d'ici.

Bonjour tout le monde,

Une autre méthode avec :

1 listbox

1 textbox

1 commandbutton

Que je trouve originale...

Fichier honteusement pompé à ThauTheme... Désolé

Clic sur le CommandButton1 de la feuille

Salutation pijaku , très original! je suis curieux de savoir qu'est-ce qui t'a donné envie de faire des controles flottants !

pijaku a écrit :

Bonjour tout le monde,

Une autre méthode avec :

1 listbox

1 textbox

1 commandbutton

Que je trouve originale...

Fichier honteusement pompé à ThauTheme... Désolé

Clic sur le CommandButton1 de la feuille

Merci à tous pour votre aide!

J'essaye de regarder ton fichier mais à vrai dire je ne comprends pas un mot.

Je vais regarder ça de plus près pour comprendre.

Bonjour,

@ ForceRouge :

je suis curieux de savoir qu'est-ce qui t'a donné envie de faire des controles flottants

J'en fait régulièrement.

L'explication est ici relativement logique.

patatedouce veut, sur l'userform, la liste de ses articles, et souhaite pouvoir les modifier.

Lorsque je travaille avec un UserForm, j'aime bien utiliser les bons contrôles pour les bonnes actions.

Ici, si on utilises des TextBox, il faut les créer de manière dynamique afin d'obtenir un résultat cohérent (ne pas oublier une marque, un modèle, ne pas avoir de TextBox vides, etc...). C'eut été ma seconde solution.

Comme il souhaite une "liste" de ses articles, il convient d'utiliser un contrôle de "liste". J'en voyais 2 qui puissent convenir :

  • le contrôle listview => écarté car compliqué à mettre en œuvre et pas "natif" directement sous VBA (contrôle supplémentaire)
  • la listbox.
Elle peut être multicolonne, ok, mais ne permet pas la saisie.

Qu'à cela ne tienne, un textbox et un commandbutton invisible feront office de saisie. Il suffit après de les "lier" à la listbox.

@patatedouce : Lors de l'utilisation de l'événement MouseUp de la listbox (lors du relâchement du clic de ta souris), tu disposes des paramètres X et Y qui sont les propriétés Left et Top de ton curseur.

Nous souhaitons, lors d'un clic sur la listbox, faire apparaitre notre textbox et le bouton, sous la bonne colonne de la liste, avec la bonne valeur dans le textbox.

Pour cela, il suffit de séparer les trois cas "Left" :

   Select Case X
      Case Is <= 100: 'première colonne de la listbox
      Case Is <= 200:  'seconde colonne de la listbox
      Case Is <= 300:  'troisièmee colonne de la listbox
   End Select

N'oublions pas que la listbox a été créée en trois colonnes de 98 de large (mais il y a une marge entre les colonnes que personne ne sait définir, pas même microsoft ).

Pour "envoyer" la valeur du textbox dans la listbox (commandbutton1_click), il faut au préalable avoir stocké le Left (paramètre X) quelque part. J'utilises pour ça la propriété Tag de notre textbox.

N'hésite pas en cas d'interrogations...

Salutation Pijaku, merci d'avoir pris quelques minutes pour m'espliquer!

Merci beaucoup pour ton aide et explication Pijaku!

Si cela ne te dérange pas, y a t-il moyen de copier la liste de l'userform directement dans une feuille excel lorsque je clique sur Submit?

J'ai essayé de mettre en place une procédure pour récupérer les valeurs de la liste mais j'arrive à prendre uniquement la première colonne de la liste (qui est la marque). je n'arrive pas à m'en sortir avec les différentes colonnes de la listbox.

Sub CopierFeuille()
Dim i As Long
For i = 0 To ListBox1.ListCount - 1
    Cells(i + 1, 1) = Me.ListBox1.List(i)
    Cells(i + 1, 2) = Me.ListBox1.List(Me.ListBox1.ListIndex, 1)(i)   <-- erreur avec l'ajout de (Me.ListBox1.ListIndex, 1)
    Cells(i + 1, 3) = Me.ListBox1.List(Me.ListBox1.ListIndex, 2)(i)   <-- de même
Next i
End Sub

De plus, en gardant que la première ligne

Cells(i + 1, 1) = Me.ListBox1.List(i)

cela remplace les données précédentes sur la feuille Excel, c'est-à-dire quand je choisis Fifa 13, il copie les 5 marques de la liste, mais quand je choisis Fifa 15, il remplace les 2 marques par dessus ma sélection Fifa 13.

Serait-il possible de passer à la ligne suivante si j'ai déjà effectué un Submit?

Si cela ne te dérange pas

Non, du tout. Sinon j'aurais simplement passé mon chemin

Pour enregistrer les valeurs dans la feuille, il va nous manquer un élément. Cela aurait été la même chose avec tes textbox. En effet, laisser la possibilité, à l'utilisateur, de modifier toutes les valeurs de la ligne ne permet pas la restitution à la bonne place.

Comment faire dans ce cas?

Tout simplement ajouter une 4ème colonne à la listbox, invisible (columnwidth = 0) et y stocker, lors de l'affichage des valeurs, le numéro de la ligne concernée.

Que te faut-il modifier?

1- UserForm_Initialize :

On y ajoute la quatrième colonne "invisible".

les deux lignes :

Me.ListBox1.ColumnCount = 3
Me.ListBox1.ColumnWidths = "98;98;98"

deviennent :

Me.ListBox1.ColumnCount = 4
Me.ListBox1.ColumnWidths = "98;98;98;0"

2- cboJeux_Click :

On stocke le numéro de la ligne dans la 4ème colonne de la listbox.

Me.ListBox1.List(ListBox1.ListCount - 1, 3) = i

Donc, au final ton code sera :

Private Sub cboJeux_Click()
Dim i As Integer
For i = 2 To UBound(TC, 1)
   If TC(i, 2) = Me.cboJeux.Value Then
         Me.ListBox1.AddItem TC(i, 1)
         Me.ListBox1.List(ListBox1.ListCount - 1, 1) = TC(i, 4)
         Me.ListBox1.List(ListBox1.ListCount - 1, 2) = TC(i, 3)
         Me.ListBox1.List(ListBox1.ListCount - 1, 3) = i
    End If
Next i
End Sub

3- Le code de cmdOK_Click :

Tout simplement :

Private Sub cmdOK_Click()
Dim i As Long, Lig As Long
For i = 0 To ListBox1.ListCount - 1
   Lig = CLng(Me.ListBox1.List(i, 3))
   Cells(Lig, 1) = Me.ListBox1.List(i)
   Cells(Lig, 3) = Me.ListBox1.List(i, 2)
   Cells(Lig, 4) = Me.ListBox1.List(i, 1)
Next i
End Sub

Tu vois, d'ailleurs, que dans ce code, tu as initialement voulu faire compliqué. La listBox se lit tout simplement ListBox1.List(i), ListBox1.List(i, 1), ListBox1.List(i, 2)...

A noter (1) : ListBox1.List(i) peut être remplacé par ListBox1.List(i, 0). Ceci permet de boucler sur la seconde dimension, sur les colonnes de la listbox. Cela peut parfois s'avérer fort utile.

A noter (2): ton erreur tenais dans le fait que tu voulais utiliser ListBox1.ListIndex. La propriété ListIndex des ListBox représente l'index sélectionné dans la liste.

EDIT : il convient également d'ajouter un ListBox1.Clear dans la procédure Private Sub cboJeux_Click() :

Private Sub cboJeux_Click()
Dim i As Integer
Me.ListBox1.Clear 'Efface le contenu précédent de la listbox
For i = 2 To UBound(TC, 1)
   If TC(i, 2) = Me.cboJeux.Value Then
         Me.ListBox1.AddItem TC(i, 1)
         Me.ListBox1.List(ListBox1.ListCount - 1, 1) = TC(i, 4)
         Me.ListBox1.List(ListBox1.ListCount - 1, 2) = TC(i, 3)
         Me.ListBox1.List(ListBox1.ListCount - 1, 3) = i
    End If
Next i
End Sub

Merci à toi encore une fois!

J'avais déjà ajouté le .clear, au moins quelquechose de compris .

J'ai un autre soucis avec le bouton submit.

Lorsque je clique sur submit, la liste est reportée sur une autre feuille Excel comme prévue mais prend en compte les cellules vides qui contiennent la sélection d'un autre jeu.

Par exemple, je choisis Fifa 15 et submit:

rfuegch

Ici, les lignes 2, 3, 4, 6 et 7 sont vides car elles contiennent la liste de jeu Fifa 13.

Serait-il possible de supprimer ces lignes vides lorsque je submit?

Je "submit" ces données dans une autre feuille Excel, pas dans la feuille jeux.

Je pensais que tu voulais une restitution dans la même feuille...

Du coup pas besoin de 4 colonnes...

Voici tout le code avec restitution dans la feuille "form" :

Private F As Worksheet, TC As Variant

Private Sub cboJeux_Click()
Dim i As Integer
ListBox1.Clear
For i = 2 To UBound(TC, 1)
   If TC(i, 2) = Me.cboJeux.Value Then
         Me.ListBox1.AddItem
         Me.ListBox1.List(ListBox1.ListCount - 1, 0) = TC(i, 1)
         Me.ListBox1.List(ListBox1.ListCount - 1, 1) = TC(i, 4)
         Me.ListBox1.List(ListBox1.ListCount - 1, 2) = TC(i, 3)
    End If
Next i
End Sub

Private Sub cmdOK_Click()
Dim Lig As Long
Dim Tb
Tb = ListBox1.List
Lig = Sheets("form").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1
Sheets("form").Range("A" & Lig).Resize(UBound(Tb, 1), UBound(Tb, 2)) = Tb
End Sub

Private Sub CommandButton1_Click()
   Select Case CDbl(TextBox1.Tag)
      Case Is <= 100: Me.ListBox1.List(Me.ListBox1.ListIndex) = TextBox1
      Case Is <= 200: Me.ListBox1.List(Me.ListBox1.ListIndex, 1) = TextBox1
      Case Is <= 300: Me.ListBox1.List(Me.ListBox1.ListIndex, 2) = TextBox1
   End Select
   Me.TextBox1.Visible = False
   Me.CommandButton1.Visible = False
End Sub

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If ListBox1.ListIndex = -1 Then Exit Sub
Dim Valeur As String, Lef As Double
   Select Case X
      Case Is <= 100: Valeur = Me.ListBox1.List(Me.ListBox1.ListIndex): Lef = Me.ListBox1.Left
      Case Is <= 200: Valeur = Me.ListBox1.List(Me.ListBox1.ListIndex, 1): Lef = 100
      Case Is <= 300: Valeur = Me.ListBox1.List(Me.ListBox1.ListIndex, 2): Lef = 200
   End Select
With Me.TextBox1
   .Value = Valeur
   .Visible = True
   .SetFocus
   .Move Lef, Me.ListBox1.Top + Me.ListBox1.Height
   .Tag = X
End With
With Me.CommandButton1
   .Visible = True
   .Move Lef + Me.TextBox1.Width, Me.TextBox1.Top
End With
End Sub

Private Sub UserForm_Initialize()
Dim D As Object, i As Integer
Me.ListBox1.ColumnCount = 3
Me.ListBox1.ColumnWidths = "98;98;98"
Me.ListBox1.Width = 300
Set F = Sheets("jeux")
TC = F.Range("A1").CurrentRegion
Set D = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(TC, 1)
    D(TC(i, 2)) = ""
Next i
Me.cboJeux.List = D.keys
Me.TextBox1.Visible = False
Me.CommandButton1.Visible = False
End Sub

Lorsque je clique sur submit, j'ai une erreur : Run-time error '91': Object variable or With block variable not set.

Quand je debug, il me montre le code :

Lig = Sheets("form").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1

As tu une feuille Sheets("form")?

pijaku a écrit :

As tu une feuille Sheets("form")?

Oui.

J'ai essayé de regarder le problème en rajoutant un set.

Set Lig = Sheets("form").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1

Et un autre message apparaît lorsque je clique submit.

Compile error : Object required

je t'ai mis le fichier ci-joint au cas où.

Tu n'as aucune donnée dans la feuille form. Pas même une ligne d'entête...

Donc, utilise :

    Private Sub cmdOK_Click()
    Dim Lig As Long
    Dim Tb
    Tb = ListBox1.List
    If Range("A1") = "" Then
      Lig = 1
    Else
      Lig = Sheets("form").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1
    End If
    Sheets("form").Range("A" & Lig).Resize(UBound(Tb, 1), UBound(Tb, 2)) = Tb
    End Sub
Rechercher des sujets similaires à "userform remplir textbox partir combobox"