alimentation listbox avec variable i

kwakos

XLDnaute Occasionnel
Bonjour à tous !!!!
Quel beau temps n'est-il pas ? :cool:

Ca donne envie de se pencher un peu sur du code Vb plutôt que d'aller se promener dans les rues de la Capitale... ;)

Bon voici moi nouveau problème
sur ma feuille 1 qd je double clique j'ouvre une listbox1. Cette listbox doit être alimenter à partir d'une feuille 2.
Si la cellule double cliquée est A1 ou A2 ou A3 etc... (dans la 1ere colonnne) je voudrais qu'elle appelle ma liste en feuille 2 C2:C10
Si la cellule double cliquée est C1 ou C2 ou C3 etc... (dans la 3eme colonnne) je voudrais qu'elle appelle ma liste en feuille 2 E2:E10
Etc...
J'ai déjà écrit ça mais y a un bug... :confused: (bon je suis un peu novice alors ne me lancez pas de tomates :p)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Byte
i = ActiveCell.Columns.Count
ComboBox1.List = Worksheets("Feuil2").Range(Cells(2, i + 2) & ":" & Cells(10, i + 2)).Value
With ComboBox1
.Clear
.Left = ActiveCell.Left
.Top = ActiveCell.Top
.Visible = True
.Activate
.DropDown
End With
End Sub

Mais ou qu'est-ce qu'il est donc que ce problème ??? :mad: pas dormi...

Merci d'avance à tous ceux qui se pencheront sur mon prob

A tte

kwakos
 

john

XLDnaute Impliqué
Re : alimentation listbox avec variable i

Bonjour,

Voilà une solution à ton problème fait en 2 minutes :eek:)

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Byte
i = ActiveCell.Column
ComboBox1.Clear
Select Case i
Case 1
For x = 2 To 10
ComboBox1.AddItem Worksheets("Feuil2").Range("C" & x).Value
Next x
Case Else
For x = 2 To 10
ComboBox1.AddItem Worksheets("Feuil2").Range("E" & x).Value
Next x
End Select

With ComboBox1
.Left = ActiveCell.Left
.Top = ActiveCell.Top
.Visible = True
.Activate
.DropDown
End With
End Sub

Bonne journée à toi.

John
 

john

XLDnaute Impliqué
Re : alimentation listbox avec variable i

Voici le même code modifié mais avec un contrôle sur i à savoir si i = 1 ou 3 et également pour remplir la cellule avec la valeur que tu vas sélectionner dans la liste

Private Sub ComboBox1_Change()
ActiveCell.Value = ComboBox1.Value
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Byte
i = ActiveCell.Column
If i = 1 Or i = 3 Then
ComboBox1.Clear
Select Case i
Case 1
For x = 2 To 10
ComboBox1.AddItem Worksheets("Feuil2").Range("C" & x).Value
Next x
Case 3
For x = 2 To 10
ComboBox1.AddItem Worksheets("Feuil2").Range("E" & x).Value
Next x
End Select

With ComboBox1
.Left = ActiveCell.Left
.Top = ActiveCell.Top
.Visible = True
.Activate
.DropDown
End With
Else
ComboBox1.Visible = False 'ici je cache le combobox vu que i est <> 1 et de 3
End If
End Sub

John
 
Dernière édition:

kwakos

XLDnaute Occasionnel
Re : alimentation listbox avec variable i

Re tout le monde

Le code marche bien, mais ca ne fait pas exactement ce que je souhaite

En fait les données ont un peu changées

mon code est maintenant,

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Byte
i = Target.Column
ComboBox1.List = Worksheets("Feuil2").Range(Cells(2, 2 * i), Cells(10, 2 * i)).Value
With ComboBox1
.Left = ActiveCell.Left
.Top = ActiveCell.Top
.Visible = True
.Activate
.DropDown
End With
End Sub

Le problème je l'ai repéré, il n'accepte pas que je fasse intervenir une autre feuille que la feuille ou se fait le double clic.
si je remplace par

ComboBox1.List = Range(Cells(2, 2 * i), Cells(10, 2 * i)).Value

ca marche impec'

Comment se fait-ce ??? :D

Je joint un fichier pour + de compréhension

Merci à tous !!!
 

Pièces jointes

  • MALISTBOX.xls
    38.5 KB · Affichages: 112
  • MALISTBOX.xls
    38.5 KB · Affichages: 124
  • MALISTBOX.xls
    38.5 KB · Affichages: 119

john

XLDnaute Impliqué
Re : alimentation listbox avec variable i

Voilà, mais tu n'avais pas parlé de la colonne B voilà pourquoi je ne l'avais pas prise en compte.

Private Sub ComboBox1_Change()
ActiveCell.Value = ComboBox1.Value
ComboBox1.Visible = False
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Byte
i = ActiveCell.Column
If i >= 1 and i <= 3 Then
ComboBox1.Clear
Select Case i
Case 1
For x = 2 To 4
ComboBox1.AddItem Worksheets("Feuil2").Range("B" & x).Value
Next x
Case 2
For x = 2 To 7
ComboBox1.AddItem Worksheets("Feuil2").Range("D" & x).Value
Next x
Case 3
For x = 2 To 17
ComboBox1.AddItem Worksheets("Feuil2").Range("F" & x).Value
Next x
End Select

With ComboBox1
.Left = ActiveCell.Left
.Top = ActiveCell.Top
.Visible = True
.Activate
.DropDown
End With
Else
ComboBox1.Visible = False 'empêche l'affichage de la combobox si on clique sur une autre colonne que A,B ou C
End If
End Sub
 

Pièces jointes

  • MALISTBOX.xls
    34 KB · Affichages: 107
  • MALISTBOX.xls
    34 KB · Affichages: 112
  • MALISTBOX.xls
    34 KB · Affichages: 116
Dernière édition:

kwakos

XLDnaute Occasionnel
Re : alimentation listbox avec variable i

Re le forum, John

Merci pour ta solution John, mais je voudrais la rendre évolutive, je m'explique + clairement, je veux au fur et à mesure pouvoir remplir d'autres catégories en feuille 2 et les faire apparaitre en listbox sur la feuille 1 de la meme facon que les 3 en démo sur le fichier excel...
c'est pour cela que j'avais fait appel à ma variable i = activecell.column (ou target.column)

serait il possible de modifier ton code pour celà ?

Merci encore à toi John
j'y travaille aussi dans mon coin

A+
 

john

XLDnaute Impliqué
Re : alimentation listbox avec variable i

Voilà il suffisait de demander :eek:

Et j'ai adapté le code comme ça il est évolutif et en plus il est encore plus cours qu'auparavant.

John
 

Pièces jointes

  • MALISTBOX.xls
    38.5 KB · Affichages: 121
  • MALISTBOX.xls
    38.5 KB · Affichages: 126
  • MALISTBOX.xls
    38.5 KB · Affichages: 129
Dernière édition:

kwakos

XLDnaute Occasionnel
Re : alimentation listbox avec variable i

Mais juste par curiosité, sais tu pourquoi ma formule ne marchait pas ? pourquoi n'est-il pas possible de faire intervenir la range d'une autre feuille sur un listbox ?

Merci encore
 

john

XLDnaute Impliqué
Re : alimentation listbox avec variable i

En fait tu ne peux pas encoder directement comme ceci dans une listbox ou une combobox :

ComboBox1.List = Range(Cells(2, 2 * i), Cells(10, 2 * i)).Value

Tu dois absolument le faire avec la commande addItem !!!!

de cette façon : ComboBox1.AddItem Worksheets("Feuil2").Cells(cpt, i * 2).Value

John
 
Dernière édition:

jms31

XLDnaute Junior
Re : alimentation listbox avec variable i

Bonjour à tous,
une petite précision/correction,
on peut initialiser la liste du combo directement par une plage (range)
Code:
ComboBox1.List = Range(Cells(2, 2 * c), Cells(10, 2 * c)).Value  -> marche
par contre si le combo est directement sur une feuille pour je ne sais quelle raison on ne peut pas faire référence à une plage d'une autre feuille. Alors que si le combo est sur une Userform ça marche.
Mais là encore il y a une subtilité c'est que le Range doit être exprimé dans le mode [A1] et non pas LC.
Code:
UserForm1.ComboBox1.List = Range(Cells(2, 2 * c), Cells(10, 2 * c)).Value --> ça marche
UserForm1.ComboBox1.List = Worksheets("Feuil2").Range(Cells(2, 2 * c), Cells(10, 2 * c)).Value --> ça plante
UserForm1.ComboBox1.List = Worksheets("Feuil2").Range(Chr(64 + 2 * c) & "2:" & Chr(64 + 2 * c) & "10").Value --> ça marche

Il est malgré tout possible d'initialiser très simplement un combo d'une feuille par une liste d'une autre feuille en utilisant la propriété ListFillRange (il faut l'initialiser avec une adresse de plage sous forme de chaine de caractères et non pas avec un Range.
Code:
ComboBox1.ListFillRange = "Feuil2!" & Range(Cells(2, 2 * c), Cells(10, 2 * c)).Address
 

deniooo

XLDnaute Occasionnel
Re : alimentation listbox avec variable i

Bonjour à tous les deux !

Je suis en train de regarder ton code, et il y a quelque chose que je ne pige pas, pourquoi mets-tu des chiffres devant les tata et autre toto ?
de même pourquoi une colonne sur deux ?

(c'est peut-être dans les besoins, j'ai peut-être pas tout bien lu)

(j'utilise ton code pour regarder comment se servire d'une combo box) !
 

john

XLDnaute Impliqué
Re : alimentation listbox avec variable i

deniooo ==> Ca je ne saurai pas te dire, le fichier que j'ai eu était comme ça donc j'ai continuer avec les mêmes conditions.

jms31 ==> effectivement on peut utiliser le .fillrange, voici mon code précédent modifié avec le .fillrange

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i, x, cpt As Byte

x = 1
Do
x = x + 1 ' je compte le nombre de colonne non libre dans la feuille 2 (attention il ne doit pas avoir de colonne vide)
Loop Until Sheets("feuil2").Cells(1, x).Value = ""
nbr_colonne = x - 1 'j'enlève 1 sinon je compte une colonne vide
i = ActiveCell.Column
If i >= 1 And i <= (nbr_colonne / 2) Then 'ici je fais un test afin de ne pas afficher la liste dans les colonnes non concernées
x = 1
Do
x = x + 1 'ici je compte le nombre de ligne utilisée, je sais qu'il y a encore plus simple, mais bon ...
Loop Until Sheets("feuil2").Cells(x, i * 2).Value = ""
' ici j'ai fais la modification avec le .fillrange, j'ai testé ça marche impéccablement, ça a réduit mon code de plusieurs lignes de code
ComboBox1.ListFillRange = "Feuil2!" & Range(Cells(2, 2 * i), Cells(x - 1, 2 * i)).Address
With ComboBox1
.Left = ActiveCell.Left
.Top = ActiveCell.Top
.Visible = True
.Activate
.DropDown
End With
Else
ComboBox1.Visible = False
End If
End Sub

John

Ps: le problème avec .fillrange, on ne sait pas faire combobox1.clear, donc quand on change de colonne il reste une trace de texte de la dernière colonne sélectionnée, dommage...
 
Dernière édition:

jms31

XLDnaute Junior
Re : alimentation listbox avec variable i

Bonjour John et le forum

Je n'avais pas vu ton soucis sur le combobox1.clear et le week-end est passé dessus .... Tu l'as peut être résolu depuis.
Sinon au cas où et pour que la précision soit donnée, il faut effectivement remettre la propriété "ListFillRange" à vide avant de faire le "clear" puis réinitialiser ListFillRange avec la bonne plage de valeur
Code:
ComboBox1.ListFillRange = ""
ComboBox1.Clear
ComboBox1.ListFillRange = "Feuil2!" & Range(Cells(2, 2 * i), Cells(x - 1, 2 * i)).Address
 

Discussions similaires

Statistiques des forums

Discussions
312 677
Messages
2 090 807
Membres
104 671
dernier inscrit
Guilbry