IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Accélérer une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Juillet 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2018
    Messages : 14
    Par défaut Accélérer une macro
    Bonjour,

    Je cherche à accélérer une macro faisant des calculs en chaine.
    Chaque ligne de ma feuille Excel effectue un calcul distinct, prenant entre 1.33 s et 1.37 s, chacun.
    Cependant, je m’apprête à utiliser : 180000*5=900000 lignes (et peut être encore plus par la suite, auquel cas j'emplirai toutes les lignes disponibles).
    Donc un total de plus de 330h.

    Ma feuille de calcul contient de nombreuses cellules se recalculant à chaque ligne :
    - les cellules de calcul 19 à 59 sont utiles aux itérations de la ligne en cours
    - les 24 cellules suivantes et les 7 précédentes n’ont pas besoin de se mettre à jour
    => j'aimerais bloquer le recalcul automatique des cellules, sauf celles qui me servent précisément, ainsi, je pense que cela diminuerai la consommation

    Si au lieu d'utiliser des cellules avec formules je saisissais tout en VBA, serait-ce un gain de performances ?
    Est-ce que arrêter la macro de temps en temps et redémarrer l'ordinateur peut provoquer un gain de performances ?

    Merci d'avance pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub calcul_2()
    'MBE
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Dim start As Single
    Dim nbcalculs As Double
    start = Timer
    nbcalculs = Feuil7.Cells(3, 1).Value
    For a = 4 To nbcalculs
        If Feuil7.Cells(a, 18) = "" Then
            Tinf = 20: Tsup = 1199
            Feuil7.Cells(a, 18) = 0
            Feuil7.Rows(a:a).Calculate 'je voudrais que seule la ligne en cours se recalcule. Dans l’idéal uniquement de la colonne 19 à la colonne 59 inclues
        Do While (Tsup - Tinf) > 1
            Feuil7.Cells(a, 25) = (Tinf + Tsup) / 2
        If Feuil7.Cells(a, 60) < 1 And Feuil7.Cells(a, 19) < 1 Then
            Tinf = (Tinf + Tsup) / 2
        Else
            Tsup = (Tinf + Tsup) / 2
        End If
        Loop
            t1 = (Tinf + Tsup) / 2
            Feuil7.Cells(a, 18) = Format(t1, 0)
            Feuil7.Cells(1, 18) = a / Feuil7.Cells(3, 1).Value 'Cette fonction écrit le pourcentage d'avancement global
        End If
    Next
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    MsgBox "Durée : " & Timer - start & " secondes"
    End Sub

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    Si au lieu d'utiliser des cellules avec formules je saisissais tout en VBA, serait-ce un gain de performances ?
    non ca certainement pas par contre tout avec formule oui

    Est-ce que arrêter la macro de temps en temps et redémarrer l'ordinateur peut provoquer un gain de performances ?
    non ca n'a rien a voir ou si peu en fait

    je serais toi je ferais tout en formule

    tu peux toujour déactiver la calculate quand tu n'en a pas besoins
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Juillet 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2018
    Messages : 14
    Par défaut
    J'ai effectué un passage de l'ensemble des opérations en de la feuille excel vers VBA : énorme gain de temps, le temps de calcul étant divisé par plus de 1750 (!!).
    Si quelqu'un ouvre ce sujet avec cette même question : ça marche.

    Désactiver la calculate n'a pas refait gagner de temps par rapport au passage en tout macro par contre.


    Par contre le script suivant prend du temps et je n'arrive pas à l'optimiser.
    Objectif des prochains jours quand j'aurai du temps ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub synthese()
    'Pour chaque élément identifie le résultat le plus faible parmi les différents cas étudiés.
    Dim i As Long
    Dim j As Long
    Dim a As Long
    Dim b As Long
     
    b = 3
    Feuil4.Range("A3:E12000").Clear
     
    For i = 4 To Feuil7.Cells(3, 1) + 3
    a = 1
        If Feuil7.Cells(i, 1) <> "" Then
            For j = 3 To 550
                If Feuil4.Cells(j, 1) = Feuil7.Cells(i, 1) Then
                    a = j
                    Exit For
                End If
            Next
            If a = 1 Then
                Feuil4.Cells(b, 1) = Feuil7.Cells(i, 1)
                Feuil4.Cells(b, 3) = Feuil7.Cells(i, 18)
                Feuil4.Cells(b, 4) = Feuil7.Cells(i, 4)
                Feuil4.Cells(b, 2) = Feuil7.Cells(i, 2)
                Feuil4.Cells(b, 5) = Feuil7.Cells(i, 3)
                b = b + 1
            End If
            If Feuil7.Cells(i, 1) = Feuil4.Cells(a, 1) And Feuil7.Cells(i, 18) < Feuil4.Cells(a, 3) Then
                Feuil4.Cells(a, 3) = Feuil7.Cells(i, 18)
                Feuil4.Cells(a, 4) = Feuil7.Cells(i, 4)
                Feuil4.Cells(a, 2) = Feuil7.Cells(i, 2)
                Feuil4.Cells(a, 5) = Feuil7.Cells(i, 3)
            End If
        End If
    Next
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Sub synthesev02()
    'Pour chaque élément identifie le résultat le plus faible parmi les différents cas étudiés.
    'requiert l'utilisation préalable d'un tri de façon à ordonner la colonne A de la feuille de calcul dans l'ordre alphabétique
    'A optimiser encore : vérifier que la fonction marche, discutable actuellement
    Dim i As Long
    Dim a As Long
    Dim start As Single
    start = Timer
     
    a = 3
    For i = 4 To Feuil7.Cells(3, 1) + 3
        If Feuil10.Cells(a, 1) = "" Then
            Feuil10.Cells(a, 1) = Feuil7.Cells(i, 1)
            Feuil10.Cells(a, 2) = Feuil7.Cells(i, 2)
            Feuil10.Cells(a, 3) = Feuil7.Cells(i, 18)
            Feuil10.Cells(a, 4) = Feuil7.Cells(i, 4)
            Feuil10.Cells(a, 5) = Feuil7.Cells(i, 3)
            Feuil10.Cells(a, 6) = Feuil7.Cells(i, 41)
        Else
            If Feuil10.Cells(a, 1) = Feuil7.Cells(i, 1) Then
                If Feuil10.Cells(a, 3) > Feuil7.Cells(i, 18) Then
                    Feuil10.Cells(a, 3) = Feuil7.Cells(i, 18)
                    Feuil10.Cells(a, 4) = Feuil7.Cells(i, 4)
                End If
            Else
                a = a + 1
            End If
        End If
    Next
     
    MsgBox "Durée : " & Round(Timer - start, 1) & " secondes"
    End Sub

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    ?????

    -En transférer les champs du tableur dans des Arrays().
    -Effectuer les calculs sur les Arrays().
    -En transférert les Arrays dans le tableur.




    Boisgontier

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Par défaut
    juste a titre indicatif

    j'avais un classeur avec enormement de formules , mais je n'avais pas besoin des résultats en mode constant
    j'ai donc fait une macro qui passer mes formules en Matricielles
    j'utiliser donc la macro , que dans le cas de nécessité d'avoir les résultats
    ca liberrer donc de la mémoire

    ca peu , peu être aider

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur Génie Civil
    Inscrit en
    Juillet 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Génie Civil
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2018
    Messages : 14
    Par défaut
    Je n'avais pas pensé à utiliser Arrays(), je vais creuser de ce côté là.
    Merci pour la piste.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Accélérer une Macro
    Par Didpa dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/05/2018, 08h54
  2. [XL-2010] Accélérer une macro
    Par houssem1807 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/07/2016, 23h40
  3. Comment accélérer une macro excel
    Par fredems dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/11/2014, 16h19
  4. Accélérer une macro
    Par hehee dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/05/2013, 21h09
  5. [XL-2003] Comment accélérer l'execution d'une macro
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/01/2011, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo