Exécution macro VBA lente : Possibilité d'optimisation ???

Bonjour,

Je viens de commencer à créer des macros sur VBA, je n'ai donc surement pas le code optimal pour que la macro s'exécute rapidement malgré la simplicité du code...

Peut être pourriez-vous me conseiller pour améliorer les performances de l'exécution des macro ?

Je cherche copier les valeurs présentes dans les cellules du feuille ("test") si celles-ci sont au dessus d'une certaine valeur et les remettre dans une feuille "copie" à la même position. Si la condition n'est pas respectée alors la cellule de la même position dans la feuille "copie" prend une valeur arbitraire.

Ci dessous mon code sachant que j'ai environ 50 lignes et 600 colonnes à parcourir.

Sub Condition()

Dim j As Integer
Dim i As Integer

Worksheets("test").Activate

Dim d As Integer
Dim f As Integer
Dim k As Integer
Dim l As Integer
Dim v As Double
Dim g As Double

'Test pour chercher toutes les intensités au dessus d'une valeur seuil
'Soit j les colonnes à parcourir et i les lignes à parcourir
'Soit k et l les lignes de début et de fin à parcourir
'Soit d et f les colonnes de début et de fin de la fenetre à parcourir
'Soit v la valeur seuil
'Soit g la valeur prise par touts les pixels d'intensités inférieures à v

d = Range("E2").Value
f = Range("E3").Value
k = Range("G2").Value
l = Range("G3").Value
v = Range("D4").Value
g = Range("G4").Value

For i = k To l
'Parcours les lignes entre k et l
For j = d To f
'Parcours les colonnes sur toute la fenetre

If Cells(i, j) < v Then
'Si l'intensité est inferieur au seuil
Sheets("copie").Cells(i, j).Value = g
'Alors dans la feuille copie les valeurs sont mises à g


ElseIf Cells(i, j) >= v Then
'Si l'intensité est supérieure ou égale au seuil
Worksheets("Copie").Cells(i, j).Value = Worksheets("test").Cells(i, j).Value
'Alors la valeur est copiée dans la feuille copie

End If


Next
Next

MsgBox ("Tout est copié !")

End Sub

Je vous remercie par avance de votre aide :)

Bonne journée

bonjour,

une proposition (non testée)

Sub Condition()

    Dim j As Long, i  As Long, nl As Long, nc As Long
    Dim tr()
    Dim d As Long, f As Long, k As Long, l As Long
    Dim v As Double
    Dim g As Double
    Dim wst, wsc, t
    'Test pour chercher toutes les intensités au dessus d'une valeur seuil
    'Soit j les colonnes à parcourir et i les lignes à parcourir
    'Soit k et l les lignes de début et de fin à parcourir
    'Soit d et f les colonnes de début et de fin de la fenetre à parcourir
    'Soit v la valeur seuil
    'Soit g la valeur prise par touts les pixels d'intensités inférieures à v
    Set wst = Sheets("test") 'feuille source
    Set wsc = Sheets("copie") 'feuille résultat
    With wst
        d = .Range("E2").Value
        f = .Range("E3").Value
        k = .Range("G2").Value
        l = .Range("G3").Value
        v = .Range("D4").Value
        g = .Range("G4").Value
        nl = l + 1 - k ' nombre de lignes
        nc = f + 1 - d 'nombre de colonnes
        'copie données dans tableau t
        t = .Cells(k, d).Resize(nl, nc)
    End With
    ' dimensionne tableau résultat
    ReDim tr(1 To nl, 1 To nc)
    For i = 1 To nl
        'Parcours les lignes entre k et l
        For j = 1 To nc
            'Parcours les colonnes sur toute la fenetre

            If t(i, j) < v Then
                'Si l'intensité est inferieur au seuil
                tr(i, j) = g
                'Alors dans la feuille copie les valeurs sont mises à g
            Else
                'Si l'intensité est supérieure ou égale au seuil
                tr(i, j) = t(i, j)
                'Alors la valeur est copiée dans la feuille copie
            End If
        Next
    Next
    'copie tableau résultat sur feuille résultat
    wsc.Cells(k, d).Resize(nl, nc) = tr
    MsgBox ("Tout est copié !")
End Sub

Bonjour h2so4,

Merci beaucoup pour cette réponse j'ai appris plein d'astuce de rédaction avec votre proposition. En effet cela fonctionne mais je ne comprends pas pourquoi le mien est si lent en comparaison lorsque les dimensions de mon tableau sont plus importante ?

Je vous remercie encore de votre aide.

bonjour,

En effet cela fonctionne mais je ne comprends pas pourquoi le mien est si lent en comparaison lorsque les dimensions de mon tableau sont plus importante ?

chaque interaction avec un objet excel consomme beaucoup de temps. Particulièrement en mode écriture, par exemple lors de l'écriture d'une valeur dans une cellule, excel effectue toute une série d'opérations (contrôles, conversion, format, vérification de l'impact sur les autres cellules, affichage, (re)calcul, gestion d'évènements...). On peut gagner du temps en demandant de ne pas mettre à jour l'affichage (screenupdating), le recalcul (calculation), les évènements(enableevents), mais le plus efficace est de limiter les interactions entre VBA et Excel au maximum

Rechercher des sujets similaires à "execution macro vba lente possibilite optimisation"