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 :

Optimisation d'un code VBA [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut Optimisation d'un code VBA
    Bonjour,

    J'ai fait un programme VBA permettant d'obtenir la valeur moyenne de 1000 valeurs simulées.
    Pour cela je simule 1000 fois une feuille Excel en fonction de différents paramètres pour récupérer la valeur d'une cellule puis je fais la moyenne.

    Le souci est que le calcul de beaucoup de pages Excel prend beaucoup de temps, j'ai pu améliorer le code avec des astuces trouvées sur internet mais je n'arrive plus à améliorer le temps d'exécution du programme.
    J'ai pensé à faire un programme qui permettrais de ne plus à avoir à passer par les feuilles Excel mais le problème c'est que je risque d'apporter souvent des modifications sur la feuille ce qui obligerai à modifier le code, de cela me prendrait beaucoup de temps car la feuille Excel est assez complexe.

    C'est pour ça que je viens vous demander des idées ou des conseils pour améliorer mon code actuel.

    Merci beaucoup à tous ce qui pourrait m'aider.


    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    Public Sub simulation()
     
     
        Dim nbsim As Integer
        Dim values(1 To 1000) As Long
     
        nbsim = 1000
     
     
     
                Sheets("Ctrl_T120_A58").Activate
     
     
                   Dim debut As Date, temps As Date, fin As Date
                debut = Time
     
     
        Application.ScreenUpdating = False
     
     
                'Simulation des feuilles excel puis récupération de la valeur dans un vecteur
     
                For I = 1 To nbsim
     
                    Range("sim").Select
                    ActiveCell.FormulaR1C1 = I
                    ActiveSheet.Calculate
     
                    values(I) = Range("noinet").Value
     
                Next
     
     
         Application.ScreenUpdating = True
     
     
            'Calcul de la moyenne
     
            Dim Sum As Double
            Sum = 0
     
            For L = 1 To 1000
     
              Sum = Sum + values(L)
     
            Next L
     
         Range("nbvnet").Value = Sum / 1000
     
     
     fin = Time
     temps = fin - debut
     MsgBox ("C'est fini !" & Chr(10) & "temps de traitement " & temps)
     
     
    End Sub

  2. #2
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour Artention,

    Tu peux déjà enlever les select et la boucle sur L :
    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
    Public Sub simulation()
        Application.ScreenUpdating = False
        Dim nbsim&, v&, i&, debut As Date, temps As Date, fin As Date
            nbsim = 1000
            debut = Time
        With Sheets("Ctrl_T120_A58")
            'Simulation des feuilles excel puis récupération de la valeur dans un vecteur
            For i = 1 To nbsim
                .Range("sim") = i
                .Calculate
                v = v + .Range("noinet")
            Next
            .Range("nbvnet") = v / 1000
        End With
    fin:
        Application.ScreenUpdating = True
            fin = Time
            temps = fin - debut
            MsgBox ("C'est fini !" & Chr(10) & "temps de traitement " & temps)
    End Sub
    Apres je ne sais pas ce que calcul ta feuille, à voir le code ce sont les .Calculate qui sont long (le reste y a pas de raison que ça le soit)
    Peut-être peux-tu calculer plus simplement tes résultats via une fonction VB et ensuite vers la moyenne des résultats de la fonction.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Par défaut
    Bonjour,

    As-tu essayé d'enlever les activate et les select ? Comme par exemple :

    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
     
     
     With Sheets("Ctrl_T120_A58")
                'Simulation des feuilles excel puis récupération de la valeur dans un vecteur
     
                For I = 1 To nbsim
     
                    .Range("sim").FormulaR1C1 = I
                    .Calculate
                    values(I) = .Range("noinet").Value
     
                Next I
         Application.ScreenUpdating = True
     
            'Calcul de la moyenne
     
            Sum = 0
     
            For L = 1 To 1000
                Sum = Sum + values(L)
            Next L
     
         .Range("nbvnet").Value = Sum / 1000
     
     End With

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    N'importe comment, les fonctions intégrées d'Excel, sont plus rapides que VBA.

    Tu mets tes 1000 nombres sur une colonne et tu utilises la moyenne d'Excel:

    En plaçant une formule dans une cellule avec Formula ou FormulaLocal

    ou

    En utilisant application.worksheetfunction(average(plage))

    Ou bien tu te fais un complément COM (une dll) pour Excel avec un Visual Studio pas Express. Cela prend au minimum l'édition gratuite Community (2013 ou 215)

    Ou bien, tu te fais un exécutable autonome qui prend ton classeur Excel comme source de données.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut
    Merci Antony et Aziz, vos réponses m'ont permis de gagner quelques précieuses seconde pour l'exécution du programme.

    Je suis d'accord avec toi Antony, je pense aussi que c'est le calcul de la feuille qui est long. Il y a de nombreuses ligne sur la feuille excel qui sont toutes plus ou moins liées faire une fonction de la feuille me semble vraiment compliqué.
    Lors ce qu'on change de simulation il y a plusieurs données qui sont changées, ces données sont cherchées sur d'autres feuilles excel. J'ai essayé d'éliminer au maximum les Recherchev et de les remplacer par des fonctions Index.

  6. #6
    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
    j'avoue je que j'ai du mal a comprendre pourquoi tu utilise le sheets pendant le calcul

    puisque d'après ce que je vois dans ta boucle tu fait référence qu'a 2 cellules le calcul pourrait il pas se faire dans le code lui même dans une variable tableau

    pour 1000 itération le résultat serait quasi immédiat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For I = 1 To nbsim
     
                    .Range("sim").FormulaR1C1 = I
                    .Calculate
                    values(I) = .Range("noinet").Value
     
                Next I
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tablo=range( xy;az)
    
    For I = 1 To ubound(tablo)
                   values(I) = ""'ici ton calcul avec I qui te renvoie sur noinet avec ta méthode 
     
                Next I
    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

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2015
    Messages : 3
    Par défaut
    Je suis d'accord Patrick, le plus rapide serait de coder directement une fonction permettant d'obtenir la valeur voulue.

    Cependant ma feuille Excel est vraiment compliquée, il y a beaucoup de paramètres qui rentre en jeu dans le calcul de la valeur et beaucoup de colonnes et de lignes (reliées par des formules) sont utilisées, ainsi coder une fonction est difficile, de plus le calcul de la valeur dans la feuille Excel est surement appelé à évoluer ce qui obligerait à recréer de nouvelles fonctions.

    Grâce aux différents conseils, j'ai pu améliorer mon code actuel pour le rendre plus rapide mais il est bien possible que maintenant la seul solution, si je veux qu'il soit plus rapide, c'est de coder une fonction.

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

Discussions similaires

  1. [Toutes versions] Optimiser le code VBA (gestion de liste)
    Par BAHIRI dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/03/2011, 01h10
  2. Optimisation de temps d'exécution d'un Code VBA
    Par Adilleroy dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 26/07/2010, 13h16
  3. Optimisation de code VBA
    Par MartinezGarcia dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/02/2008, 13h11
  4. Optimiser code VBA
    Par willytito dans le forum VBA Access
    Réponses: 5
    Dernier message: 19/11/2007, 09h49
  5. Réponses: 13
    Dernier message: 20/04/2006, 15h37

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