Boucles for imbriquées, macro trop lente

Painauchocolat Messages postés 2 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
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).

  Sub D_DatesDebutMsn()

Application.ScreenUpdating = False

Worksheets("Feuil3").Range("A:B").ClearContents
Worksheets("data").Columns("D:G").NumberFormat = "General"
LastRow = Worksheets("data").Range("A60000").End(xlUp).Row

For i = 2 To LastRow
    If Worksheets("data").Cells(i, 8).Value = "Oui" Then
        first = Worksheets("data").Cells(i, 6).Value
        vMsn = Worksheets("data").Cells(i, 2).Value
        For j = 2 To LastRow
            If j <> i Then
                If Worksheets("data").Cells(j, 2).Value = Worksheets("data").Cells(i, 2).Value Then
                    If Worksheets("data").Cells(j, 6).Value < Worksheets("data").Cells(i, 6).Value Then
                        If Worksheets("data").Cells(j, 6).Value > 0 Then
                            first = Worksheets("data").Cells(j, 6).Value
                            vMsn = Worksheets("data").Cells(j, 2).Value
                        End If
                    End If
                End If
            End If
            If first <> 0 Then
                Worksheets("Feuil3").Cells(i, 1).Value = vMsn
                Worksheets("Feuil3").Cells(i, 2).Value = first
            End If
        Next j
    End If
Next i


Worksheets("data").Columns("D:G").NumberFormat = "m/d/yyyy"
Worksheets("Feuil3").Columns("B:B").NumberFormat = "m/d/yyyy"
Application.ScreenUpdating = True


End Sub 


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 !
A voir également:

3 réponses

michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
BOnjour

"Objet" a une signifiation technique bien précise en VBA: qu'entends tu par "objet"?
au besoin
mettre le classeur sans données confidentielles en pièce jointe (format XL97-2003) sur
http://cijoint.fr/
et faire un clic droit sur le lien proposé puis "copier l'adresse du lien" et coller dans le message de réponse

et explique très clairement et de manière exhaustive ton projet

Michel
0
Painauchocolat Messages postés 2 Statut Membre
 
Bonjour,

J'entends par objet un article, et non pas un objet vu comme en programmation!

http://www.cijoint.fr/cjlink.php?file=cj201106/cijzIGLBx1.xlsm

Prenons l'exemple d'une voiture. La colonne de gauche représente le numéro du véhicule. Celle de droite les dates de début des opérations de fabrication sur ces véhicules (il peut y avoir plusieurs opérations par véhicule).
La colonne des "oui" permet de voir quels véhicules sont commencés (une seule opération peut avoir été lancée sur le total).

Le but est de voir quel véhicule a été commencé le dernier, et cela par le raisonnement expliquer dans mon 1er message!

Merci pour ta réponse
Antoine
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Re donc
si j'ai réussi à piger ce que tu voudrais
"quel est le dernier véhicule ayant commencé sa 1° opération et quel était ce jour?"

j'attends ta réaction

0