Accélérer code vba
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Accélérer code vba



  1. #1
    Varchamb

    Accélérer code vba


    ------

    Bonjour à tous les membres du forum,

    J'ai une question d'ordre général concernant l'accélération / l'optimisation des macros. Lorsque l'on tape ce thème dans un moteur de recherche on peut trouver certaines pages détaillant des petites astuces.
    Dans la page suivante :
    http://http://www.xcell.excelabo.net/acceleration_vba
    l'auteur nous explique au point 1 D qu'il faut mieux utiliser For each, plutot que boucler avec i = 1, j= 1, i=i+1 etc.

    Et au point 3 A, il nous explique qu'il est bcp plus rapide, non pas d'utiliser For each ..., mais plutot de passer par un For i=1 to 500, etc.

    J'ai du mal à bien cerner la différence entre les deux exemples.
    Quelqu'un pourrait il apporter des explications supplémentaires ?

    Cordialement,

    Varchamb

    -----

  2. #2
    Varchamb

    Re : Accélérer code vba

    En fait, je me pose cette question car j'ai créé une macro utilisant à plusieurs reprise For each (voici un extrait) :
    Code:
    For Each Cellule In Sheets("base").Range("U2:U" & FinTabBase)
            'je repère le numéro de facture dont il s'agit
            NFact = Sheets("base").Range(Cellule.Offset(0, -19).Address).Value
            'je cherche si une cellule contient une date de liquidation
        If Cellule.Value <> "" Then
            'si ce numéro de facture est déjà présent dans la feuille Soldé, alors
            Set d = Sheets("Soldé").Range("B2:B" & FinTabSoldé).Find(NFact, LookAt:=xlWhole)
            If Not d Is Nothing Then
                'je copie/colle les cellules au cas où il y aurait eu des changements (peu probable)
                Ligne = Sheets("Soldé").Range(d.Address).Row
                Sheets("Base").Range(Cellule.Offset(0, -20), Cellule.Offset(0, -9)).Copy Destination:=Sheets("Soldé").Range("A" & Ligne)
            'autrement,
            Else


    ce qui avait permis d'améliorer grandement le traitement par rapport à la première version de ma macro qui utilisait des boucles For I =2 to 500 extrait :
    Code:
    FinTab1 = Feuil1.Range("C7000").End(xlUp).Row         ' nomme la fin de mon tableau en Feuil 1
    FinTab2 = Feuil2.Range("C7000").End(xlUp).Row         ' nomme la fin de mon tableau en Feuil 2
    FinTab3 = Feuil3.Range("C7000").End(xlUp).Row         ' nomme la fin de mon tableau en Feuil 3
    
    For i = 2 To FinTab1
    VF = False
        If Feuil1.Range("L" & i) = "" Then                  'si cellule Li Feuil1 est vide, alors
           j = 1
            Do While j <= FinTab2                            'Tant que j<Fintab2, fais j+1
                j = j + 1
                    If VF = True Then
                        Exit Do
                    End If
                    
                    If Feuil1.Range("F" & i) = Feuil2.Range("C" & j) Then 'si cellule Fi Feuil1 = Cj Feuil2, alors
                        Feuil1.Range("A" & i, "F" & i).Copy Feuil2.Range("A" & j) 'copie colle
                        Feuil1.Range("AL" & i).Copy Feuil2.Range("G" & j)
                        Feuil1.Range("G" & i, "H" & i).Copy Feuil2.Range("H" & j)
                        Feuil1.Range("P" & i).Copy Feuil2.Range("J" & j)
                        Feuil1.Range("m" & i).Copy Feuil2.Range("k" & j)
                        Feuil1.Range("j" & i, "k" & i).Copy Feuil2.Range("l" & j)
                        Feuil1.Range("l" & i).Copy Feuil2.Range("v" & j)
                        VF = True                                                   'VF égale true
                    End If
            Loop
    Et je me demande maintenant si ma macro ne pourrait pas etre bien mieux écrite et plus rapide sur la base de mon post précédent.

  3. #3
    cherbe

    Re : Accélérer code vba

    Citation Envoyé par Varchamb Voir le message
    Et je me demande maintenant si ma macro ne pourrait pas etre bien mieux écrite et plus rapide sur la base de mon post précédent.
    Je ne vois pas quelle amélioration apporter à ce code.
    Il y a un truc qui accélère beaucoup l'exécution, c'est la désactivation de l'affichage :
    Code:
    Application.ScreenUpdating = False
    et réactiver à la fin :
    Code:
    Application.ScreenUpdating = True

Discussions similaires

  1. Accélérer évaporation
    Par Scheffer dans le forum Chimie
    Réponses: 7
    Dernier message: 12/06/2013, 09h18
  2. Accélérer la solubilisation
    Par invite231234 dans le forum Chimie
    Réponses: 4
    Dernier message: 13/06/2011, 15h11
  3. Un langage codé léger, 2 caractères non codé=1 caractère codé. Une solution?
    Par invite06e0b926 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 30/06/2010, 10h02
  4. Accélérer à 1G longtemps
    Par Jiav dans le forum Physique
    Réponses: 13
    Dernier message: 27/02/2008, 19h01
  5. accelerer le streaming
    Par invitedd78a7b4 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 14/04/2007, 16h48