Optimiser un code (Transfert d'excel vers listbox en vb6) [Résolu]

Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
- - Dernière réponse : sancho12345
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
- 30 oct. 2009 à 12:24
Bonsoir à tous j'aimerai avoir un conseil.

J'ai une application avec la code suivant qui doit contrôler 290 lignes dans un fichier Excel, par contre et c'est un peu le but de ma question, cela met entre 20 et 25 secondes.

Y a t?il une méthode plus rapide, ou puisse-je modifier ce code pour le rendre plus rapide(l'optimiser).

**********************************
Function affich_gmao()

Dim classeur_excel As New Excel.Application
Dim h As Long

ValActuelle = 0
ValOperation (15)
'DisplayAlerts=False sert à désactiver les messages d'erreur d'EXCEL
classeur_excel.DisplayAlerts = False
'C'est dans la propriété FileName que l'on indique le chemin du Classeur auquel on se connecte
classeur_excel.Workbooks.Open FileName:="Adresse ", ReadOnly:=False, Editable:=True

List5.Clear
ValOperation (5)

For i = 1 To 290 ' nombre de ligne

If Trim(classeur_excel.Columns.Range("X2").Cells(i, 1).Value) <> "" Then List5.AddItem Trim(classeur_excel.Columns.Range("X2").Cells(i, 1).Value)
If Trim(classeur_excel.Columns.Range("Y2").Cells(i, 1).Value) <> "" Then List5.AddItem Trim(classeur_excel.Columns.Range("Y2").Cells(i, 1).Value)
If Trim(classeur_excel.Columns.Range("Z2").Cells(i, 1).Value) <> "" Then List5.AddItem Trim(classeur_excel.Columns.Range("Z2").Cells(i, 1).Value)
If Trim(classeur_excel.Columns.Range("AA2").Cells(i, 1).Value) <> "" Then List5.AddItem Trim(classeur_excel.Columns.Range("AA2").Cells(i, 1).Value)
If Trim(classeur_excel.Columns.Range("AB2").Cells(i, 1).Value) <> "" Then List5.AddItem Trim(classeur_excel.Columns.Range("AB2").Cells(i, 1).Value)
If Trim(classeur_excel.Columns.Range("AC2").Cells(i, 1).Value) <> "" Then List5.AddItem Trim(classeur_excel.Columns.Range("AC2").Cells(i, 1).Value)
If Trim(classeur_excel.Columns.Range("AD2").Cells(i, 1).Value) <> "" Then List5.AddItem Trim(classeur_excel.Columns.Range("AD2").Cells(i, 1).Value)
Next

classeur_excel.Quit
classeur_excel.DisplayAlerts = True
Set classeur_excel = Nothing

End Function

*********************************

Merci par avance.
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
60
3
Merci
Je viens de prendre le temps de tester ton programme.
Je te confirme que
        classeur_excel.Columns.Range("X2").Cells(i, 1).Value
est strictement la même chose que
        classeur_excel.Cells(i, 24).Value

Donc ton programme serait plus digeste avec cette structure :
    For i = 1 To 290
        ' X
        sTemp = Trim(classeur_excel.Cells(i, 24).Value)
        If sTemp <> "" Then List5.AddItem sTemp
        ' Y
        sTemp = Trim(classeur_excel.Cells(i, 25).Value)
        If sTemp <> "" Then List5.AddItem sTemp
        ' Z
        sTemp = Trim(classeur_excel.Cells(i, 26).Value)
        If sTemp <> "" Then List5.AddItem sTemp
        ' AA
        sTemp = Trim(classeur_excel.Cells(i, 27).Value)
        If sTemp <> "" Then List5.AddItem sTemp
        ' AB
        sTemp = Trim(classeur_excel.Cells(i, 28).Value)
        If sTemp <> "" Then List5.AddItem sTemp
        ' AC
        sTemp = Trim(classeur_excel.Cells(i, 29).Value)
        If sTemp <> "" Then List5.AddItem sTemp
        ' AD
        sTemp = Trim(classeur_excel.Cells(i, 30).Value)
        If sTemp <> "" Then List5.AddItem sTemp
    Next r

Mais, hélas, cela ne l'accélère pas beaucoup plus.
Le seul gain de temps réside dans l'utilisation d'une variable intermédiaire pour éviter de lire deux fois les mêmes informations : une fois pour le If, une seconde fois pour le AddItem

Si tu veux gagner en longueur de programme, tu peux imbriquer deux boucles :
    For i = 1 To 290
        For r = 24 To 30
            sTemp = Trim(classeur_excel.Cells(i, r).Value)
            If sTemp <> "" Then List5.AddItem sTemp
        Next t
    Next r

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 127 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
60
0
Merci
Salut
Une question : "classeur_excel.Columns.Range("X2").Cells(i, 1).Value" est sensé pointer sur quelle cellule ?
Parce que je vois :
Columns(Range("X2") : Ca, ça renvoie le n° de la colonne X, c'est à dire 24.
suivi de .Cell(i, 1) : Je n'ai pas essayé, mais le 1 est-il relatif à la colonne ou désigne t-il la colonne 1, c'est à dire "A" ?
- Si ça désigne la colonne "A", pourquoi ne pas simplement utiliser classeur_excel.Cells(i, 1).Value ?
- Si ça désigne la colonne relative à la ligne "i", colonne "X" + 1, pourquoi ne pas utiliser classeur_excel.Cells(i, 24).Offset(0, 1).Value

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
60
0
Merci
D'autre part, tu as une succession de If.
Est-il utile de tester les If suivant un If qui aura fait un AddItem ?
Si oui, laisse comme ça.
Si non, utilise la structure
If ... Then
   instruction
ElseIf ... Then
  instruction
ElseIf ... Then
  instruction
End If

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
0
Merci
Salut

Merci pour ta réponse.

Columns(Range("X2") renvoi sur la colonne X à partir de la ligne2.

J'ai essayé tes 2 méthodes à savoir :
classeur_excel.Cells(i, 24).Offset(0, 1).Value
classeur_excel.Cells(i, 1).Value

cela fonctionne, mais ce n'est pas ce que j'attends.



Concernant la succession de If je n'ai pas le choix.


merci
Commenter la réponse de sancho12345
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
60
0
Merci
"mais ce n'est pas ce que j'attends" Tu veux dire que cela ne renvoie pas le bon contenu ou bien que mon analyse n'est pas ce que tu recherches ?

Lors d'une insertion d'un Item dans une List (Combo, ListBox ou ListView), le composant est "redessiné", ce qui prend du temps. Temps encore augmenté si ta liste a une propriété demandant le classement alphabétique des items.
Pour accélérer le traitement, tu peux :
- Supprimer temporairement le tri alpha
- Rendre la liste ".Visible = False" le temps du traitement.
Gain de temps assuré.
Commenter la réponse de cs_Jack
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
0
Merci
Non ton analyse est bonne mais c'est le contenu renvoyé qui n'est pas correct.

La liste5 dans mon traitement est déjà "list5.visible = false"( mis dans le form load() )

Par contre comme puisse-je supprimer le temporairement le tri alpha et au final avec un tri alpha? Cela m?intéresse


Merci.
Commenter la réponse de sancho12345
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
60
0
Merci
Propriété Sorted - Tu es bien sous VB6 et il s'agit bien d'un composant ListBox, tu confirmes ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
0
Merci
Oui je confirme que je suis bien en VB 6, mais dans la fenêtre propriétés dans ma LIST5 le Sorted et déjà FALSE.

Sinon connais tu une autre manière de lire les fichiers Excel ?

Merci
Commenter la réponse de sancho12345
Messages postés
131
Date d'inscription
jeudi 21 mai 2009
Statut
Membre
Dernière intervention
18 mars 2012
0
Merci
Tes 2 codes me font gagner environ 16 secondes.

Avec ma méthode le traitement durait environ 27 secondes avec tes méthodes il dure environ 11 secondes.

J'ai opté pour ta deuxième méthode plus courte mais le temps et identique.

Je pense qu'on ne peut pas faire mieux !

Un grand merci à toi Jack , je te souhaite une bonne fin de journée.
Commenter la réponse de sancho12345