[VB6] traitement sur tableau excel très lent [résolu]

traitement sur tableau excel très lent [résolu] [VB6] - VB/VBA/VBS - Programmation

Marsh Posté le 08-12-2005 à 18:10:11    

Bonjour.
J'ai un soucis, je doit trier un fichier excel contenant quelques centaines de ligne en fonction de quelques dizaines de valeurs contenues dans une listbox.
 
Si je passe par une macro intégrée dans mon classeur le tri et la recopie sur la feuille voisine me prend au grand max 2 secondes.
 
Le même code repompé dans vb6 me prend 2 minutes.
Aors je veut bien admettre que je code comme un porc mais tout de même !!!!!
Surtout que le code est quasi identique.
Voici le code en question:
 


v_colonne = combo_lettre_colonne.Text
v_ligne = UpDown1.Value
v_colonne_fin = "o"
v_ligne_arrivee = 1
v_cellule = v_colonne & v_ligne
v_cellule = sheet.Range(v_cellule)
 
For k = 0 To liste_refs.ListCount - 1
    tableau_refs(k) = liste_refs.List(k)
Next k
 
    For j = 0 To tableau_refs(liste_refs.ListCount - 1)
        'v_ligne = UpDown1.Value
               For i = 0 To 200
           
            v_cellule = v_colonne & v_ligne  ' concaténation des deux précédentes
            v_nombre = Worksheets(1).Cells(v_ligne, v_colonne) ' attribue le contenu de la cellule à v_nombre
            If v_nombre = "" Then GoTo echap
            v_nombre = Right(v_nombre, 4) ' extrait les 4 derniers chiffres
                If v_nombre = tableau_refs(j) Then v_ligne_complete = ("a" & v_ligne & ":" & v_colonne_fin & v_ligne): Worksheets(1).Range(v_ligne_complete).Copy Destination:=Worksheets("Feuil3" ).Range("a" & v_ligne_arrivee): v_ligne_arrivee = v_ligne_arrivee + 1 _
                Else: GoTo echap
             
echap:
             
            v_nombre = ""
            v_cellule = ""
            v_ligne = v_ligne + 1
           
        Next i
    Next j


Si qqun a une idée je suis preneur. :)
Ps: po la peine de geuler après les goto y sont trop bô. :d


Message édité par amsterdam le 10-12-2005 à 22:39:07
Reply

Marsh Posté le 08-12-2005 à 18:10:11   

Reply

Marsh Posté le 08-12-2005 à 18:47:06    

Salut amsterdam,
 
A moins que je sois un peu taupe ce soir tu boucles 200 fois sur i que tu n'utilises pas :(
non ?
@+


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 08-12-2005 à 18:53:13    

Sisi je boucle bien sur i sinon mon code ne fonctionnerait pas du tout.
Mais j'ai quand même vérifié en faisant un débogage pas à pas et je boucle bien sur i.

Reply

Marsh Posté le 08-12-2005 à 19:39:30    

Par contre j'ai rectifié une erreur car j'avait mis en commentaire la ligne:
v_ligne = UpDown1.Value dans la boucle j ( va savoir pourquoi...)

Reply

Marsh Posté le 08-12-2005 à 19:49:25    

Reprenons, y a t'il un moyen de faire bosser excel via vb6 sans mettre deux plombes et sans bouffer 60% du CPU ?
Comme avec une simple macro quoi.  :fou:

Reply

Marsh Posté le 09-12-2005 à 10:18:59    

Oki j'ai eu le temps de mieux regarder ta boucle sur i en effet elle permet d'augmenter le ligne désolé j'avais mal lu.
 
Le seul truc que j'ai remarqué avec excel piloté par VB(beta 2005 pas vb6) est que lorsque je dois recopier des données à la chaine dans une feuille je fais d'abord la collecte des données dans un array et là j'écris l'array en dernier et d'une seule fois. Je ne sais pas qu'elle est l'influence sur l'utilisation du cpu mais le temps de traitement était bien diminué chez moi (environ /10), surtout avec les saut de pages et même en application.visible=false.
 
@+

Reply

Marsh Posté le 09-12-2005 à 13:33:55    

J'en suis arrivé à la même conclusion que toi mais n'ai pas encore eu le temps d'essayer.
L'avantage c'est qu'on ne dialogue q'une fois avec excel pour récupérer les données et une deuxième pour y écrire le résultat.
Je viendrait poster le résultat une fois fait.
To be continued...

Reply

Marsh Posté le 09-12-2005 à 13:49:51    

oki bon courage :)


---------------
Je bidouillle c'est sur... Mais j'essaye de faire en sorte que ça marche ;-)
Reply

Marsh Posté le 10-12-2005 à 22:38:04    

C'est bon j'ai réussi.  [:ambesanch]  
En gros ça donne çà:
-Une boucle pour copier toutes les cellules de la colonne à traiter dans un tableau.
 
-Une boucle pour remplir un tableau avec les entrées de la zone de liste.
 
-Deux boucles imbriquées ou je compare le contenu des cellules précédement copiées avec les entrées de la zone de liste et ou je remplit un autre tableau avec les numéros de lignes qui correspondent au critère de sélection.
 
-Enfin je copie les lignes qui m'interesse de la feuil1 du classeur vers la feuil2.
 
Résultat à peu près une seconde pour trier 200 lignes avec 3 références.
Donc même avec 10 références et 1000 lignes ça devrait le faire.  [:burtonsnowboard]  
 
Voili.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed