Boucles for imbriquées, macro trop lente - VB/VBA/VBS - Programmation
Marsh Posté le 13-06-2011 à 08:41:02
Citation : LastRow = Worksheets("data" ).Range("A60000" ).End(xlUp).Row |
"A60000" fait un peu peur.
Il y a combien de cellules à examiner ?
S'il y en a plus de mille, il est normale que le programme commence à ramer, car VBA est un langage qui s'exécute lentement. C'est un défaut connu, et pour lequel, il n'y a pas grand chose à faire.
Le code pourrait, peut-être, être optimiser un peu, par exemple, peut-être, en testant plus tôt si Worksheets("data" ).Cells(j, 6).Value > 0.
L'algorithme pourrait probablement être améliorer pour éviter la double boucle qui est très pénalisante. S'il y a 1000 lignes de données, la double boucle examinera 1000 x 1000 lignes, c'est-à-dire 1 000 000 de lignes !
Une amélioration importante serait réalisée, si les données étaient triées. Alors, la recherche de la date la plus ancienne s'effectuerait tout de suite, en prenant la ligne du haut ou du bas.
Si l'examen d'un million de lignes est nécessaire, alors il faut envisager d'exporter la feuille Excel, et de la traiter par un programme écrit en C.
Marsh Posté le 13-06-2011 à 17:57:54
Merci de ta réponse!
Oui j'ai peut être abusé sur le 60000 ! Je pourrais le réduire à 500, cela ne devrait pas poser de problème. J'ai environ 200 lignes à traiter.
Je vais essayer de mettre la condition Worksheets("data" ).Cells(j, 6).Value > 0 plus tôt!
Par contre, ce n'est pas aussi simple pour le tri! Il faudrait d'abord trier les dates par article (ou objet) afin d'avoir la date la plus ancienne pour chacun d'eux. Et les comparer afin d'avoir la plus récente sur l'ensemble des articles!
Merci encore
Marsh Posté le 13-06-2011 à 22:21:28
Bonjour,
Je ne sais pas si j'ai tout compris:
tu as ca:
et tu veux ca (pour chaque objet la date la + ancienne):
pour 100 objets différents sur 10000 dates différentes ca me prends une seconde :
Il faut cocher Microsoft Scripting Runtime dans Outils>Références
Citation : Sub D_DatesDebutMsn2() Dim i As Integer With ThisWorkbook.Worksheets("data" ) End Sub |
L'objet le + recent est dans la variable last_object et sa date dans last_date
J'ai peut-être un peu compliqué avec les formats Je fait toujours ca pour être sur que ca marche
Marsh Posté le 14-06-2011 à 18:44:08
Bonjour,
C'est exactement ça, merci beaucoup! Je ne connaissais pas les "dico", c'est en effet bien plus rapide qu'avec un programme classique!
Du coup je vais étudier ça de plus près, ça pourrait me servir!
Merci encore, bonne soirée
Antoine
Marsh Posté le 12-06-2011 à 19:46:56
Bonjour,
J'ai besoin de vos lumières!
J’ai réalisé un programme vba qui est beaucoup trop lent ! J’aimerais avoir vos conseils concernant de possibles évolutions !
Les données se présentent de la façon suivante : une colonne, représentant des objets, et une autre, donnant des dates de réalisation d’opérations liées à ces objets.
Il peut y avoir plusieurs opérations et donc plusieurs dates par objet.
Le but du programme est :
- Dans un 1er temps, de trouver pour chaque objet la date la plus ancienne;
- Dans un 2nd temps, de comparer ces dates et de donner la date la plus récente et son objet associé.
Le programme que j’ai réalisé fonctionne mais est très lent (seulement 100 à 200 lignes de données à traiter et plusieurs minutes d’exécution).
Si vous avez des pistes pour l’améliorer ou même une méthode différente (peut être avec des recherchev ?? je ne vois pas trop comment faire..), ce serait génial !
Merci d’avance et bonne soirée !