OVH Cloud OVH Cloud

Méthode de remplissage avec AddItem

21 réponses
Avatar
Laurent Merlet
Bonjour à tous,

Je souhaiterai remplir ma listbox avec la méthode AddItem à partir d'un
recordset, voici comment je procède :

Set rs = CurrentDb.OpenRecordset("SELECT TblAppels.NumAppel,
TblAppels.DateAppel, TblAppels.Contact, TblAppels.TypeAppel,
TblAppels.DateTraitement, TblAppels.Destinataire FROM TblAppels WHERE
TblAppels.TypeEmetteur ='Client Sun Service SAS' and TblAppels.Traite = -1
and TblAppels.NumClient = " & VarNumClient & " ORDER BY TblAppels.DateAppel
")
rs.MoveFirst
Me.LstAppels.Clear
Do Until rs.EOF
Me.LstAppels.AddItem rs![NumAppel]
rs.MoveNext
Loop
rs.Close
Set rs = Nothing

Le problème est qu'au déboggage il ne me reconnait pas les propriétés .Clear
et .AddItem. Pourtant ces propriétés sont disponibles dans la bibliothèque
MSForms / ListBox /

D'avance merci

Laurent

Pour info je suis sous Access 2000 SP3

10 réponses

1 2 3
Avatar
Eric
re,
je m'étais absenté.

Un exemple :
Tu veux une ListBox Form2 à 3 colonnes remplies à partir d'un Recordset.
On ne prend que les 3 1ers champs du recordset par souci de
simplification rst(0), rst(1), rst(2) de chaque enregistrement du
recordset mais tu peux définir ceux que tu veux. (Le controle ListBox
Forms 2.0 est nommé LaListe)

Le code serait :

Private Sub Form_Current()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("TonSQL")
' Choix de la police et de la taille
Me.LaListe.FontName = "Verdana"
Me.LaListe.FontSize = 7
' Définition du nombre de colonnes
Me.LaListe.ColumnCount = 3
' Définition de la largeur des colonnes
Me.LaListe.ColumnWidths = "2 cm;2 cm;1 cm"
' Vidage de la liste
Me.LaListe.Clear
'Déclaration d'un tableau (Variant) à n lignes et 3 colonnes
Dim varArray(), nb As Long
rst.MoveLast
' Détermination du nombre de lignes
nb = rst.RecordCount
ReDim varArray(nb, 2)
rst.MoveFirst
' Remplissage du tableau à partir du recordset
While Not rst.EOF
varArray(cpt, 0) = rst(0)
varArray(cpt, 1) = rst(1)
varArray(cpt, 2) = rst(2)
cpt = cpt + 1
rst.MoveNext
Wend
' Affectation du contenu du tableau à la liste
Me.LaListe.List() = varArray
' Fermeture du recordset et 'libération' de rst
rst.Close
Set rst = Nothing
End Sub

Pour connaitre les méthodes et propriétés, je ne vois qu'une seule
solution : passer par l'explorateur d'objets et choisir un des
controles de MSForms 2.0. Tu as tous les membres du contrôle.

Exemple : Comment fonctionne ColumnWidths ?
Me.LaListe.ColumnWidths puis sélection de ColumnWidths et F1
L'aide est bien documentée sur ce sujet je crois.

Par exemple, comment faire en sorte que lors de la commande AddItem on
puisse ajouter plusieurs colonnes ?
J'ai essayé un truc de ce genre là, mais pas bon :

Me.LstAppels.AddItem rs![NumAppel], rs![DateAppel]

Si tu as une idée ...

Merci




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
j'oubliais,
Pour récupérer la valeur de la 2ème et 3ème colonne par exemple :
Private Sub LaListe_Click()
MsgBox LaListe.Column(1) & " " & LaListe.Column(2)
End Sub

rien de bien neuf, en quelque sorte ;-)


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
LM
Ok, impeccable !
Par contre quel est l'intérête de passer par un tableau pour le remplissage
de la listbox ? Est ce que cela est plus propre, ou bien est ce la seule
manière de procéder ?

Merci

Laurent

"Eric" a écrit dans le message de
news:
j'oubliais,
Pour récupérer la valeur de la 2ème et 3ème colonne par exemple :
Private Sub LaListe_Click()
MsgBox LaListe.Column(1) & " " & LaListe.Column(2)
End Sub

rien de bien neuf, en quelque sorte ;-)


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
Eric
Bonsoir,

La ListBox des Forms 2.0 est une ListBox dérivée du VB ou du VBA Excel,
je crois, et celle-ci ne supporte pas le colonnage au sens où tu
l'entends, c'est à dire des colonnes réellement séparées. En VB, quand
tu précises plusieurs colonnes, seul le contenu s'affiche sur plusieurs
colonnes mais tu ne peux pas définir ce que tu mets dans chaque colonne.
Par exemple pour 12 valeurs et si la liste a 3 colonnes, tu auras 4
ligne de 3 valeurs, sans pouvoir affecter tes valeurs aux colonnes.

Donc, il n'était pas possible de faire un .AddItem rst!champ1,
rst!champ2 ; au mieux mettre un champ par le AddItem et un autre via la
propriété ItemData mais alors il faut une valeur numérique et différente
pour chaque item.
Pour réaliser ce que tu voulais, je n'avais pas d'autre choix, mais je
n'ai pas tout exploité, que de passer par un tableau et d'utiliser la
propriété List() ou Column().
Avec la propriété List(): les enregistrements sont placés les uns sous
les autres, les champs cote à cote, ce que tu attendais je pense.
Avec la propriété Column(), les enregistrements sont placés cote à cote
et les champs les uns sous les autres pour chaque enregistrement. Et
avec cette méthode, je ne sais pas comment tu aurais pu récupérer la
valeur du 2ème champ de la 2ème colonne par exemple. (A approfndir
certainement).

Ainsi, si ton jeu contient 12 enregistrements de trois champs :
Avec List() , tu auras 12 lignes à 3 champs, 1 ligne = 1 enregistrement
Avec Colum(), 12 colonnes de 3 champs, 1 colonne = 1 enregistrement

Plus clair ?

PS : la solution que te propose Raymond est bien aussi et certainement
plus facile à mettre en oeuvre. Moi j'ai poursuivi 'comme pour relever
le défi' que pose Access2000 avec la méthode AddItem. Ca faisait
longtemps que je voulais tester cette solution mais n'en ai jamais eu
l'occasion. Tu me l'as proposé ! A toi de me dire, un jour peut-être, si
c'était efficace et si ça en valait la peine. ;-)

Ok, impeccable !
Par contre quel est l'intérête de passer par un tableau pour le remplissage
de la listbox ? Est ce que cela est plus propre, ou bien est ce la seule
manière de procéder ?

Merci



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
Bonsoir Raymond,

Je viens de découvrir, mais peut-être un peu tard, pourquoi tes
variables Recordset sont très souvent, voire toujours, nommées RS ;-)

--
A+
Eric
Avatar
Raymond [mvp]
Bonjour Eric.

hé oui, pourquoi faire compliqué quand les propres initiales font l'affaire
?

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum
Formez-vous en ligne grâce aux Webcasts Microsoft Technet :
http://www.microsoft.com/france/technet/seminaires/webcasts.mspx


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

Bonsoir Raymond,

Je viens de découvrir, mais peut-être un peu tard, pourquoi tes variables
Recordset sont très souvent, voire toujours, nommées RS ;-)

--
A+
Eric


Avatar
Laurent Merlet
En tout cas merci, tes réponses me conviennent !

"Eric" a écrit dans le message de
news:
Bonsoir,

La ListBox des Forms 2.0 est une ListBox dérivée du VB ou du VBA Excel,
je crois, et celle-ci ne supporte pas le colonnage au sens où tu
l'entends, c'est à dire des colonnes réellement séparées. En VB, quand
tu précises plusieurs colonnes, seul le contenu s'affiche sur plusieurs
colonnes mais tu ne peux pas définir ce que tu mets dans chaque colonne.
Par exemple pour 12 valeurs et si la liste a 3 colonnes, tu auras 4
ligne de 3 valeurs, sans pouvoir affecter tes valeurs aux colonnes.

Donc, il n'était pas possible de faire un .AddItem rst!champ1,
rst!champ2 ; au mieux mettre un champ par le AddItem et un autre via la
propriété ItemData mais alors il faut une valeur numérique et différente
pour chaque item.
Pour réaliser ce que tu voulais, je n'avais pas d'autre choix, mais je
n'ai pas tout exploité, que de passer par un tableau et d'utiliser la
propriété List() ou Column().
Avec la propriété List(): les enregistrements sont placés les uns sous
les autres, les champs cote à cote, ce que tu attendais je pense.
Avec la propriété Column(), les enregistrements sont placés cote à cote
et les champs les uns sous les autres pour chaque enregistrement. Et
avec cette méthode, je ne sais pas comment tu aurais pu récupérer la
valeur du 2ème champ de la 2ème colonne par exemple. (A approfndir
certainement).

Ainsi, si ton jeu contient 12 enregistrements de trois champs :
Avec List() , tu auras 12 lignes à 3 champs, 1 ligne = 1 enregistrement
Avec Colum(), 12 colonnes de 3 champs, 1 colonne = 1 enregistrement

Plus clair ?

PS : la solution que te propose Raymond est bien aussi et certainement
plus facile à mettre en oeuvre. Moi j'ai poursuivi 'comme pour relever
le défi' que pose Access2000 avec la méthode AddItem. Ca faisait
longtemps que je voulais tester cette solution mais n'en ai jamais eu
l'occasion. Tu me l'as proposé ! A toi de me dire, un jour peut-être, si
c'était efficace et si ça en valait la peine. ;-)

Ok, impeccable !
Par contre quel est l'intérête de passer par un tableau pour le
remplissage


de la listbox ? Est ce que cela est plus propre, ou bien est ce la seule
manière de procéder ?

Merci



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Laurent Merlet
Je reviens sur ta manière de procéder, que j'ai mis en place : un problème
se pose lorsqu'il y a trop de données dans le recordset à charger dans la
listbox , il me met "Erreur d'exécution 2176 : le paramètre de cette
propriété est trop long "

Serait ce une des limites de ce genre de solutions ... ?

D'avance merci !

Laurent

"Raymond [mvp]" a écrit dans le message de
news:
si c'est juste pour ça passe par la combobox standard et charge le
rowsource

:
Dim RS As DAO.Recordset
Set RS = CurrentDb.OpenRecordset("SELECT TblAppels.NumAppel FROM TblAppels
WHERE ... etc ...
RS.MoveFirst
Me.LstAppels.RowSource = ""
Do Until RS.EOF
Me.LstAppels.RowSource = Me.LstAppels.RowSource & RS![NumAppel] & ";"
RS.MoveNext
Loop
RS.Close
Set RS = Nothing


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum
Formez-vous en ligne grâce aux Webcasts Microsoft Technet :
http://www.microsoft.com/france/technet/seminaires/webcasts.mspx


"Laurent Merlet" a écrit dans le message de
news: 43886468$0$18335$
En fait c'est la manière que j'utilisais jusqu'à maintenant, sauf que je
me
suis aperçu que cette méthode laissait des recordset ouvert sur la table
à


partir du moment où le formulaire est ouvert. Et cela m'embetait car ça
provoquait des ralentissements lorsqu'un second utilisateur voulait
accéder
à cette même table.
D'où j'ai décidé de changer de méthode et de remplir les listbox au
chargement du formulaire puis de relâcher les recordset ouverts.

Qu'en penses tu ?


"Raymond [mvp]" a écrit dans le
message


de
news:
Bonjour.

access 2000 ne gère pas les additem, seulement 2002 et 2003.
d'autre part indique directement ton recordset dans le contenu sans
avoir



à
ajouter de données.
Me.LstAppels.RowSource = "SELECT TblAppels.NumAppel FROM TblAppels
WHERE



..
etc .... ;"

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum
Formez-vous en ligne grâce aux Webcasts Microsoft Technet :
http://www.microsoft.com/france/technet/seminaires/webcasts.mspx


"Laurent Merlet" a écrit dans le message de
news: 43885bb4$0$6644$
Bonjour à tous,

Je souhaiterai remplir ma listbox avec la méthode AddItem à partir
d'un




recordset, voici comment je procède :

Set rs = CurrentDb.OpenRecordset("SELECT TblAppels.NumAppel,
TblAppels.DateAppel, TblAppels.Contact, TblAppels.TypeAppel,
TblAppels.DateTraitement, TblAppels.Destinataire FROM TblAppels WHERE
TblAppels.TypeEmetteur ='Client Sun Service SAS' and TblAppels.Traite
= -1


and TblAppels.NumClient = " & VarNumClient & " ORDER BY
TblAppels.DateAppel
")
rs.MoveFirst
Me.LstAppels.Clear
Do Until rs.EOF
Me.LstAppels.AddItem rs![NumAppel]
rs.MoveNext
Loop
rs.Close
Set rs = Nothing

Le problème est qu'au déboggage il ne me reconnait pas les propriétés
.Clear
et .AddItem. Pourtant ces propriétés sont disponibles dans la
bibliothèque


MSForms / ListBox /

D'avance merci

Laurent

Pour info je suis sous Access 2000 SP3
















Avatar
Raymond [mvp]
tout à fait exact, c'est une limitation access. il me semble que c'était à
4ko environ maximum.
si ça dépasse, tu n'as qu'une seule solution qui est la clause select ou une
requête.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum
Formez-vous en ligne grâce aux Webcasts Microsoft Technet :
http://www.microsoft.com/france/technet/seminaires/webcasts.mspx


"Laurent Merlet" a écrit dans le message de
news: 4389f2cb$0$21270$
Je reviens sur ta manière de procéder, que j'ai mis en place : un problème
se pose lorsqu'il y a trop de données dans le recordset à charger dans la
listbox , il me met "Erreur d'exécution 2176 : le paramètre de cette
propriété est trop long "

Serait ce une des limites de ce genre de solutions ... ?

D'avance merci !

Laurent


Avatar
Rv
Salut,

Une alternative est possible en utilisant la propriété Recordset de la
liste pour y affecter un Recordset déconnecté préalablement construit et
chargé. Dans ce cas on garde la liste déroulante d'Acces, en mode
déconnecté, et il n'y pas de limitation liée au nombre d'enregistrements.
Exemple testé en Access2000 et 2002:

Dans un module standard:

' Construire et remplire un Rs deconnecté à partir d'une table ou requête
Public Sub remplirListe(strTableSource As String, objRsSourceListe As
ADODB.Recordset)
Dim objField As ADODB.Field
Dim objRsSourceData As New ADODB.Recordset
Dim strRequeteSource As String

strRequeteSource = "SELECT * FROM " & strTableSource
objRsSourceData.Open strRequeteSource, CurrentProject.Connection,
adOpenForwardOnly, adLockReadOnly
If Not objRsSourceData.EOF Then
For Each objField In objRsSourceData.Fields
Call objRsSourceListe.Fields.Append(objField.Name,
objField.Type, objField.DefinedSize)
Next
objRsSourceListe.Open , , adOpenKeyset, adLockOptimistic
Do While Not objRsSourceData.EOF
objRsSourceListe.AddNew
For Each objField In objRsSourceData.Fields
objRsSourceListe(objField.Name).Value = objField.Value
Next
objRsSourceListe.Update
objRsSourceData.MoveNext
Loop
End If
objRsSourceData.Close
Set objRsSourceData = Nothing
objRsSourceListe.MoveFirst
End Sub


*********************************************
Dans le formulaire contenant la liste (lstTest initialisée à partir de
table1):

Public objRsSourceListe As New ADODB.Recordset

Private Sub Form_Load()
initialiserListe
End Sub

Sub initialiserListe()
Set objRsSourceListe = New ADODB.Recordset
Call remplirListe("table1", objRsSourceListe)
Me.lstTest.RowSourceType = "Table/requête"
Set Me.lstTest.Recordset = objRsSourceListe
End Sub

A+

Rv

"Laurent Merlet" a écrit dans le message de
news:43885bb4$0$6644$
Bonjour à tous,

Je souhaiterai remplir ma listbox avec la méthode AddItem à partir d'un
recordset, voici comment je procède :

Set rs = CurrentDb.OpenRecordset("SELECT TblAppels.NumAppel,
TblAppels.DateAppel, TblAppels.Contact, TblAppels.TypeAppel,
TblAppels.DateTraitement, TblAppels.Destinataire FROM TblAppels WHERE
TblAppels.TypeEmetteur ='Client Sun Service SAS' and TblAppels.Traite = -1
and TblAppels.NumClient = " & VarNumClient & " ORDER BY
TblAppels.DateAppel

")
rs.MoveFirst
Me.LstAppels.Clear
Do Until rs.EOF
Me.LstAppels.AddItem rs![NumAppel]
rs.MoveNext
Loop
rs.Close
Set rs = Nothing

Le problème est qu'au déboggage il ne me reconnait pas les propriétés
.Clear

et .AddItem. Pourtant ces propriétés sont disponibles dans la bibliothèque
MSForms / ListBox /

D'avance merci

Laurent

Pour info je suis sous Access 2000 SP3




1 2 3