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.

Rechercher des sujets similaires à "accelerer code permettant rappatrier donnees"