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


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
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut Optimisation d'un code
    Bonjour tous le monde , j'ai vraiment besoin de votre aide précieuse , voila je vois explique , je suis en stage de fin d'etude Ingénieur , et j'ai la charge d'améliorer un logiciel sur VBA , pour le moment j'ai pu porter la majorité des modifications avec suces , le seul soucis c'est que il met un temps enorme à se charger car le programme effectue des enormes calculs des le debut , donc si quelqu'un peut m'aider à mettre sous forme ittératif ce petit programme ( cad sous forme de tableau ou bien .... ) :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
     
    Sub calcul()
     
     
    Dim couple(1 To 13) As Single
    Dim i As Integer
    Dim j As Integer
    Dim Ld As Single
    Dim Lq As Single
    Dim Kt As Single
    Dim CoupleAVide As Single
    Dim CoupleCharge75 As Single
    Dim CoupleCharge15 As Single
    Dim CoupleCharge18 As Single
    Dim CoupleCharge20 As Single
    Dim CoupleCharge25 As Single
    Dim CoupleCharge3 As Single
    Dim CoupleNominal As Single
     
     
    With Worksheets("Performances")
     
        ' chaque couple correspond à un tableau à couple constant
        couple(1) = .Range("D32").Value
        couple(2) = .Range("D49").Value
        couple(3) = .Range("D66").Value
        couple(4) = .Range("D83").Value
        couple(5) = .Range("D100").Value
        couple(6) = .Range("D117").Value
        couple(7) = .Range("D134").Value
        couple(8) = .Range("D151").Value
        couple(9) = .Range("D168").Value
        couple(10) = .Range("D185").Value
        couple(11) = .Range("D202").Value
        couple(12) = .Range("D219").Value
        couple(13) = .Range("D237").Value ' valeur du couple nominal
     
     
        CoupleNominal = .Range("D8").Value
        CoupleAVide = 0
        CoupleCharge75 = 0.75 * CoupleNominal
        CoupleCharge15 = 1.5 * CoupleNominal
        CoupleCharge18 = 1.8 * CoupleNominal
        CoupleCharge20 = 2 * CoupleNominal
        CoupleCharge25 = 2.5 * CoupleNominal
        CoupleCharge3 = 3 * CoupleNominal
     
     
     For i = 1 To 13 'boucle sur les 7 tableaux à couple constant
            'calcul de Ld, Lq, Kt
            If couple(i) = CoupleAVide Then
                '=> valeur fixe, non fonction du couple
                Ld = .Range("O4").Value
                Lq = .Range("O5").Value
                Kt = .Range("O6").Value
            End If
     
            If couple(i) > CoupleAVide And couple(i) < CoupleCharge75 Then
                'fonction du couple
                Ld = .Range("O8").Value * couple(i) + .Range("O9")
                Lq = .Range("O10").Value * couple(i) + .Range("O11")
                Kt = .Range("O12").Value * couple(i) + .Range("O13")
            End If
     
            If couple(i) >= CoupleCharge75 And couple(i) < CoupleNominal Then
                'fonction du couple
                Ld = .Range("Q8").Value * couple(i) + .Range("Q9")
                Lq = .Range("Q10").Value * couple(i) + .Range("Q11")
                Kt = .Range("Q12").Value * couple(i) + .Range("Q13")
            End If
     
     
          If couple(i) >= CoupleNominal And couple(i) < CoupleCharge15 Then
                'fonction du couple
                Ld = .Range("S8").Value * couple(i) + .Range("S9")
                Lq = .Range("S10").Value * couple(i) + .Range("S11")
                Kt = .Range("S12").Value * couple(i) + .Range("S13")
            End If
     
         If couple(i) >= CoupleCharge15 And couple(i) < CoupleCharge18 Then
                'fonction du couple
                Ld = .Range("U8").Value * couple(i) + .Range("U9")
                Lq = .Range("U10").Value * couple(i) + .Range("U11")
                Kt = .Range("U12").Value * couple(i) + .Range("U13")
           End If
     
          If couple(i) >= CoupleCharge18 And couple(i) < CoupleCharge20 Then
                'fonction du couple
                Ld = .Range("W8").Value * couple(i) + .Range("W9")
                Lq = .Range("W10").Value * couple(i) + .Range("W11")
                Kt = .Range("W12").Value * couple(i) + .Range("W13")
            End If
     
          If couple(i) >= CoupleCharge20 And couple(i) < CoupleCharge25 Then
                'fonction du couple
                Ld = .Range("Y8").Value * couple(i) + .Range("Y9")
                Lq = .Range("Y10").Value * couple(i) + .Range("Y11")
                Kt = .Range("Y12").Value * couple(i) + .Range("Y13")
            End If
     
          If couple(i) >= CoupleCharge25 Then
                'fonction du couple
                Ld = .Range("AA8").Value * couple(i) + .Range("AA9")
                Lq = .Range("AA10").Value * couple(i) + .Range("AA11")
                Kt = .Range("AA12").Value * couple(i) + .Range("AA13")
            End If
     
     
     
            'transfert des valeurs de Ld, Lq et Kt dans la feuille de calcul "Performances"
            Select Case i
                Case 1
                    .Range("J36").Value = Ld
                    .Range("I36").Value = Lq
                    .Range("E36").Value = Kt
     
                Case 2
                    .Range("J53").Value = Ld
                    .Range("I53").Value = Lq
                    .Range("E53").Value = Kt
     
                Case 3
                    .Range("J70").Value = Ld
                    .Range("I70").Value = Lq
                    .Range("E70").Value = Kt
     
                Case 4
                    .Range("J87").Value = Ld
                    .Range("I87").Value = Lq
                    .Range("E87").Value = Kt
     
                Case 5
                    .Range("J104").Value = Ld
                    .Range("I104").Value = Lq
                    .Range("E104").Value = Kt
     
                Case 6
                    .Range("J121").Value = Ld
                    .Range("I121").Value = Lq
                    .Range("E121").Value = Kt
     
                Case 7
                    .Range("J138").Value = Ld
                    .Range("I138").Value = Lq
                    .Range("E138").Value = Kt
     
                Case 8
                    .Range("J155").Value = Ld
                    .Range("I155").Value = Lq
                    .Range("E155").Value = Kt
     
                Case 9
                    .Range("J172").Value = Ld
                    .Range("I172").Value = Lq
                    .Range("E172").Value = Kt
     
                Case 10
                    .Range("J189").Value = Ld
                    .Range("I189").Value = Lq
                    .Range("E189").Value = Kt
     
                Case 11
                    .Range("J206").Value = Ld
                    .Range("I206").Value = Lq
                    .Range("E206").Value = Kt
     
                 Case 12
                    .Range("J223").Value = Ld
                    .Range("I223").Value = Lq
                    .Range("E223").Value = Kt
     
                Case 13
                    .Range("J241").Value = Ld
                    .Range("I241").Value = Lq
                    .Range("E241").Value = Kt
     
     
     
     
            End Select
        Next i
     
    End With
     
    End Sub

    Merci d'avance !!!!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Par défaut
    Bonjour,
    c'est ce programme-là qui met un temps énorme ? Il peut sans doute être optimisé à la marge, mais je ne vois pas a priori ce qu'il a de si gourmand et je ne pense pas que ça en vaille la peine.
    Ou alors je n'ai pas bien compris ta demande.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Essayez le code suivant sur une copie de votre classeur

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    Sub calcul_pmo()
    Dim LastLig&
    Dim Lastcol&
    Dim S As Worksheet
    Dim R As Range
    Dim var
    Dim couple(1 To 13) As Single
    Dim i As Long
    Dim j As Long
    Dim Ld As Single
    Dim Lq As Single
    Dim Kt As Single
    Dim CoupleAVide As Single
    Dim CoupleCharge75 As Single
    Dim CoupleCharge15 As Single
    Dim CoupleCharge18 As Single
    Dim CoupleCharge20 As Single
    Dim CoupleCharge25 As Single
    Dim CoupleCharge3 As Single
    Dim CoupleNominal As Single
    Set S = Sheets("Performances")
    LastLig& = S.Cells.Find(What:="*", After:=[iv65536], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Lastcol& = S.Cells.Find(What:="*", After:=[iv65536], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
    Set R = Range(S.Cells(1, 1), S.Cells(LastLig&, Lastcol&))
    var = R
    ' chaque couple correspond à un tableau à couple constant
    For i = 1 To 13
      For j = 32 To 236 Step 17
          '---  couple(13) = .Range("D237").Value ' valeur du couple nominal '237 au lieu de 236 ??? ---
        If i = 13 Then j = j + 1
        couple(i) = var(j, 4) 'j=ligne  4=colonne D
      Next j
    Next i
    CoupleNominal = var(8, 4) 'ligne 8, colonne 4 (D)
    CoupleAVide = 0
    CoupleCharge75 = 0.75 * CoupleNominal
    CoupleCharge15 = 1.5 * CoupleNominal
    CoupleCharge18 = 1.8 * CoupleNominal
    CoupleCharge20 = 2 * CoupleNominal
    CoupleCharge25 = 2.5 * CoupleNominal
    CoupleCharge3 = 3 * CoupleNominal
    For i = 1 To 13 'boucle sur les 7 tableaux à couple constant
      'calcul de Ld, Lq, Kt
      If couple(i) = CoupleAVide Then
        '=> valeur fixe, non fonction du couple
        Ld = var(4, 15) 'O4
        Lq = var(5, 15) 'O5
        Kt = var(6, 15) 'O6
      End If
      If couple(i) > CoupleAVide And couple(i) < CoupleCharge75 Then
        'fonction du couple
        Ld = var(8, 15) * couple(i) + var(9, 15)
        Lq = var(10, 15) * couple(i) + var(11, 15)
        Kt = var(12, 15) * couple(i) + var(13, 15)
      End If
      If couple(i) >= CoupleCharge75 And couple(i) < CoupleNominal Then
        'fonction du couple
        Ld = var(8, 17) * couple(i) + var(9, 17)
        Lq = var(10, 17) * couple(i) + var(11, 17)
        Kt = var(12, 17) * couple(i) + var(13, 17)
      End If
      If couple(i) >= CoupleNominal And couple(i) < CoupleCharge15 Then
        'fonction du couple
        Ld = var(8, 19) * couple(i) + var(9, 19)
        Lq = var(10, 19) * couple(i) + var(11, 19)
        Kt = var(12, 19) * couple(i) + var(13, 19)
      End If
      If couple(i) >= CoupleCharge15 And couple(i) < CoupleCharge18 Then
        'fonction du couple
        Ld = var(8, 21) * couple(i) + var(9, 21)
        Lq = var(10, 21) * couple(i) + var(11, 21)
        Kt = var(12, 21) * couple(i) + var(13, 21)
      End If
      If couple(i) >= CoupleCharge18 And couple(i) < CoupleCharge20 Then
        'fonction du couple
        Ld = var(8, 23) * couple(i) + var(9, 23)
        Lq = var(10, 23) * couple(i) + var(11, 23)
        Kt = var(12, 23) * couple(i) + var(13, 23)
      End If
      If couple(i) >= CoupleCharge20 And couple(i) < CoupleCharge25 Then
        'fonction du couple
        Ld = var(8, 25) * couple(i) + var(9, 25)
        Lq = var(10, 25) * couple(i) + var(11, 25)
        Kt = var(12, 25) * couple(i) + var(13, 25)
      End If
      If couple(i) >= CoupleCharge25 Then
        'fonction du couple
        Ld = var(8, 27) * couple(i) + var(9, 27)
        Lq = var(10, 27) * couple(i) + var(11, 27)
        Kt = var(12, 27) * couple(i) + var(13, 27)
      End If
        'transfert des valeurs de Ld, Lq et Kt dans le tableau visual basic
      j = (i - 1) * 17
      If i = 13 Then j = j + 1
      var(36 + j, 10) = Ld
      var(36 + j, 9) = Lq
      var(36 + j, 5) = Kt
    Next i
    'inscription du résultat
    R = var
    End Sub
    Est-ce plus performant ?

    Cordialement.

    PMO

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut
    Je me pose la meme question que Neupont, a savoir quel parti de se code prend du temps?

    Je te conseille 2 choses
    1ere: Rajouter le blocage de la mise a jour écran, je dirais ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    'Stopper le rafraichissement de la fenetre Excel
    Application.screenupdating = False    
     For i = 1 To 13 'boucle sur les 7 tableaux à couple constant
    2eme: les condition If les une derriere les autres sont elles adapté a ce que tu veux faire?
    Dans un tel montage cela suppose que plusieurs des conditions peuvent être vrai pour une même valeur de i. Si ca n'est pas le cas il te faut utiliser une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If ... Then
     
    ElseIf ... then
     
    ElseIf ... Then
     
    ...
     
    End if
    L'avantage ici c'est qu'excel sort de la "boucle" dés qu'il trouve un solution, ça évite de tester toutes les solutions, mais bon ça ne va pas te faire gagné des heure de calcul vu le nombre d'itération.

    Regarde si y'a pas d'autre morceau de code qui traine dans ton fichier et qui seraient exécuter lors de son utilisation.
    A++
    Qwaz

    [Edit]
    Petite remarque sur le code de PMO2017

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set R = Range(S.Cells(1, 1), S.Cells(LastLig&, Lastcol&))
    var = R
    Pourquoi passer par R, sauf erreur tu ne le réutilise a aucun autre endroit
    autant faire directement
    var = Range("A1", "D236").value

    J'ai même mis directement les adresse des cellules, vu que de toute façon la boucle qui suit implique d'aller jusqu'à D236, a moins que je n'ai pas compris.
    [/Edit]

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour Qwazerty,

    Pourquoi passer par R, sauf erreur tu ne le réutilise a aucun autre endroit
    Je le réutilise en fin de procédure pour l'inscription du résultat (toute la feuille est écrite d'un seul coup)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    'inscription du résultat
    R = var
    End Sub
    ***

    J'ai même mis directement les adresse des cellules, vu que de toute façon la boucle qui suit implique d'aller jusqu'à D236, a moins que je n'ai pas compris.
    J'ai préféré monter toutes les cellules en mémoire (dans la variable Variant "var"). Je pars donc de A1 jusqu'à la cellule la plus extrême (dernière ligne, dernière colonne), qu'elle comporte une donnée ou non, n'ayant pas connaissance de la vraie feuille sur laquelle le programme s'applique ni des éventuelles évolutions.
    Cette technique permet de tout travailler en mémoire sans passer par le rafraichissement de la feuille Excel. Ceci est fait, d'un seul coup, en fin de programme par l'instruction R=var.

    Cordialement.

    PMO

  6. #6
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 43
    Par défaut
    j'ai essayer le programme mais y'a un probleme au niveau du var(j, 4) , la valeur du j me donne 69 au lieu du 66 ?? de toute façon je vous ai lis une petite image qui pourras peux etre vous aidez . Merci pour l'enorme aide


    la partie du code qui marche pas bien , et c'est exactement pour la valeur de i = 13 normalement le couple (13) est à D237 !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    For i = 1 To 13
      For j = 32 To 236 Step 17
          '---  couple(13) = .Range("D237").Value ' valeur du couple nominal '237 au lieu de 236 ??? ---
        If i = 13 Then j = j + 1
        couple(i) = var(j, 4) 'j=ligne  4=colonne D
      Next j
    Next i

Discussions similaires

  1. [Optimisation C++] Calcul code altitude
    Par Spout dans le forum C++
    Réponses: 7
    Dernier message: 13/11/2007, 22h17
  2. Y a-t-il une solution pour optimiser mon petit code ?
    Par pierre987321 dans le forum Delphi
    Réponses: 20
    Dernier message: 14/06/2007, 10h53
  3. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    Réponses: 9
    Dernier message: 01/04/2007, 22h04
  4. Optimisation d'un code !
    Par leserapheen dans le forum Pascal
    Réponses: 20
    Dernier message: 09/03/2007, 14h00
  5. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47

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