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

Mise à jour d'un combobox (vider et recharger)

18 réponses
Avatar
JP
Bonsoir,

De l'userform3, je lance l'userform5.
Dans l'userform5, apr=E8s avoir trait=E9 des donn=E9es en lien avec l'userf=
orm3, je mets =E0 jour un combobox nomm=E9 CB_Prof. Apr=E8s l'avoir vid=E9,=
je le recharge par l'interm=E9diaire de cette boucle:

For Charge =3D 9 To Nbl Step 9
UserForm3.CB_Prof.AddItem Sheets("BD_PFMP").Cells(Charge, 2)
Next Charge

Le probl=E8me c'est que des lignes blanches apparaissent dans la liste d=E9=
roulante du combobox (3 =E0 chaque rechargement) et je ne comprends pas pou=
rquoi!

Quelqu'un aurait une id=E9e?

Voici un extrait du code ci-dessous o=F9 on retrouve la boucle.

Merci d'avance.

JP
--------------------------



For i =3D 9 To Nbl Step 9
If TextBox1.Value =3D Cells(i, 2).Value Then
MsgBox "La personne existe d=E9j=E0 dans la base de donn=E9es."
Exit Sub: UserForm5.Show
ElseIf ComboBox1 =3D "" Or TextBox1 =3D "" Then
MsgBox "Les champs Nom Pr=E9nom, et EP/EG sont obligatoires"
Exit Sub: UserForm5.Show
ElseIf Cells(i, 2).Value =3D "" Then
Cells(i, 1) =3D ComboBox1.Value
Cells(i, 2) =3D TextBox1.Value
Cells(i, 3) =3D TextBox2.Value
For C =3D 4 To Sheets("BD_PFMP").Range("AF3").Value + 3 ' + 3 p=
our le d=E9calage
Cells(i, C) =3D Me.Controls("TB_" & C + 46).Value ' TB_ com=
mencent =E0 50
Next C
MsgBox "Les donn=E9es ont =E9t=E9 enregistr=E9es."
' vide textbox et combobox
TextBox1 =3D ""
TextBox2 =3D ""
ComboBox1 =3D ""
For Efface =3D 50 To 81
Me.Controls("TB_" & Efface) =3D ""
Next Efface
'Mise =E0 jour de la combobox Prof de l'userform3
UserForm3.CB_Prof.Clear
For Charge =3D 9 To Nbl Step 9
UserForm3.CB_Prof.AddItem Sheets("BD_PFMP").Cells(Charge, 2)
Next Charge
Exit For
End If
Next i

8 réponses

1 2
Avatar
MichD
Il y a d'autres façons de faire comme dans l'exemple suivant :


À l'aide d'une fonction utilisant ADO (activex data objet), il est
possible de combiner plusieurs opérations dans la même :

A ) Éliminer les doublons
B ) Trier les items du combobox par ordre croissant
C ) Éliminer les lignes(entrées) vides s’il y en a dans la plage de
cellules.

Pour ce faire, ajouter la bibliothèque suivante à ton projet :
"Microsoft Activex Data Object 2.8 Librairy"

Le nom de la feuille et la plage de cellules doivent être adaptés
selon ton projet.

Selon que ta plage de cellules a une étiquette de colonne, tu devras
utiliser dans cette ligne de code qui fait référence à une fonction
différente...

Me.ComboBox1.List = MaListe(Rg, Fichier) 'Avec étiquette

OU

Me.ComboBox1.List = MaListe1(Rg, Fichier) 'Sans étiquette


à copier dans le module du formulaire
'---------------------------------------------
Private Sub UserForm_Initialize()

Dim Rg As Range, Fichier As Workbook

Set Fichier = ThisWorkbook

With Worksheets("Denis")
Set Rg = Range("A1:A" & .Range("A65536").End(xlUp).Row)
End With

Me.ComboBox1.List = MaListe(Rg, Fichier)

Set Fichier = Nothing: Set Rg = Nothing

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

'à copier dans un module standard
'Si ta plage de cellules CONTIENT une étiquette de colonne, utilise ceci :
'---------------------------------------------
Public Function MaListe(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String, NomColonne As String

Rg.Name = Rg(1, 1).Text
NomColonne = Fichier.Names(Rg(1, 1).Text).Name

Requete = "SELECT " & NomColonne & " From " & NomColonne & "" _
& vbCrLf & "Where " & NomColonne & " <> Null " & vbCrLf & _
"Group By " & NomColonne & " ORDER By " & NomColonne & ""

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe = Application.Transpose(Rst.GetRows)
ThisWorkbook.Names(Rg(1, 1).Text).Delete
Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------

'à copier dans un module standard
'Si ta plage de cellules NE CONTIENT PAS d'étiquette de colonne, utilise
ceci :
'---------------------------------------------
Public Function MaListe1(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String

Rg.Name = "NomColonne"

Requete = "SELECT f1 From NomColonne " & vbCrLf & _
"Where f1 <> Null " & vbCrLf & _
"Group By f1 ORDER By f1"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe1 = Application.Transpose(Rst.GetRows)
Fichier.Names("NomColonne").Delete

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------

MichD
---------------------------------------------------------------
Avatar
JP
He, je suis scotché.
Je vais te décevoir, car tu as passé du temps, mais il y a plein de cod es que je ne connais pas.
Mon niveau VBA n'est pas celui-ci ou celui que tu penses.

Déjà je ne sais pas où ajouter la bibliothèque suivante à mon pro jet :
"Microsoft Activex Data Object 2.8 Librairy".

Je travaille sur excel 2010 et pour commencer, je ne trouve pas la fonction ADO dont tu parles.
Pour le reste, je ne comprends pas la totalité des codes ce qui me pertur be pour le mettre en place et l'utiliser.

Je garde précieusement les informations transmises pour les utiliser ult érieurement, quand j'aurai grandi en VBA :-)

Merci pour ces conseils.

JP
Avatar
MichD
| Déjà je ne sais pas où ajouter la bibliothèque suivante à mon projet :
| "Microsoft Activex Data Object 2.8 Librairy".

Dans la fenêtre de l'éditeur de code (VBA)
Barre des menus / outils / références / et tu coches dans la liste,
celle mentionnée : "Microsoft Activex Data Object 2.8 Librairy".

Dans cette section de la procédure :

| With Worksheets("Denis")
| Set Rg = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
| End With

Tu dois adapter le nom de la feuille et la lettre de colonne A pour B.

Enfin, tu as 2 fonctions qui ont le même rôle. Tu utilises selon que ta
plage de cellules a
une étiquette de colonne ou non. Selon ton fichier, la plage B9:Bx
n'a pas d'étiquette de colonne. Par conséquent, tu dois utiliser cette
fonction : "MaListe1"

Il ne te reste plus qu'à copier ces 2 procédures dans les modules indiqués.

'Copie ce qui suit dans le formulaire :
'---------------------------------------------
Private Sub UserForm_Initialize()

Dim Rg As Range, Fichier As Workbook

Set Fichier = ThisWorkbook

With Worksheets("BD_PFMP")
Set Rg = .Range("B1:B" & .Range("B65536").End(xlUp).Row)
End With

Me.ComboBox1.List = MaListe1(Rg, Fichier)

Set Fichier = Nothing: Set Rg = Nothing

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

'à copier dans un module standard
'Si ta plage de cellules CONTIENT une étiquette de colonne, utilise ceci :

'---------------------------------------------
Public Function MaListe1(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String

Rg.Name = "NomColonne"

Requete = "SELECT f1 From NomColonne " & vbCrLf & _
"Where f1 <> Null " & vbCrLf & _
"Group By f1 ORDER By f1"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe1 = Application.Transpose(Rst.GetRows)
Fichier.Names("NomColonne").Delete

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function
'---------------------------------------------


MichD
---------------------------------------------------------------
Avatar
JP
Bonjour Denis,

J'essaie de te suivre.
La Library était déjà cochée. Pour excel et du reste pour office au ssi.

J'ai copié dans le Private sub userform_initilaize()de l'userform3
ce code:

Attention j'ai changé combobox1 en CB_PROF

Dim Rg As Range, Fichier As Workbook
Set Fichier = ThisWorkbook
With Worksheets("BD_PFMP")
Set Rg = .Range("B1:B" & .Range("B65536").End(xlUp).Row)
End With
Me.CB_PROF.List = MaListe1(Rg, Fichier)
Set Fichier = Nothing: Set Rg = Nothing
End Sub

J'ai copié dans le Module1 ce code:
Public Function MaListe1(Rg As Range, Fichier As Workbook)

Dim Conn As ADODB.Connection, Rst As New ADODB.Recordset
Dim Requete As String

Rg.Name = "NomColonne"

Requete = "SELECT f1 From NomColonne " & vbCrLf & _
"Where f1 <> Null " & vbCrLf & _
"Group By f1 ORDER By f1"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open Requete, Conn, adOpenForwardOnly, adLockOptimistic

MaListe1 = Application.Transpose(Rst.GetRows)
Fichier.Names("NomColonne").Delete

Rst.Close: Conn.Close
Set Rst = Nothing: Set Conn = Nothing

End Function

j'obtiens une erreur de compilation "type défini par l'utilisateur non d éfini" sur la ligne:
Dim Conn As ADODB.Connection,

Voilà, voilou, qu'est ce que je fais pour cela, :-)

JP
Avatar
MichD
Un fichier exemple : http://cjoint.com/?CGuoSG3cMrC

MichD
---------------------------------------------------------------
Avatar
JP
Bonjour Denis,

Effectivement dans ton exemple cela fonctionne.
Dans mon cas, je voudrai ne voir apparaitre que ce qui est en colonne B mai s seulement sur les lignes bleues.
Actuellement, je me retrouve avec des :
Période1
Période2
Période3
Période4
Martin René
Elèves suivis en P1
etc...

ce qui ne convient pas vraiment en la circonstance.
Seul devrait être retenu : Martin René car il est sur la ligne bleue.
DE toute façon, il n'y a jamais redondance d'un nom, ce serait une erreur . J'ai mis un test pour éviter les redondances.

JP
Avatar
MichD
A ) Chez moi, les lignes en bleu sont celles qui sont vides!

B ) En utilisant la commande "rechercher" d'Excel, elle ne
trouve pas la donnée : Martin René

C ) Si tu as une ou des conditions qui doivent être respectées
pour extraire la liste des noms de la colonne B, qu'attends-tu
pour les faire connaître?????????????

D ) La méthode que je t'ai proposée n'est pas adaptée si la condition
est la couleur de la ligne. Comment est déterminée cette couleur?

MichD
---------------------------------------------------------------
Avatar
JP
Bonjour Denis,

a)Effectivement les lignes bleues sont pour le moment vides. C'est normal, je n'ai pas commencé à entrer les noms. Il faudra attendre qu'ils soien t connus.

b)Martin René était donc un exemple de nom.

c)Les conditions pour extraire la liste sont:
les lignes fond bleu et en colonne B (celles qui contiennent un nom et un p rénom - les vides ne m'intéressent pas).

d)La couleur fond bleu a été définie arbitrairement par ma pomme. Pou r les distinguer facilement des jaunes. Le bleu c'est beau! :-)



JP
1 2