XL 2019 Remplir une combobox avec une ligne

snoopy07

XLDnaute Occasionnel
Bonjour le forum

Je voudrais savoir si on peut remplir une combobox avec les valeur d une ligne
pour remplir ma combobox avec les valeurs dune colonne
j utilise le code suivant:

Private Sub userform_initialize()
Set Ws = Sheets("XXXX")
With Me.ComboBox1
For J = 3 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
Next J
End With
End Sub

je voudrais le modififier pour que ma combobox se remplise avec les valeurs de la ligne 2 de C3 a la derniere cellule vide

j ai trouver ce code sur un forum pour remplir la combobox

Private Sub ComboBox1_GotFocus()
Dim i As Range
With Sheets("xxxx")
Set i = .Range("C3:N3")
End With
ComboBox1.List = Application.Transpose(Range("C3:N3").Value)
End Sub



mais il ne fonctionne pas

je vous joint mon fichier modele

dans ce fichier il y a deux bouton
le bouton Ajouter valeur avec plusieur texbox marche mais le probleme c est qu il ya plusieur textbox 1 par colonne et la j ai pas tout mis les colonne a remplir
donc avec le bouton Ajouter valeur avec combobox et textbox je voudrais simplifier mon userfrom
juste avoir un combobox et un textbox

Quel code doit utiliser pour remplir la combobox?

Merci d'avance pour votre aide
Cordialement
Snoopy 07
 

Pièces jointes

  • W 11.xlsm
    29.9 KB · Affichages: 7

fanch55

XLDnaute Barbatruc
Bonjour,
Dans Module2 :
VB:
Sub Afficher2()
Dim Lcol As Range, Lrow As Range
  ' On définit la plage où se situent les données
    Set Lrow = Columns("A").Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
    Set Lcol = Rows(2).Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
    Set Data = Range("C3", Cells(Lrow.Row, Lcol.Column))
    
   ' On continue uniquement si la cellule selectionnée fait partie des données
    If Not Intersect(Selection, Data) Is Nothing Then
        UserForm2.Show
    Else
        MsgBox "vous n'avez pas sélectionné une cellule donnée", vbCritical
    End If
End Sub
Dans Userform2 :
VB:
Private Sub userform_initialize()
Dim Lcol As Range, Plage As Range
  ' dernière cellule non vide de la ligne sélectionnée
    Set Lcol = Rows(Selection.Row).Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
    Set Plage = Range("C" & Lcol.Row, Lcol)
    If Plage.Cells.Count > 1 Then
        ComboBox1.List = Application.Transpose(Plage.Value)
    Else
        ComboBox1.AddItem Selection.Value
    End If
    ComboBox1 = Selection
End Sub
 

snoopy07

XLDnaute Occasionnel
Bonsoir fanch55 et le forum

je te remercie pour ton aide et pour le temps que tu as passé
tes code marche bien
par contre il faut sélectionner une cellule de la ligne pour que l userfrom s ouvre sinon il y a la msgbox
qui s affiche
est ce qu il y a un code pour sélectionner la cellule C3 automatiquement a l ouverture de l userfrom

bonne soirée
Cordialement
Snoopy07
 

patricktoulon

XLDnaute Barbatruc
bonjour
jouer a cela va te poser des problème dans le futur développement de ce que tu veux faire avec ta combobox
ca pour moi c'est pas bon
VB:
If Plage.Cells.Count > 1 Then
        ComboBox1.List = Application.Transpose(Plage.Value)
    Else
        ComboBox1.AddItem Selection.Value
    End If
une combo elle a une colonne ou plus mais pas tantôt une tantôt plusieurs

perso je ne m'ennuie plus avec çà
je resize le .count plus 1 et je delete a reculons autrement dit
j'ai une plage de c3 à N (x)
je récupère le derlig avec le .en( xlup) d'une colonne
donc après
with combobox1
.list=range("c3:n" & derlig+1))
for i=.listcount-1 to 0
if .list(i,0)="" then .removeitem(i) else exit for
next
end with


et tu te soucis plus de la transposition
et tu a toutes tes colonnes même si tu n'a qu'une ligne et même si tu n'a que le .list(0,0) qui a une valeur
 

snoopy07

XLDnaute Occasionnel
Bonjour patricktoulon et le forum

merci pour ton aide

j ai supprimé ce qui est pas bon pour toi et je l ai remplacer par ce que a donne est cella ne marche pas

ca me met une erreur
Capture d’écran 2024-05-04 084356.png

je n arriver pas a la corriger je doit oublier quelque chose a quelques part

cordialement
Snoopy07
 

patricktoulon

XLDnaute Barbatruc
re
VB:
Private Sub UserForm_Initialize()
Dim derlig  As Long
    With ComboBox1
        derlig = Cells(Rows.Count, "C").End(xlUp).Row 'derniere ligne en colonne C  à partir de  la lig 3
        .List = [c3:N3].Resize(derlig + 1 - 2).Value'-2 par ce que l'on commence a la ligne 3
        .RemoveItem (.ListCount - 1)
    End With
End Sub
que tu aies une ligne ou plus, ta combo se remplira comme il se doit
 

snoopy07

XLDnaute Occasionnel
Rebonjour a tous

Je viens de corriger ma formule et ça marche pas comme je veux
quand j ouvre ma combobox elle m affiche que la colonne A alors que je voudrais que ça m affiche que les cellule de la ligne C de c3 a la dernière cellule vide de cette ligne
Capture d’écran 2024-05-04 103454.png


quand ma combobox affichera la ligne elle me permettra de sélectionner la colonne que je veux remplir a la textbox mais ca va etre une autre histoire a programmer

j y vais pas a pas

cordialement
Snoopy07
 

patricktoulon

XLDnaute Barbatruc
re
bon avec tes enoncé on comprend plus tellement ce que tu veux en fait
si tu veux que la ligne 3 de C à N
VB:
Private Sub UserForm_Initialize()Dim derlig  As Long
With ComboBox1
.List = [c3:N3].Resize(2).Value'-2 par ce que l'on commence a la ligne 3
.RemoveItem (.ListCount - 1)
End With
End Sub

et si tu veux voir toutes les colonnes il faut bien entendu déclarer son columncount sinon tu ne verra que la c3
donc

Code:
Private Sub UserForm_Initialize()
Dim derlig  As Long
    With ComboBox1
      .columncount=[c:n].columns.count
         .List = [c3:N3].Resize(derlig + 1 - 2).Value'-2 par ce que l'on commence a la ligne 3
        .RemoveItem (.ListCount - 1)
    End With
End Sub
après si c'est pas ça que tu veux
fait le ménage dans ta tête et explique nous clairement ce que tu veux intelligiblement
pas besoins d'être un pro du vba pour savoir ce que l'on veux ;)
 

snoopy07

XLDnaute Occasionnel
Bonjour patricktoulon et le forum

J ai essai tes deux dernier code

le premier marche mais il affiche que la C3

le deuxième m affiche une erreur d compilation
Capture d’écran 2024-05-05 100642.png


depuis le debut je demande que mon combobox affiche la ligne 3 de C a la derniere cellule vide de cette ligne
Cordialement
Snoopy 07
 

Valtrase

XLDnaute Occasionnel
Bonjour à tous,
Peut-être avec une petite fonction ? Dans le module du formulaire tu colles et adapte ce code :
VB:
Private Sub UserForm_Initialize()
    Me.ComboBox1.List = FillList()
End Sub

Private Function FillList(Optional ByVal Plage As Range, Optional ByVal Sh As Excel.Worksheet) As Variant
    If Sh Is Nothing Then Set Sh = ActiveSheet
    If Plage Is Nothing Then Set Plage = Sh.Range("C3")

    Dim LastColumn As Long
    LastColumn = Sh.Cells.Find(what:="*", after:=Sh.Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole, _
                               searchorder:=xlByColumns, SearchDirection:=xlPrevious).Column

    Dim entireRange As Excel.Range
    Set entireRange = Plage.Resize(, LastColumn - Plage.Column)
    Dim Tabtemp As Variant
    Tabtemp = Application.Transpose(Application.Transpose(entireRange.Value))

    FillList = Tabtemp
End Function
 

snoopy07

XLDnaute Occasionnel
Bonjour Valtrase et re a paticktoulon et le forum

Patrick ton code marche mais c est pas comme ca que je veux

Valtrase ton code marche comme je veux sauf qu il ne me remplie pas la dernière cellule remplie

Capture d’écran 2024-05-05 115738.png

Quelle partie du code doit on modifier pour qu il trouver la derniere cellule vide

Merci pour l aide et pour le temps passer a m aider

Cordialement
Snoopy 07
 

fanch55

XLDnaute Barbatruc
ca pour moi c'est pas bon
If Plage.Cells.Count > 1 Then
ComboBox1.List = Application.Transpose(Plage.Value)
Else
ComboBox1.AddItem Selection.Value
End If
une combo elle a une colonne ou plus mais pas tantôt une tantôt plusieurs
Salut Pat,
Je ne comprend pas ce que tu veux dire: la combobox a toujours qu'une seule colonne dans ce code en sachant qu'on y met les valeurs de la ligne sélectionnée?
 

fanch55

XLDnaute Barbatruc
Pour répondre strictement à la demande :
VB:
Private Sub userform_initialize()
Dim Lcol As Range, Plage As Range, Alist As Object
  ' dernière cellule non vide de la ligne sélectionnée
    Set Lcol = Rows(3).Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
    Set Plage = Range("C" & Lcol.Row, Lcol) ' en l'occurence de C3 à F3
    Set Alist = CreateObject("System.Collections.ArrayList")
    For Each Cel In Plage
        Select Case True
            Case Cel = "":                  ' on ignore la cellule vide
            Case Alist.Contains(Cel.Text):  ' on ignore le doublon
            Case Else:  Alist.Add Cel.Text
        End Select
    Next
    Alist.Sort
    ComboBox1.List = Alist.toarray
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 826
Messages
2 092 527
Membres
105 444
dernier inscrit
hugowrzk