Simplification boucle for

Bonsoir à tous,

J'aurais besoin d'aide de grand connaisseurs VBA ! :D

J'ai créé une macro VBA qui me permet de récupérer deux colonnes d'un fichier Excel que je copie dans la feuille numéro d'affaire. Ma feuille tableau récupère les données d'un autre fichier Excel.

Dans ma feuille Tableau, la colonne n° d'affaire est déjà présente et j'ai ajouté la colonne Bureau associée. J'ai réalisé une boucle for pour pouvoir lire ma colonne n°affaire et ajouter la bonne valeur de la colonne Bureau correspondante.

Mon code est le suivant :

Sub Tableau()

Sheets("Numéro affaire").Activate
NbLignesSecu = Range("B65536").End(xlUp).Row

Dim yy, zz As Integer
Dim Nummarche, Numaffaire
Dim Bureau

For zz = 2 To NbLignesSecu
    Nummarche = Range("B" & zz).Value
    Sheets("Numéro affaire").Activate
    For yy = 2 To 100
        Numaffaire = Range("B" & yy).Value
        If Nummarche = Numaffaire Then
            Bureau = Range("A" & yy).Value
        End If
    Next yy
    Sheets("Tableau").Activate
    Range("A" & zz).Value = Bureau
Next zz

End Sub

Le code fonctionne très bien mais le problème est que dans mon fichier de base j'ai environ 15000 lignes ce qui rend la macro très longue !

Auriez-vous une astuce, une autre synthèse de code permettant de réaliser la même chose mais en rendant la macro beaucoup plus rapide ?

Je vous mets un fichier d'exemple en pièce jointe (celui-ci ne comporte que 10 lignes mais c'est pour montrer concrètement mes explications :) )

Bonne soirée et merci d'avance !

2test.xlsm (14.32 Ko)

Bonjour à tous!

abcd1234, vois si cela te convient

Bonne journée!

9test.xlsm (19.86 Ko)

Bonjour,

à tester :

Sub bureau()
    Dim numAff, bureau, dict
    Dim lig As Long
    Set dict = CreateObject("Scripting.Dictionary")
    With Worksheets("Numéro affaire")
        numAff = .[A2:B2].Resize(.Cells(Rows.Count, 1).End(xlUp).Row - 1).Value
        For lig = 1 To UBound(numAff)
            dict(numAff(lig, 2)) = numAff(lig, 1)
        Next lig
    End With
    With Worksheets("Tableau")
        bureau = .[A2:B2].Resize(.Cells(Rows.Count, 2).End(xlUp).Row - 1).Value
        For lig = 1 To UBound(bureau)
            If dict.exists(bureau(lig, 2)) Then bureau(lig, 1) = dict(bureau(lig, 2))
        Next lig
        .[A2:B2].Resize(.Cells(Rows.Count, 2).End(xlUp).Row - 1).Value = bureau
    End With
    Set dict = Nothing
End Sub
5test.xlsm (21.29 Ko)

si un bureau n'est pas trouvé, je ne vide pas un éventuel existant. A voir tu veux le faire
eric

Merci beaucoup à vous deux !

J'ai pris le code de Nordik et cela m'a permis de diminuer le temps de ma macro de 5min !

Bonne journée ! :)

Bonjour,

tu as bien fait de ne pas tester le mien, il n'est que 133 fois plus rapide.
Bref...
eric

Rechercher des sujets similaires à "simplification boucle"