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 code - déclaration des variables


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut Optimisation code - déclaration des variables
    Bonjour à tous,

    Je souhaiterais avoir votre avis concernant la déclaration de variables dans un module contenant plusieurs fonctions et procédures.

    Quels sont les avantages/inconvénients de déclarer les variables à l'intérieur de chacune d'entre elles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Procedure_1()
       dim i as byte
       [...]
    End Sub
     
    Function Fun_1() as string
       dim i as byte
       [...]
    End Function
    Ou alors de les déclarer au début du module pour l'ensemble des fonctions et procédures ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    dim i as byte
     
    Sub Procedure_1()
       [...]
    End Sub
     
    Function Fun_1() as string
       [...]
    End Function
    Il y a-t-il des impacts sur la rapidité du code à s'exécuter, sur la robustesse du code ou autre ?

    Merci d'avance pour vos avis sur la question !

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    La différence, c'est que les variables dans les procédures et fonction sont détruites à la fin et en tête de module, quand tu quittes Excel donc, si tu lance les deux proc ci-dessous l'une après l'autre :
    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
     
    Dim I As Integer
     
    Sub Procedure_1()
     
        I = 10
     
        MsgBox I
     
    End Sub
     
    Sub Procedure_2()
     
        I = I + 2
     
        MsgBox I
     
    End Sub
    tu aura 10 pour la première et 12 pour la seconde car la valeur est gardée en mémoire tant que le classeur n'est pas fermée !
    et pour celles-ci :
    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
     
    Sub Procedure_1()
     
    Dim I As Integer
     
        I = 10
     
        MsgBox I
     
    End Sub
     
    Sub Procedure_2()
     
    Dim I As Integer
     
        I = I + 2
     
        MsgBox I
     
    End Sub
    tu aura 10 pour la première et 2 pour la seconde car en fin de 1ère procédure, la variable est détruite et dans la 2ème procédure tu recrée une nouvelle variable I qui est initialisée à 0

  3. #3
    Invité
    Invité(e)
    Par défaut
    je ne répéterai pas ce qu'a dit Theze. mais il est toujours possible de mixer les 2!
    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
    sub teste1() 'la on passe en paramètre  i qui est unique pour les 2
    dim i as byte
    Procedure_1 i
    Fun_1 i
    end sub 
    sub teste2() 'la on passe en paramètre  i qui est valable que pour Procedure_1
    dim i as byte
    Procedure_1 i
    end sub 
    sub teste3() 'la on passe en paramètre  i qui est valable que pour Fun_1
    dim i as byte
    Fun_1 i
    end sub 
     
    Sub Procedure_1( i as byte)
       [...]
    End Sub
     
    Function Fun_1( i as byte) as string
       [...]
    End Function

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Il est bien évident qu'il est possible de passer une variable en argument à une procédure ou fonction mais elle sera systématiquement détruite en fin de procédure initiale

  5. #5
    Invité
    Invité(e)
    Par défaut
    entièrement d'accord avec toi Theze, le reste dépend de l'utilité! perso je n'aime les variable globales dans Excel Vba.

    mais je voulais ajouter, à ta démonstration une autre possibilité!

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    C'est vrai qu'il faut bien faire attention aux valeurs quelles peuvent avoir (modifiées à différents endroits), ça peut donner des résultats surprenants et non attendus ! Je ne les utilise que quand leurs durées doivent être celle du classeur.

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut
    Bonjour et merci pour vos réponses !

    Je suis tout à fait d'accord avec vous, mais je voulais savoir si l'une ou l'autre des déclarations pouvait avoir une influence sur la performance du code ?

    D'après vos arguments, les différentes méthodes de déclarations impliquent seulement l'utilisation de variables... Je me permets toutefois d'insister un petit peu

    En ayant par exemple 10 fonctions dans un même module qui utilisent la variable i (dans des boucles for) : si je déclare en tête du module, de toute façon la réinitialisation de la variable se fera dans chaque fonction (For i = 1 to ...), donc pas de problème pour les valeurs que cette variable peut prendre. Quel pourrait alors être l'intérêt de déclarer i dans chaque fonction ?

    Pour être un peu bourrin, faudrait-il mieux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Procedure_1()
       dim i as byte
       i=1
    End Sub
     
    Function Fun_1() as string
       dim i as byte
       i=2
    End Function
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dim i as byte
     
    Sub Procedure_1()
       i=1
    End Sub
     
    Function Fun_1() as string
       i=2
    End Function
    Ou alors est-ce strictement la même chose sur tous les points de vue ?

    Merci d'avance pour vos éclaircissements !

  8. #8
    Invité
    Invité(e)
    Par défaut
    bonjour,
    i est byte, les conséquence sont infimes, mais il pourrais s’agir de classe voir de collection de classe; là en terme de performances ça pourrait faire la différence!

    le problème en réalité c'est l'utilisation. si tu place i dans ta fonction, tu as une lisibilité sur la totalité de ta fonction.
    si tu modifies ta fonction tu n'impacte que ta fonction, si i y a inter dépendance de ta variable, une modification entraîne une avalanche en chaîne! et tu dois reprendre tout ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function A(ByVal t As Integer) As Integer
    ici t est passé en recopie de valeur?
    cela veut dire qu'une nouvelle variable est créée et quelle est initialisé par le valeur de i, ainsi tu peut en modifier la valeur de t sens changer la valeur de i!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function A(ByRef t As Integer) As Integer
    ici la valeur est passées en référence? si tu change la valeur de t tu change la valeur de i!

    c'est l’occasion qui fait le larron! la multiplication des variable alourdi le processus, la globalisation de variable complique la maintenance!

  9. #9
    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,

    L'optimisation du code par la déclaration des variables fera gagner au mieux 5% ou 10%.

    C'est avec la méthode utilisée que l'on peut gagner du temps de façon significative:
    -Pour un tri d'Array, le temps d'exécution d'une Quick-sort n'est pas comparable à celui d'une Bubble-Sort
    -En transférant les champs dans des Arrays, on peut gagner du temps.
    -On peut indexer les Arrays avec des dictionnaires.
    -.......

    -Dans l'exemple joint, on génère des onglets à partir d'une BD. Suivant la méthode utilisée, on divise par le temps d'exécution par 10.

    Boisgontier
    Fichiers attachés Fichiers attachés

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur acousticien
    Inscrit en
    Septembre 2015
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur acousticien
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2015
    Messages : 122
    Par défaut
    Merci pour ces éléments de réponse !

  11. #11
    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 : 34
    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 à tous,

    Comme le disais rdurupt, avec un byte la différence est infime.
    Là où je pense qu’il faut être vigilent, c'est avec les variables plus "lourde", celle qui sont en fait des objets qui vont avoir des propriétés, des méthodes … (comme des Range, des WorkSheet …)

    Dans un code on les reconnaît facilement avec l'utilisation du Set.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set ma feuille = ThisWorkbook.Sheets("Feuil1")
    Il peut être bon de prendre le réflexe de toujours libérer ce type de variable en les remettants à Nothing en fin de code.

    Dans le pratique j'essaye au maximum de faire des Sub qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
        Dim .......
        [Ensemble d'instructions]
    Fin:
        Set var1 = Nothing
        ...
        Set varX = Nothing
    End Sub
    Ce n'est pas le sujet de départ mais je pense qu'il s'agit d'une chose à avoir en tête

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

Discussions similaires

  1. Macro (déclaration des variables ?)
    Par Nok's dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 29/05/2007, 17h46
  2. déclaration des Variables
    Par aityahia dans le forum Coldfusion
    Réponses: 3
    Dernier message: 02/10/2006, 09h42
  3. Déclaration des variables
    Par pierrot10 dans le forum Langage
    Réponses: 1
    Dernier message: 30/08/2006, 15h47
  4. [MASM32] Déclaration des variables
    Par mrousse dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 30/09/2005, 15h30
  5. [DB2] Ordre de déclaration des variables
    Par Fatah93 dans le forum DB2
    Réponses: 1
    Dernier message: 04/05/2005, 18h18

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