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 SubBonjour 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