Accélerer un code permettant de rappatrier des données
Bonjour,
J’ai 2 fichiers Excel : Classeur source.xlsx et Classeur cible.xlsx
J’ai écrit un code qui me permet 2 choses :
- Cas 1 : Comparer la valeur de la colonne G du classeur source à la valeur de la colonne B du classeur cible
- Cas 2 : Comparer la valeur de la colonne I du classeur source à la valeur de la colonne G du classeur cible
Dans le 1er cas : si la valeur de la colonne G du classeur source est égale à la valeur de la colonne B du classeur cible, alors :
- Copier la valeur correspondante de la colonne F du classeur source et le coller en colonne D du classeur cible
- Copier la valeur correspondante de la colonne A du classeur source et le coller en colonne E du classeur cible
Et dans le 2e cas : si la valeur de la colonne I du classeur source à la valeur de la colonne G du classeur cible, alors :
- Copier la valeur correspondante de la colonne S du classeur source et le coller en colonne O du classeur cible
- Copier la valeur correspondante de la colonne K du classeur source et le coller en colonne R du classeur cible
- Copier la valeur correspondante de la colonne L du classeur source et le coller en colonne S du classeur cible
- Copier la valeur correspondante de la colonne AB du classeur source et le coller en colonne V du classeur cible
- Copier la valeur correspondante de la colonne AC du classeur source et le coller en colonne W du classeur cible
- Copier la valeur correspondante de la colonne AD du classeur source et le coller en colonne X du classeur cible
- Copier la valeur correspondante de la colonne V du classeur source et le coller en colonne Y du classeur cible
- Copier la valeur correspondante de la colonne T du classeur source et le coller en colonne Z du classeur cible
Seulement, mon problème est que mon code dure 8 min et j’aimerai qu’il soit plus rapide
Quelqu’un aurait-il une astuce ?
Merci
Option Base 1
Sub Echus_Agences()
Start = Timer
'Déclaration des variables
Dim WkCible, WkSource As Workbook
Dim PlageCible, PlageSourc1
Dim LastlineCibl, LastlineSourc1
Application.ScreenUpdating = False
'Ouvrir classeur cible :
Set WkCible = Workbooks.Open(Filename:="C:\Users\Desktop\Classeur cible.xlsx")
'Ouvrir classeur source
Set WkSource = Workbooks.Open(Filename:="C:\Users\Desktop\Classeur source.xlsx", ReadOnly:=True)
With WkSource.Worksheets(1)
Set LastlineSourc1 = .Range("F" & .Rows.Count).End(xlUp)
PlageSourc1 = .Range("F2", LastlineSourc1(1, 28))
End With
With WkCible.Worksheets(1)
Set LastlineCibl = .Range("A" & .Rows.Count).End(xlUp)
PlageCible = .Range("A2", LastlineCibl(1, 26))
For y = 1 To UBound(PlageSourc1, 1)
For x = 1 To UBound(PlageCible, 1)
If PlageCible(x, 2) = PlageSourc1(y, 2) Then 'Cible = col 2 , source = col n°2 à partir de la col F
PlageCible(x, 4) = PlageSourc1(y, 1) '
PlageCible(x, 5) = PlageSourc1(y, 28) '
End If
If PlageCible(x, 6) = PlageSourc1(y, 4) Then 'Cible = col 6 , source = col 4
PlageCible(x, 15) = PlageSourc1(y, 14) '
PlageCible(x, 18) = PlageSourc1(y, 6) '
PlageCible(x, 19) = PlageSourc1(y, 7) '
PlageCible(x, 22) = PlageSourc1(y, 23) '
PlageCible(x, 23) = PlageSourc1(y, 24) '
PlageCible(x, 24) = PlageSourc1(y, 25) '
PlageCible(x, 25) = PlageSourc1(y, 17) '
PlageCible(x, 26) = PlageSourc1(y, 15) '
End If
Next x
Next y
.Range("A2:Z2").Resize(UBound(PlageCible, 1)) = PlageCible
End With
Application.ScreenUpdating = True
MsgBox "durée du traitement: " & Timer - Start & " secondes"
End Sub
Mis à part dimensionner correctement tes variables ce qui ne ferait quasiment rien gagner... Tu pourrais t'amuser à passer par un scripting dictionary. Ce qui ferait diminuer considérablement le temps de calcul.
Bonjour,
En dehors du fait que le dictionary sera le plus rapide, tu peux déjà accélérer en recherchant la ligne avec un .find() plutôt qu'en les balayant toutes.
eric
Il doit toutes les balayer pour les comparer une à une, chaque ligne étant indépendante. Je ne vois où utiliser un .find
Si, pour chaque ligne de PlageSourc1 il balaye toutes les lignes de PlageCible jusqu'à ce qu'il trouve PlageCible(x, 2) = PlageSourc1(y, 2)
Après il continue de boucler pour rien (ou pour écraser ce qui a été mis)
Il faut rechercher PlageSourc1(y, 2) dans la colonne.
eric
Effectivement j'avais lu de travers. C'est aussi une autre façon d’accélérer.