Différence de durée d'une procédure VBA

Bonjour,

Ci-joint vous retrouverez un classeur où j'ai mis les infos nécessaires à ma question (Il y a tout un fichier sinon) et vous pourrez constater qu'il y a deux procédures en VBA.

En les exécutant dans le fichier "Help", la durée est de 00min05s tandis que dans l'original si je lance les deux procédures manuellement, elles ont une durée de 00min52s. Par contre si je décide d'exécuter toute ma macro du fichier original (Une dizaine de procédures) le temps se décuple et on approcherait plutôt les 03min.

Je voulais savoir si sans accéder au fichier original (Données à l'intérieur qu'il faudrait anonymiser) pourquoi de tels écarts peuvent apparaître ? De plus si vous avez des suggestions d'améliorations de mes procédures, j'en serais ravi car je me juge encore comme débutant/intermédiaire et j'ai essayé d'appliquer les tableaux dynamiques.

Je vous remercie d'avance de votre aide et si cela est nécessaire pour répondre à la question j'essaierais d'anonymiser mon fichier original pour avoir le document complet et pas seulement la partie liée à ma procédure.

8help.xlsm (40.10 Ko)

Bonjour à tous

Accélérer les macros (25X plus rapide)

Sub xxxxxxxx()

Déclarer les variables ‘C’est important pour la vitesse d’exécution
Application.Calculation = xlCalculationManuel ‘stopper les calculs
Application.ScreenUpdating = false ‘stopper le rafraichissement de l’écran

Traitement de la macro

[B9] = [B7] * [B8] ‘Eviter au maximum l’utilisation des range et Select

Application.Calculation = xlCalculationAutomatic ‘réactiver les calculs
Application.ScreenUpdating = True ‘réactiver le rafraichissement de l’écran

End Sub

Sur le coup les variables sont bien déclarées

Bonsoir,

pour ajouter une précision non négligeable, il est également, quand c'est possible, nécessaire de ne pas faire d'accès feuille dans les boucles.
En effet, sous VBA l'accès à la feuille, aux cellules c'est très long, on récupère de la vitesse en supprimant la mise à jour de l'écran mais on peut faire beaucoup mieux !

Ici dans votre cas, je vous propose deux accès feuilles : le premier pour mettre en mémoire les données sur lesquels on va travailler, puis un deuxième pour inscrire le résultat du travail, tout le reste est une histoire de boucle en VBA et en mémoire vive donc, au résultat un travail plus rapide du processeur.

Le code qui combine vos deux procédures et qui par son fonctionnement supprime vos boucle de transformation de formule en valeur :

Sub Lrd()
    Dim Tablo, I, Delai
    Delai = Timer
    Tablo = Sheets("Feuil1").Range("V2:X" & Sheets("Feuil1").Range("V" & Rows.Count).End(xlUp).Row)
    For I = 1 To UBound(Tablo)
        If Tablo(I, 1) <> "V" Then
            Tablo(I, 2) = IIf(Tablo(I, 1) = "Matched", "Matched", Left(Tablo(I, 1), 9)) 
            Tablo(I, 3) = IIf(Tablo(I, 1) = "Matched", "", IIf(Right(Tablo(I, 1), 1) = 1, "UTI", IIf(Right(Tablo(I, 1), 1) = 2, "ACTION_TYPE", "EVENT_DATE"))) 
        End If
    Next I
    Range("Y2").Resize(UBound(Tablo, 1), UBound(Tablo, 2)) = Application.Transpose(Application.Transpose(Tablo))
    MsgBox Timer - Delai & " seconde"
End Sub

Le fichier :

5lrd.xlsm (55.97 Ko)

Le résultat est inscrit en colonne Y afin de comparer et de constater "l'égalité" de ce dernier avec vos anciennes procédures.

@ bientôt

LouReeD

Bonjour à tous,
Une autre procédure à adapter au besoin.
Bon weekend
Cdlt.

1help.xlsm (29.69 Ko)
Public Sub V_1_2()
'Déclaration des variables
Dim ws As Worksheet, tbl As Variant, arr() As Variant, I As Long

    'Initialisation des variables
    Set ws = ActiveWorkbook.Worksheets(1)
    tbl = ws.Cells(2, 22).CurrentRegion.Value
    ReDim arr(1 To UBound(tbl), 1 To 2)

    'Traitement des données
    For I = LBound(tbl) To UBound(tbl)
        If tbl(I, 1) = "Matched" Then
            arr(I, 1) = tbl(I, 1)
        Else
            arr(I, 1) = VBA.Split(tbl(I, 1))(0)
            Select Case VBA.Split(tbl(I, 1))(1)
                Case 1: arr(I, 2) = "UTI"
                Case 2: arr(I, 2) = "ACTION_TYPE"
                Case Else: arr(I, 2) = "EVENT_DATE"
            End Select
        End If
    Next I

    'Restitution
    ws.Cells(2, 25).Resize(UBound(tbl), 2).Value = arr

End Sub

Bonjour le fil, fcyspm30

Traitement de la macro

[B9] = [B7] * [B8] ‘Eviter au maximum l’utilisation des range et Select

Alors là, navré, mais absolument pas d'accord

Coder les cellules entre crochets, oblige VBA à les interpréter d'abord, fait donc perdre du temps

Les crochets = Evaluate()

Je suis juste de passage, mais je ne peut pas laisser dire ce genre de chose.

A+

Bonjour à tous

Avant de dire des bétises j'avais fait ces deux bout de code qui font le même travail

Sub calcul1()
        timerdebut = Timer
     For i = 1 To 1000
        Range("A7").Select
        valeurA = Selection.Value
        Range("B7").Select
        valeurB = Selection.Value
        Range("C7").Select
        Selection = valeurA * valeurB
    Next
        MsgBox "Durée : " & (Timer - timerdebut) & " sec."
  End Sub

Sub calcul2()
     timerdebut = Timer
     For i = 1 To 1000
           [C7] = [A7] * [B7]
   Next
       MsgBox "Durée : " & (Timer - timerdebut) & " sec."
   End Sub

Pour le premier le timer me donne 3,31 secondes alors que le deuxième me donne 0,46 secondes. Là je ne sais pas où est l'erreur. Peut-être que je me trompe.

Sub calcul1()
        timerdebut = Timer
     For i = 1 To 1000
        Range("C7")=Range("A7")*Range("B7")
    Next
        MsgBox "Durée : " & (Timer - timerdebut) & " sec."
  End Sub

Sub calcul2()
     timerdebut = Timer
     For i = 1 To 1000
           [C7] = [A7] * [B7]
   Next
       MsgBox "Durée : " & (Timer - timerdebut) & " sec."
   End Sub

Ceci dit j'ai fait ces deux codes et effectivement les "range" sont plus rapides que les crochets

Et oui les Select sont chronophages...

Vous l'aviez dit vous même !

En plus les [] dans des boucles avec des variables n'est ce pas plus compliqué ?

@ bientôt

LouReeD

Merci beaucoup à vous deux @LouReeD et @Jean-Eric, vos procédures fonctionnent parfaitement bien et à une vitesse incroyable.

Je vais les étudier de mon côté pour comprendre comment vous les avez construits car vos procédures sont plus courtes que les miennes, semblent moins lourdes à écrire et sont pourtant bien plus performantes !

Mais de ce que j'ai compris c'est l'utilisation de données dans des tableaux qui rend tout ça si rapide...

D'ailleurs @LouReeD quand tu parles "d'accès feuille" dans ma procédure tu fais référence à quelle ligne exactement ? En quelque sorte si j'ai bien compris ce commentaire c'est le fait de travailler directement sur ma feuille plutôt que d'en extraire les données pour améliorer son efficacité ?

Merci encore pour votre aide rapide et claire

Bonjour

Pour moi les accès feuilles sont toutes les operations faite sur la feuille, que ce soit au niveau des valeurs ou bien des mises en formes.

@ bientôt

LouReeD

Rechercher des sujets similaires à "difference duree procedure vba"