Optimiser un code (Transfert d'excel vers listbox en vb6)

Résolu
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012 - 29 oct. 2009 à 18:23
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.

9 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 oct. 2009 à 11:42
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)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 oct. 2009 à 19:00
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 oct. 2009 à 19:03
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)
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
29 oct. 2009 à 21:46
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 oct. 2009 à 00:50
"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é.
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
30 oct. 2009 à 09:07
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.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 oct. 2009 à 10:51
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)
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
30 oct. 2009 à 11:32
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
0
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
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.
0
Rejoignez-nous