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

Remplir un objet listBox... LENT!

8 réponses
Avatar
Dominic Feron
Bonjours à tous!

Je suis en train de remplir une listBox avec des données que je vais
chercher via SQL Server. La requête que j'exécute me renvois l'information
en moins 2 secondes.

Par contre, lorsque j'arrive pour remplir ma listBox avec tous ce que je
veux, je n'ai pas le choix de faire une boucle. La méthode la plus rapide
que j'ai trouvé est de mettre l'information dans un tableau et ensuite
remplir ma liste comme suit:


strRequete = "SELECT [No.], [Description] FROM ListeProjets WHERE
[Etat du projet] = 0 " & _
"ORDER BY [No.]"

'Ouvre la connexion SQl
objSQLConnexion.OpenSQLConnection

'Éxécute la requête SQL
objSQLConnexion.OpenRecordSet strRequete, rs

'Je met mon SELECT dans mon tableau
Tarray() = rs.GetRows

'On ferme la connexion
objSQLConnexion.CloseSQLConnection rs


'On remplit la liste des projets -----------ICI C'EST LONG EN TITI
For i = 0 To UBound(Tarray, 2)

lstProjet.AddItem Tarray(0, i) & " - " & Tarray(1, i)

Next

La requête SQL me retourne environ 5000 enregistrements. La boucle prend
environ 15 secondes à s'exécuter avant que je vois l'information apparaître
dans ma liste.

Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup plus
rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
facilitrait la vie?

Merci beaucoup!

PS: À noter que ce code est utiliser dans une macro Excel, donc j'aimerais
éviter les ActiveX.

8 réponses

Avatar
ng
Salut,

Oui deja du VBA c'est plus lent à la base (interprété). Il faut soit trier
les enregistrements pour s'arranger d'en avoir moins soit d'essayer de
cacher la listbox pendant l'ajout :

oMaListe.Visible = False

For [...]
[...]
Call oMaListe.Additem([...])
[...]
Next [...]

oMaListe.Visible = True

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Dominic Feron wrote:
Bonjours à tous!

Je suis en train de remplir une listBox avec des données que je vais
chercher via SQL Server. La requête que j'exécute me renvois
l'information en moins 2 secondes.

Par contre, lorsque j'arrive pour remplir ma listBox avec tous ce que
je veux, je n'ai pas le choix de faire une boucle. La méthode la plus
rapide que j'ai trouvé est de mettre l'information dans un tableau et
ensuite remplir ma liste comme suit:


strRequete = "SELECT [No.], [Description] FROM ListeProjets
WHERE [Etat du projet] = 0 " & _
"ORDER BY [No.]"

'Ouvre la connexion SQl
objSQLConnexion.OpenSQLConnection

'Éxécute la requête SQL
objSQLConnexion.OpenRecordSet strRequete, rs

'Je met mon SELECT dans mon tableau
Tarray() = rs.GetRows

'On ferme la connexion
objSQLConnexion.CloseSQLConnection rs


'On remplit la liste des projets -----------ICI C'EST LONG EN TITI
For i = 0 To UBound(Tarray, 2)

lstProjet.AddItem Tarray(0, i) & " - " & Tarray(1, i)

Next

La requête SQL me retourne environ 5000 enregistrements. La boucle
prend environ 15 secondes à s'exécuter avant que je vois
l'information apparaître dans ma liste.

Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup
plus rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
facilitrait la vie?

Merci beaucoup!

PS: À noter que ce code est utiliser dans une macro Excel, donc
j'aimerais éviter les ActiveX.


Avatar
SALVA
Bonsoir,

Tu as essaye de lire tes donnees et de les placer directemetn dans ta liste,
ca t'evite d epasser par un tableau et de moin encombre la memoire.

bonne chance.

Salva

"Dominic Feron" a écrit dans le message de
news:
Bonjours à tous!

Je suis en train de remplir une listBox avec des données que je vais
chercher via SQL Server. La requête que j'exécute me renvois l'information
en moins 2 secondes.

Par contre, lorsque j'arrive pour remplir ma listBox avec tous ce que je
veux, je n'ai pas le choix de faire une boucle. La méthode la plus rapide
que j'ai trouvé est de mettre l'information dans un tableau et ensuite
remplir ma liste comme suit:


strRequete = "SELECT [No.], [Description] FROM ListeProjets WHERE
[Etat du projet] = 0 " & _
"ORDER BY [No.]"

'Ouvre la connexion SQl
objSQLConnexion.OpenSQLConnection

'Éxécute la requête SQL
objSQLConnexion.OpenRecordSet strRequete, rs

'Je met mon SELECT dans mon tableau
Tarray() = rs.GetRows

'On ferme la connexion
objSQLConnexion.CloseSQLConnection rs


'On remplit la liste des projets -----------ICI C'EST LONG EN TITI
For i = 0 To UBound(Tarray, 2)

lstProjet.AddItem Tarray(0, i) & " - " & Tarray(1, i)

Next

La requête SQL me retourne environ 5000 enregistrements. La boucle prend
environ 15 secondes à s'exécuter avant que je vois l'information


apparaître
dans ma liste.

Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup plus
rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
facilitrait la vie?

Merci beaucoup!

PS: À noter que ce code est utiliser dans une macro Excel, donc j'aimerais
éviter les ActiveX.





Avatar
Dominic Feron
D'accord, y aurait-il pas un autre contrôle qui pourrait faire ce que je
veux?

Comme associé une requête SQL directement à la liste sans boucler? (Comme
une dataGrid)

"ng" a écrit dans le message de
news:
Salut,

Oui deja du VBA c'est plus lent à la base (interprété). Il faut soit trier
les enregistrements pour s'arranger d'en avoir moins soit d'essayer de
cacher la listbox pendant l'ajout :

oMaListe.Visible = False

For [...]
[...]
Call oMaListe.Additem([...])
[...]
Next [...]

oMaListe.Visible = True

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Dominic Feron wrote:
> Bonjours à tous!
>
> Je suis en train de remplir une listBox avec des données que je vais
> chercher via SQL Server. La requête que j'exécute me renvois
> l'information en moins 2 secondes.
>
> Par contre, lorsque j'arrive pour remplir ma listBox avec tous ce que
> je veux, je n'ai pas le choix de faire une boucle. La méthode la plus
> rapide que j'ai trouvé est de mettre l'information dans un tableau et
> ensuite remplir ma liste comme suit:
>
>
> strRequete = "SELECT [No.], [Description] FROM ListeProjets
> WHERE [Etat du projet] = 0 " & _
> "ORDER BY [No.]"
>
> 'Ouvre la connexion SQl
> objSQLConnexion.OpenSQLConnection
>
> 'Éxécute la requête SQL
> objSQLConnexion.OpenRecordSet strRequete, rs
>
> 'Je met mon SELECT dans mon tableau
> Tarray() = rs.GetRows
>
> 'On ferme la connexion
> objSQLConnexion.CloseSQLConnection rs
>
>
> 'On remplit la liste des projets -----------ICI C'EST LONG EN TITI
> For i = 0 To UBound(Tarray, 2)
>
> lstProjet.AddItem Tarray(0, i) & " - " & Tarray(1, i)
>
> Next
>
> La requête SQL me retourne environ 5000 enregistrements. La boucle
> prend environ 15 secondes à s'exécuter avant que je vois
> l'information apparaître dans ma liste.
>
> Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup
> plus rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
> facilitrait la vie?
>
> Merci beaucoup!
>
> PS: À noter que ce code est utiliser dans une macro Excel, donc
> j'aimerais éviter les ActiveX.




Avatar
Dominic Feron
Ouais j'ai essayé, et c'est aussi pire.

Il est vrai que quand je met mes données dans mon tableau, c'est long...

Mais quand je fais ce traitement, je les gardent en mémoire. Comme ça, c'est
juste la première fois que c'est lent :S.

!!!!

Puis-je faire en sorte que lorsque l'usager ouvre son document Excel, je
fais ma requête et met mes données dans mon tableau sans que cet exécution
gèle mon document Excel?


"SALVA" a écrit dans le message de
news:%


Bonsoir,

Tu as essaye de lire tes donnees et de les placer directemetn dans ta


liste,
ca t'evite d epasser par un tableau et de moin encombre la memoire.

bonne chance.

Salva

"Dominic Feron" a écrit dans le message


de
news:
> Bonjours à tous!
>
> Je suis en train de remplir une listBox avec des données que je vais
> chercher via SQL Server. La requête que j'exécute me renvois


l'information
> en moins 2 secondes.
>
> Par contre, lorsque j'arrive pour remplir ma listBox avec tous ce que je
> veux, je n'ai pas le choix de faire une boucle. La méthode la plus


rapide
> que j'ai trouvé est de mettre l'information dans un tableau et ensuite
> remplir ma liste comme suit:
>
>
> strRequete = "SELECT [No.], [Description] FROM ListeProjets


WHERE
> [Etat du projet] = 0 " & _
> "ORDER BY [No.]"
>
> 'Ouvre la connexion SQl
> objSQLConnexion.OpenSQLConnection
>
> 'Éxécute la requête SQL
> objSQLConnexion.OpenRecordSet strRequete, rs
>
> 'Je met mon SELECT dans mon tableau
> Tarray() = rs.GetRows
>
> 'On ferme la connexion
> objSQLConnexion.CloseSQLConnection rs
>
>
> 'On remplit la liste des projets -----------ICI C'EST LONG EN TITI
> For i = 0 To UBound(Tarray, 2)
>
> lstProjet.AddItem Tarray(0, i) & " - " & Tarray(1, i)
>
> Next
>
> La requête SQL me retourne environ 5000 enregistrements. La boucle prend
> environ 15 secondes à s'exécuter avant que je vois l'information
apparaître
> dans ma liste.
>
> Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup


plus
> rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
> facilitrait la vie?
>
> Merci beaucoup!
>
> PS: À noter que ce code est utiliser dans une macro Excel, donc


j'aimerais
> éviter les ActiveX.
>
>
>




Avatar
Quasimodo
Dominic Feron pretended :
Bonjours à tous!

Je suis en train de remplir une listBox avec des données que je vais
chercher via SQL Server. La requête que j'exécute me renvois l'information
en moins 2 secondes.

Par contre, lorsque j'arrive pour remplir ma listBox avec tous ce que je
veux, je n'ai pas le choix de faire une boucle. La méthode la plus rapide
que j'ai trouvé est de mettre l'information dans un tableau et ensuite
remplir ma liste comme suit:


strRequete = "SELECT [No.], [Description] FROM ListeProjets WHERE
[Etat du projet] = 0 " & _
"ORDER BY [No.]"

'Ouvre la connexion SQl
objSQLConnexion.OpenSQLConnection

'Éxécute la requête SQL
objSQLConnexion.OpenRecordSet strRequete, rs

'Je met mon SELECT dans mon tableau
Tarray() = rs.GetRows

'On ferme la connexion
objSQLConnexion.CloseSQLConnection rs


'On remplit la liste des projets -----------ICI C'EST LONG EN TITI
For i = 0 To UBound(Tarray, 2)

lstProjet.AddItem Tarray(0, i) & " - " & Tarray(1, i)

Next

La requête SQL me retourne environ 5000 enregistrements. La boucle prend
environ 15 secondes à s'exécuter avant que je vois l'information apparaître
dans ma liste.

Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup plus
rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
facilitrait la vie?

Merci beaucoup!

PS: À noter que ce code est utiliser dans une macro Excel, donc j'aimerais
éviter les ActiveX.



Bonsoir,
Oui, il existe des astuces.
La première, c'est de ne jamais charger une listebox avec 5000
éléments. :'(
L'utilisateur ne les traitera jamais tous(si il en utilise 2% c'est
magnifique, ou plutôt, cest un génie), n'oublier pas qu'une listebox
est un élément orienter user.
Travailler tjs avec des subset de données issues de regroupement,
caractériser vos données, données leur un sens, je supose que vous ne
travaillez dans la quantité.
Exemple : vous n'allez pas chercher tous les clients de la db, pour
proposer au user, la sélection d'un client, mais vous commencer par
rafiner plutôt par ville, par tranche d'age, ou tout autre paramètre
pertinent.
Ensuite ne faite pas de recopie de données d'un recordset vers un
tableau (vous passer d'un outils ultra puissant à une sous éspece
d'outils, où il faut recréer tous). Charger votre recordset en lecture
seul et déconnecter le, c'est tout. Binder votre listbox et si c'est
pas possible metter le en mode invisible et charger le.
Voila j'esper vous avoir aidé.

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com
Avatar
Jean Yves SÉVENO
Bonjour,

Si c'est la listBox de VBA que tu utilises, tu peux placer tes données dans
un Array et l'affecter directement à la propriété List de la listBox.

Exemple :

lstProjet.List() = MyArray

Je ne sais pas si ce sera plus rapide mais un petit essai te le dira.

Cordialement.

Jean Yves


"Dominic Feron" a écrit dans le message de
news:
Bonjours à tous!

Je suis en train de remplir une listBox avec des données que je vais
chercher via SQL Server. La requête que j'exécute me renvois l'information
en moins 2 secondes.

Par contre, lorsque j'arrive pour remplir ma listBox avec tous ce que je
veux, je n'ai pas le choix de faire une boucle. La méthode la plus rapide
que j'ai trouvé est de mettre l'information dans un tableau et ensuite
remplir ma liste comme suit:


strRequete = "SELECT [No.], [Description] FROM ListeProjets WHERE
[Etat du projet] = 0 " & _
"ORDER BY [No.]"

'Ouvre la connexion SQl
objSQLConnexion.OpenSQLConnection

'Éxécute la requête SQL
objSQLConnexion.OpenRecordSet strRequete, rs

'Je met mon SELECT dans mon tableau
Tarray() = rs.GetRows

'On ferme la connexion
objSQLConnexion.CloseSQLConnection rs


'On remplit la liste des projets -----------ICI C'EST LONG EN TITI
For i = 0 To UBound(Tarray, 2)

lstProjet.AddItem Tarray(0, i) & " - " & Tarray(1, i)

Next

La requête SQL me retourne environ 5000 enregistrements. La boucle prend
environ 15 secondes à s'exécuter avant que je vois l'information
apparaître
dans ma liste.

Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup plus
rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
facilitrait la vie?

Merci beaucoup!

PS: À noter que ce code est utiliser dans une macro Excel, donc j'aimerais
éviter les ActiveX.





Avatar
Patrick Philippot
Dominic Feron wrote:
Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup
plus rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
facilitrait la vie?



Bonjour,

Outre les différents conseils qui vous ont déjà été donnés, j'ajouterai
ceci:

1. Ce qui prend en fait le plus de temps, c'est certainement l'affichage
qui est recalculé à chaque ajout. Quand on charge une listbox (ou une
combobox ou autre chose) avec un grand nombre d'éléments, généralement,
on désactive le rafraîchissement de la fenêtre pendant le chargement et
on le réactive après. C'est une précaution élémentaire:

Dim lReturn As Long

lReturn = SendMessage(MaListbox.hWnd, WM_SETREDRAW, False, 0&)
...chargement...
lReturn = SendMessage(MaListbox.hWnd, WM_SETREDRAW, True, 0&)

Vous allez voir, ça ira beaucoup plus vite.

2. Si vos éléments sont déjà triés par l'exécution de la requête,
assurez vous que la propriété Sorted de la listbox est à False.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Dominic Feron
Merci de toutes vos réponses, je les met à l'essai dès maintenant

"Patrick Philippot" a écrit dans le message
de news:%
Dominic Feron wrote:
> Y a-t-il un meilleur moyen de remplir une listBox, un moyen beaucoup
> plus rapide? Où y-a-til un autre objet que je pourrais utiliser qui me
> facilitrait la vie?

Bonjour,

Outre les différents conseils qui vous ont déjà été donnés, j'ajouterai
ceci:

1. Ce qui prend en fait le plus de temps, c'est certainement l'affichage
qui est recalculé à chaque ajout. Quand on charge une listbox (ou une
combobox ou autre chose) avec un grand nombre d'éléments, généralement,
on désactive le rafraîchissement de la fenêtre pendant le chargement et
on le réactive après. C'est une précaution élémentaire:

Dim lReturn As Long

lReturn = SendMessage(MaListbox.hWnd, WM_SETREDRAW, False, 0&)
...chargement...
lReturn = SendMessage(MaListbox.hWnd, WM_SETREDRAW, True, 0&)

Vous allez voir, ça ira beaucoup plus vite.

2. Si vos éléments sont déjà triés par l'exécution de la requête,
assurez vous que la propriété Sorted de la listbox est à False.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr