Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment enlever les doublons dans un combobox

4 réponses
Avatar
François
Bonjour,

Voici mon code :
Dim tablo As Variant
Private Sub UserForm_Initialize()
Dim i As Integer
Dim data As Collection
Dim maplage As Range

Set data = New Collection
With Worksheets("feuil1")
tablo = .Range("a1:f")
End With

On Error Resume Next
For i = 1 To UBound(tablo)
data.Add CStr(tablo(i, 1)), CStr(tablo(i, 1))
Next i
On Error GoTo 0
For i = 1 To data.Count
ComboBox1.AddItem data.Item(i)
Next i

With Worksheets("feuil1")
Set maplage = .Range("a1:f")
End With

ComboBox3.ColumnWidths = "00;00;60;00"
ComboBox3.BoundColumn = 3

For X = 2 To 3
Me.Controls("ComboBox" & X).List = tablo
Me.Controls("ComboBox" & X).ColumnCount = 3
Next X

End Sub
Private Sub ComboBox1_Click()
Dim i As Integer
ComboBox2.Clear
For i = 1 To UBound(tablo)
If tablo(i, 1) = ComboBox1 Then
ComboBox2.AddItem tablo(i, 2)
End If
Next i
ComboBox3.ListIndex = -1

End Sub
Private Sub ComboBox2_Change()
Dim i As Long

For i = 1 To UBound(tablo)
If tablo(i, 2) = ComboBox2 Then
ComboBox3 = CStr(tablo(i, 3))
End If
Next i
End Sub

Dans mon Combobox1 j'ai pas de doublons mais dans la Combobox2 et 3 oui.
Comment faire pour les enlever.

Merci

4 réponses

Avatar
michdenis
Bonjour François,

Ta question n'est pas claire ... mais pour avoir 3 combobox dont les noms sont Combobox1 , combobox2 et combobox3 sans doublons dans
leur liste, essaie ceci :

Adapte le nom de la feuille et de la plage de cellules !

Pour éviter les doublons .... tu passes par un objet Collection, ton code contient déjà un bon exemple.

'-----------------------------------------
Private Sub UserForm_Initialize()

Dim i As Integer
Dim data As Collection
Dim maplage As Range
Dim A As Integer

For A = 1 To 3
Set data = New Collection
With Worksheets("feuil2")
tablo = .Range(.Cells(1, A), _
.Cells(.Cells(65536, A).End(xlUp).Row, A))
End With

On Error Resume Next
For i = 1 To UBound(tablo)
If tablo(i, 1) <> "" Then
data.Add CStr(tablo(i, 1)), CStr(tablo(i, 1))

End If
Next i
On Error GoTo 0
For i = 1 To data.Count
UserForm1.Controls("ComboBox" & A).AddItem data.Item(i)
Next i
Set data = Nothing
Next

End Sub
'-----------------------------------------



Salutations!




"François" a écrit dans le message de news: yVnQe.7036$
Bonjour,

Voici mon code :
Dim tablo As Variant
Private Sub UserForm_Initialize()
Dim i As Integer
Dim data As Collection
Dim maplage As Range

Set data = New Collection
With Worksheets("feuil1")
tablo = .Range("a1:f")
End With

On Error Resume Next
For i = 1 To UBound(tablo)
data.Add CStr(tablo(i, 1)), CStr(tablo(i, 1))
Next i
On Error GoTo 0
For i = 1 To data.Count
ComboBox1.AddItem data.Item(i)
Next i

With Worksheets("feuil1")
Set maplage = .Range("a1:f")
End With

ComboBox3.ColumnWidths = "00;00;60;00"
ComboBox3.BoundColumn = 3

For X = 2 To 3
Me.Controls("ComboBox" & X).List = tablo
Me.Controls("ComboBox" & X).ColumnCount = 3
Next X

End Sub
Private Sub ComboBox1_Click()
Dim i As Integer
ComboBox2.Clear
For i = 1 To UBound(tablo)
If tablo(i, 1) = ComboBox1 Then
ComboBox2.AddItem tablo(i, 2)
End If
Next i
ComboBox3.ListIndex = -1

End Sub
Private Sub ComboBox2_Change()
Dim i As Long

For i = 1 To UBound(tablo)
If tablo(i, 2) = ComboBox2 Then
ComboBox3 = CStr(tablo(i, 3))
End If
Next i
End Sub

Dans mon Combobox1 j'ai pas de doublons mais dans la Combobox2 et 3 oui.
Comment faire pour les enlever.

Merci
Avatar
François
Bonsoir Michdenis,

J'ai modifié le code et j'ai une erreur 9(l'indice n'appartient pas à la
sélection dans la sub (Private Sub ComboBox1_Click()), ce qui donne ceci :

Dim tablo As Variant
Private Sub UserForm_Initialize()
Dim i As Integer
Dim data As Collection
Dim maplage As Range
Dim A As Integer

For A = 1 To 3
Set data = New Collection
With Worksheets("Feuil1")
tablo = .Range(.Cells(2, A), _
.Cells(.Cells(65536, A).End(xlUp).Row, A))
End With

On Error Resume Next
For i = 1 To UBound(tablo)
If tablo(i, 1) <> "" Then
data.Add CStr(tablo(i, 1)), CStr(tablo(i, 1))
End If
Next i
On Error GoTo 0
For i = 1 To data.Count
UsfInventaire.Controls("ComboBox" & A).AddItem data.Item(i)
Next i
Set data = Nothing
Next

With Worksheets("Feuil1")
Set maplage = .Range("a2:k15000")
End With

For X = 2 To 3
Me.Controls("ComboBox" & X).List = tablo
Me.Controls("ComboBox" & X).ColumnCount = 3
Next X

End Sub


Private Sub ComboBox1_Click()
Dim i As Integer
ComboBox2.Clear
For i = 1 To UBound(tablo)
If tablo(i, 1) = ComboBox1 Then
ComboBox2.AddItem tablo(i, 2) 'L'INDINCE N'APPARTIENT PAS À LA
SÉLECTION ???
End If
Next i
ComboBox3.ListIndex = -1

End Sub


Private Sub ComboBox2_Change()
Dim i As Long

For i = 1 To UBound(tablo)
If tablo(i, 2) = ComboBox2 Then
ComboBox3 = CStr(tablo(i, 3))
End If
Next i
End Sub

J'ai oublié de spécifier que les combobox sont liés entre eux.

Merci
Avatar
michdenis
Bonjour François,

| J'ai modifié le code et j'ai une erreur 9

**********A************* -
Ce type d'erreur survient lorsque dans le code, on fait référence à un nom d'objet qui n'existe pas.
Exemple : With worksheets("Feuil1") ... si ton classeur n'a pas de "feuil1", cela génèrera une erreur.

Je crois que dans ton code, tu faisais référence à la feuil2. À vérifier selon le nom de l'onglet de ta feuille où se retrouve ta
plage de données.


**********B*************

dans la procédure Private Sub UserForm_Initialize()
que vient faire cette section de ton code?

With Worksheets("Feuil1")
Set maplage = .Range("a2:k15000")
End With

For X = 2 To 3
Me.Controls("ComboBox" & X).List = tablo
Me.Controls("ComboBox" & X).ColumnCount = 3
Next X
'**************************
La boucle précédant ces lignes de code à déjà renseigné tes 3 combobox ...!

De plus, tu veux bien expliquer pourquoi tu définis 3 colonnes à tes combobox et que ta plage originelle possède 11 colonnes "(Set
maplage = .Range("a2:k15000")"... tu as une raison particulière ?


**********C*************
Au sujet de ceci :

| ComboBox2.AddItem tablo(i, 2) 'L'INDINCE N'APPARTIENT PAS À LA SÉLECTION ???

Attention, dans la procédure "Sub UserForm_Initialize()" , j'ai initialé le tablo à chaque boucle pour une seule colonne de la plage
de cellules. Ton tablo n'a qu'une "colonne" , et toi, dans ta ligne de code tu fais référence à une soi-disante 2 colonnes qui
n'existe pas dans ton tableaul

à propos du code dont j'ai fait référence en point "B", je te ferai remarquer que ta variable tablo n'est pas modifié par ton
code... en fait, ta variable tablo conserve les données de la 3 ième et dernière boucle qu'elle a exécutée juste avant. Et comme ta
variable est déclarée au niveau du module, les 2 procédures de ce type : "Sub ComboBox1_Click()" n'apporte absolument rien de
nouveau car elles reprennent toujours les mêmes données de ta variable "Tablo" qui elle a retenue les valeurs de la dernière boucle.

P.S. J'espère que c'est plus clair et que tu arriveras à te retrouver.


Salutations!






"François" a écrit dans le message de news: XGsQe.9168$
Bonsoir Michdenis,

J'ai modifié le code et j'ai une erreur 9(l'indice n'appartient pas à la
sélection dans la sub (Private Sub ComboBox1_Click()), ce qui donne ceci :

Dim tablo As Variant
Private Sub UserForm_Initialize()
Dim i As Integer
Dim data As Collection
Dim maplage As Range
Dim A As Integer

For A = 1 To 3
Set data = New Collection
With Worksheets("Feuil1")
tablo = .Range(.Cells(2, A), _
.Cells(.Cells(65536, A).End(xlUp).Row, A))
End With

On Error Resume Next
For i = 1 To UBound(tablo)
If tablo(i, 1) <> "" Then
data.Add CStr(tablo(i, 1)), CStr(tablo(i, 1))
End If
Next i
On Error GoTo 0
For i = 1 To data.Count
UsfInventaire.Controls("ComboBox" & A).AddItem data.Item(i)
Next i
Set data = Nothing
Next

With Worksheets("Feuil1")
Set maplage = .Range("a2:k15000")
End With

For X = 2 To 3
Me.Controls("ComboBox" & X).List = tablo
Me.Controls("ComboBox" & X).ColumnCount = 3
Next X

End Sub


Private Sub ComboBox1_Click()
Dim i As Integer
ComboBox2.Clear
For i = 1 To UBound(tablo)
If tablo(i, 1) = ComboBox1 Then
ComboBox2.AddItem tablo(i, 2) 'L'INDINCE N'APPARTIENT PAS À LA
SÉLECTION ???
End If
Next i
ComboBox3.ListIndex = -1

End Sub


Private Sub ComboBox2_Change()
Dim i As Long

For i = 1 To UBound(tablo)
If tablo(i, 2) = ComboBox2 Then
ComboBox3 = CStr(tablo(i, 3))
End If
Next i
End Sub

J'ai oublié de spécifier que les combobox sont liés entre eux.

Merci
Avatar
François
Bonjour Michdenis,

La raison des 3 combobx est que ma feuille contient plus de 5000 lignes de
données. Avec les combobox il me serait plus rapide de trouver la ligne
recherchée.

En A j'ai soit une cellule vide, la lettre B, C, E, F, J, TN, IPE, etc.
En B j'ai les nombre de 1 à 2000.
En C j'ai soit une cellule vide, a, ab, ai, aii, aiii, i, ii ,iii , iv, v,
etc.

D'où la raison des 3 combobox.

Merci

"michdenis" a écrit dans le message de news:

Bonjour François,

| J'ai modifié le code et j'ai une erreur 9

**********A************* -
Ce type d'erreur survient lorsque dans le code, on fait référence à un nom
d'objet qui n'existe pas.
Exemple : With worksheets("Feuil1") ... si ton classeur n'a pas de
"feuil1", cela génèrera une erreur.

Je crois que dans ton code, tu faisais référence à la feuil2. À vérifier
selon le nom de l'onglet de ta feuille où se retrouve ta
plage de données.


**********B*************

dans la procédure Private Sub UserForm_Initialize()
que vient faire cette section de ton code?

With Worksheets("Feuil1")
Set maplage = .Range("a2:k15000")
End With

For X = 2 To 3
Me.Controls("ComboBox" & X).List = tablo
Me.Controls("ComboBox" & X).ColumnCount = 3
Next X
'**************************
La boucle précédant ces lignes de code à déjà renseigné tes 3 combobox
...!

De plus, tu veux bien expliquer pourquoi tu définis 3 colonnes à tes
combobox et que ta plage originelle possède 11 colonnes "(Set
maplage = .Range("a2:k15000")"... tu as une raison particulière ?


**********C*************
Au sujet de ceci :

| ComboBox2.AddItem tablo(i, 2) 'L'INDINCE N'APPARTIENT PAS À LA
SÉLECTION ???

Attention, dans la procédure "Sub UserForm_Initialize()" , j'ai initialé
le tablo à chaque boucle pour une seule colonne de la plage
de cellules. Ton tablo n'a qu'une "colonne" , et toi, dans ta ligne de
code tu fais référence à une soi-disante 2 colonnes qui
n'existe pas dans ton tableaul

à propos du code dont j'ai fait référence en point "B", je te ferai
remarquer que ta variable tablo n'est pas modifié par ton
code... en fait, ta variable tablo conserve les données de la 3 ième et
dernière boucle qu'elle a exécutée juste avant. Et comme ta
variable est déclarée au niveau du module, les 2 procédures de ce type :
"Sub ComboBox1_Click()" n'apporte absolument rien de
nouveau car elles reprennent toujours les mêmes données de ta variable
"Tablo" qui elle a retenue les valeurs de la dernière boucle.

P.S. J'espère que c'est plus clair et que tu arriveras à te retrouver.


Salutations!






"François" a écrit dans le message de news:
XGsQe.9168$
Bonsoir Michdenis,

J'ai modifié le code et j'ai une erreur 9(l'indice n'appartient pas à la
sélection dans la sub (Private Sub ComboBox1_Click()), ce qui donne ceci :

Dim tablo As Variant
Private Sub UserForm_Initialize()
Dim i As Integer
Dim data As Collection
Dim maplage As Range
Dim A As Integer

For A = 1 To 3
Set data = New Collection
With Worksheets("Feuil1")
tablo = .Range(.Cells(2, A), _
.Cells(.Cells(65536, A).End(xlUp).Row, A))
End With

On Error Resume Next
For i = 1 To UBound(tablo)
If tablo(i, 1) <> "" Then
data.Add CStr(tablo(i, 1)), CStr(tablo(i, 1))
End If
Next i
On Error GoTo 0
For i = 1 To data.Count
UsfInventaire.Controls("ComboBox" & A).AddItem data.Item(i)
Next i
Set data = Nothing
Next

With Worksheets("Feuil1")
Set maplage = .Range("a2:k15000")
End With

For X = 2 To 3
Me.Controls("ComboBox" & X).List = tablo
Me.Controls("ComboBox" & X).ColumnCount = 3
Next X

End Sub


Private Sub ComboBox1_Click()
Dim i As Integer
ComboBox2.Clear
For i = 1 To UBound(tablo)
If tablo(i, 1) = ComboBox1 Then
ComboBox2.AddItem tablo(i, 2) 'L'INDINCE N'APPARTIENT PAS À LA
SÉLECTION ???
End If
Next i
ComboBox3.ListIndex = -1

End Sub


Private Sub ComboBox2_Change()
Dim i As Long

For i = 1 To UBound(tablo)
If tablo(i, 2) = ComboBox2 Then
ComboBox3 = CStr(tablo(i, 3))
End If
Next i
End Sub

J'ai oublié de spécifier que les combobox sont liés entre eux.

Merci