Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réduire le temps d’exécution d'une boucle do While

VBA

    7 décembre 2018 à 9:59:15

    Bonjour à tous,

    Je suis débutant dans VBA. J'ai réalisé un code qui fonctionne mais avec un très long temps d'exécution environ 20 minutes.

    Voici ce que mon code réalise:

    En effet, j'ai 2 fichier excel distinct: Manquants PSA-RSA  et ABP. Au départ, le fichier Manquant est fermé. l'objectif est de comparer les cellules de la colonne 3 (de Manquants PSA-RSA feuille Manquant) par rapport à la colonne 31 (de ABP feuille base de donnée MAJ). Si c'est identique alors on copie les infos de la colonne 11 du fichier Manquants PSA-RSA (feuille Manquant ) dans la colonne 19 du fichier ABP (feuille base de donnée MAJ). NB: coparaison est faite "normalement" jusqu'à la dernière ligne de la feuille base de donnée MAJ mais je m'arrête essentiellement à 1000 mais pour cela il met un temps d'exécution monstre!!. Puis le fichier Manquants PSA-RSA est ensuite enregistré et fermé. ci dessous le code:

    Sub Actualisée_info_FNR() 'code permettant de mettre à jour les info FNR à partir du fichier des manquants PSA_RSA

    Application.Calculation = xlCalculationManual

    Application.ScreenUpdating = False

    Dim Engin As Workbook

    Dim wbABP As Workbook

    Dim iLI As Long

    Dim iRE As Long

    Set Engin = Application.Workbooks.Open("P:\PR_Europe\APPRO\manquants_PSa_Renault\Manquants Psa-Rsa_2018.xlsm")

    Set wbABP = ThisWorkbook

    Set LI = Engin.Worksheets("manquants")

    Set RE = wbABP.Worksheets("base de données MAJ")

    iRE = 3

    Do While iRE <= 1000

        For iLI = 2 To 10000

                 If LI.Cells(iLI, 3).Text = RE.Cells(iRE, 31).Text Then

                 LI.Cells(iLI, 11).Copy RE.Cells(iRE, 19)

                 iRE = iRE + 1

                 End If

        Next iLI

    Loop

    Engin.Close SaveChanges:=True

    Application.Calculation = xlCalculationAutomatic

    Application.ScreenUpdating = True

    End Sub

    Merci d'avance pour votre  aides....! 

    • Partager sur Facebook
    • Partager sur Twitter
      7 décembre 2018 à 13:46:19

      Salut,

      Pour poster du code utilise le bouton </>.

      Avec les deux boucles de ton code, il peut y avoir entre 10k et 10M itérations, si ça prend 20 minutes tu dois plutôt être du côté des 10M.

      Elle sert à quoi exactement la macro ? Faire de la comparaison d'inventaires ?

      Le plus simple pour ce genre de macro c'est de trier les deux feuilles par un critère (par rexemple une référence) puis de parcourir les deux feuilles en même temps ligne par ligne.

      Comme les références sont triées (alphabétiquement par exemple) ça te permet de savoir si une référence est apparue ou disparue.

      • Partager sur Facebook
      • Partager sur Twitter
        10 décembre 2018 à 15:56:38

        Merci de ta réponse #Stormweaker, 

        "Elle sert à quoi exactement la macro ?"

        Elle sert à récupérer des infos du  fichier  appelé <manquant Psa-Rsa> pour les retranscrire dans le fichier ABP (la correspondance entre ces deux fichier est qu'il  y a des ref manquants du fichier manquant Psa-Rsa et du fichier ABP).

        Espérant que mon explication sera claire.

        Mais là, je t'avoue que j'ai tout essayé mais je n'y parvient pas à réduire ce temps.

        En revanche, je ne voie pas trop comment faire ce que tu me suggère de faire. Peux tu me donner un exemple stp!!!

        • Partager sur Facebook
        • Partager sur Twitter
          10 décembre 2018 à 18:56:59

          En code "écrit en français", en supposant que la référence soit dans la colonne A de la feuille.

          Tri fichierManquant sur colonne A
          Tri fichierABP sur colonne A
          
          ' Les références dans chacun des fichier sont maintenant triées par ordre alphabétiques
          
          Soit iM itérateur sur les lignes de fichierManquant
          Soit iA itérateur sur les lignes de fichierABP
          
          iM = 1
          iA = 1
          
          While iM < derniereLigne_fichierManquant OU iA < derniereLigne_fichierABP
          
              If fichierManquant.cells(iM,1) = fichierABP.cells(iA,1) Then 'Si on a la même référence
                  ' Faire la copie de ce que tu veux
                  iA = iA+1
                  iM = iM+1
              ElseIf fichierManquant.cells(iM,1) > fichierABP.cells(iA,1) Then 'Ca marche bien avec des ID ça mais tu peux faire une petite fonction qui compare la place de deux références
                  ' Référence de fichierABP non existante dans fichierManquant, faire un truc
                  iA = iA+1
              ElseIf fichierManquant.cells(iM,1) < fichierABP.cells(iA,1) Then
                  ' Référence de fichierManquant non existante dans fichierABP, faire un truc
                  iM = iM+1
              End If
          
          End While



          • Partager sur Facebook
          • Partager sur Twitter

          Réduire le temps d’exécution d'une boucle do While

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown