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 de code


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Par défaut Optimisation de code
    Bonjour, j'ai fait un petit macro sous excel mais il est tres lent lorsque j'ai beaucoup de donnees.

    Donc je me demandais est ce que vous voyez un moyen d'optimiser cette partie du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    rowNum2 = 16
            Do Until Worksheets("feuille").Cells(rowNum2, 1) = ""
                If Worksheets("feuille").Cells(rowNum, 2) < Worksheets("feuille").Cells(11, 3) Then
                Worksheets("feuille").Cells(rowNum2, 10).FormulaR1C1 = "=(R7C3*(RC[-1]^3)+R8C3*(RC[-1]^2)+R9C3*RC[-1]+R10C3)" 'Calculation
                Else
                Worksheets("feuille").Cells(rowNum2, 10).FormulaR1C1 = "=(R7C3*(RC[-2]^3)+R8C3*(RC[-2]^2)+R9C3*RC[-2]+R10C3)" 'Calculation
                End If
            rowNum2 = rowNum2 + 1
            Loop
    Donc voila, vous comprendrez que sur une feuille de 12 000 lignes, ca devient assez long a remplir...
    C'est pourquoi j'aimerai savoir comment je pourrais modifier le code pour accelerer les choses ;-)

    Ce code dois verifier si la valeur de la (ligne X,colonne2) est plus grande qu'une constante.
    Si la valeur est plus petite je fait un calcule a partir de (ligneX, colonne-1)
    Si la valeur est plus grande je doir faire le meme calcule mais cette fois avec (ligneX, Colonne-2)

    Bon j'espere que j'ai ete clair.
    Merci d'avance
    Sedam

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    Bonjour,

    une première optimisation possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim rowNum2 as Integer = 16
    Dim constant as Integer = Worksheets("feuille").Cells(11, 3)
     
    Do Until Worksheets("feuille").Cells(rowNum2, 1) = ""
                If Worksheets("feuille").Cells(rowNum, 2) < constant Then
                Worksheets("feuille").Cells(rowNum2, 10).FormulaR1C1 = "=(R7C3*(RC[-1]^3)+R8C3*(RC[-1]^2)+R9C3*RC[-1]+R10C3)" 'Calculation
                Else
                Worksheets("feuille").Cells(rowNum2, 10).FormulaR1C1 = "=(R7C3*(RC[-2]^3)+R8C3*(RC[-2]^2)+R9C3*RC[-2]+R10C3)" 'Calculation
                End If
            rowNum2 = rowNum2 + 1
            Loop
    mais bon, il ne faut pas t'attendre à des miracles je pense.

  3. #3
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Tu n'aurais pas la possibilité de trier au préalable ton tableau pas rapport à ta colonne 10 ?
    Il me semblerait que ce serait alors plus simple puisque tu ferais un truc du genre (pseudocode à ma manière) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tant que colonne(10) < constante
      faire ça
    fin tant que
    faire jusqu'à la fin
      faire l'autre truc
    fin
    A mon avis ça prendrait moins de temps que de faire ton if nombreDeLignes fois.

    Après pour la lisibilité du code (je ne sais pas si ça améliore les perfs) je mettrais un petit With :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With Worksheets("feuille")
        Do Until .Cells(rowNum2, 1) = ""
            If .Cells(rowNum, 2) < constant Then
                .Cells(rowNum2, 10).FormulaR1C1 = "=(R7C3*(RC[-1]^3)+R8C3*(RC[-1]^2)+R9C3*RC[-1]+R10C3)" 'Calculation
            Else
                .Cells(rowNum2, 10).FormulaR1C1 = "=(R7C3*(RC[-2]^3)+R8C3*(RC[-2]^2)+R9C3*RC[-2]+R10C3)" 'Calculation
            End If
            rowNum2 = rowNum2 + 1
        Loop
     
    End With

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Par défaut
    Wow merci a vous deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim constant as Integer = Worksheets("feuille").Cells(11, 3)
    J'avoue que ca va deja aider un peu, je viens de me rendre compte que je n'utilise pas assez les avriables et les constantes quand je peux le faire. Ca m'ouvre un peu les yeux, merci

    caro95470, je comprend bien le principe, merci je vais essayer ca.
    Et cool pour le fonction with, je ne savais pas que ca existait, mon code risque d'etre beaucoup plus lisble.

    Merci encore

  5. #5
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Après je te conseille fortement de chercher dans la

    Par exemple :
    Comment retrouver les numéros des dernières lignes et dernières colonnes renseignées dans une feuille ?

    Te permettrait d'éviter le do until qui fait la comparaison à chaque fois.

    As-tu pensé aussi à mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.DisplayAlerts = False
    'Tout ton code ici
    Application.DisplayAlerts = True
    En général ça va un peu plus vite et surtout ça pique moins les yeux.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Par défaut
    Tu peux aussi regarder du côté de Application.Calculation , propriété qui définit comment Excel (re)calcule les formules. Il s'agirait de le faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationManual
    au début du traitement pour éviter les recalculs intermédiaires à chaque itération, puis de repasser en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationAutomatic
    à la fin, avec un appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculate()
    pour provoquer le recalcul final.

    Je n'ai pas testé moi-même...

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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