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 : 12 procédures en 1 ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut Optimisation de code : 12 procédures en 1 ?
    Bonsoir le forum;

    Amateur de jeux de production, et d'excel/vba , je me suis décidé à me créer une aide au jeu pour pouvoir me fixer des objectifs sur moyen et long terme.

    C'est réussi, le module fonctionne correctement (à première vue en tout cas) , et le résultat est bien celui attendu .

    Alors, me direz vous, pourquoi poster et raconter ma vie ?

    Ca fonctionne, mais le code me paraît vraiment trop énorme, il n'est pas optimal (il en est même surement très loin) .

    Je me permets donc de vous demander votre avis sur la solution qui vous paraît la plus pertinente afin d'optimiser mon code.

    Actuellement, j'utilise un module de 12 procédures While Wend pour réussir à obtenir le résultat attendu.

    Je suis persuadé qu'en maniant mieux le langage , le tout pourrait tenir dans une procédure .....

    Je ne cherche pas de réponse toute mâchée; ni que vous me rendiez le fichier avec le code tout refait, je veux comprendre ce que je fais, et vous demande donc des pistes à étudier.

    Je verrais bien une boucle de type For en remplacement, mais je ne suis pas sûr de moi.
    Je vous joins donc mon fichier, dans l'attente de votre avis.

    Le module en question s'appelle : cumul_des_couts.

    edit : le fichier sur lequel je travaille à la maison est en xlsm, extension interdite en pièce jointe, j'ai donc joins le classeur en .xls, en espérant que ç fonctionne.

    Je suis ,bien entendu, là pour plus de précisions à mon charabia .

    Merci par avance .

    Cordialement.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Bonsoir le forum ;

    J'ai commencé à essayer autre chose ; passer par une boucle for .

    Je rencontre cependant un soucis :
    Je n'arrive pas à "voir" comment placer un décalage (Offset ) dans la comparaison de mes cellules.

    Par exemple sur excel, parfois l'on utilise le signe : $ pour figer les cellules utilisées dans une fonction .
    Et bien, ici c'est le contraire que je voudrais faire, je me permets de joindre deux bouts de code pour pour essayer d'être plus clair , ce sera plus simple je pense.

    Première boucle

    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
    For Each cell In Niveau_actuel
     
        While nivActuel < nivObj
            nivActuel = nivActuel + 1
            Range("B3").Value = Range("B3") + 1
                cmlArmes = Range("d3").Value
                cmlMunis = Range("E3").Value
                cmldollars = Range("F3").Value
                resultArmes = cmlArmes + resultArmes
                resultMunis = cmlMunis + resultMunis
                resultdollars = cmldollars + resultdollars
                cmlArmes = 0
                cmlMunis = 0
                cmldollars = 0
     
            Wend
            Next cell
            Range("G3").Value = resultArmes
            Range("H3").Value = resultMunis
            Range("I3").Value = resultdollars


    Je voudrais arriver à ce qui suit en utilisant offset, qu'en pensez vous ,s'il vous plaît ?

    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
    For Each cell In Niveau_actuel
     
        While nivActuel < nivObj
            nivActuel = nivActuel + 1
            Range("B4").Value = Range("B4") + 1
                cmlArmes = Range("d4").Value
                cmlMunis = Range("E4").Value
                cmldollars = Range("F4").Value
                resultArmes = cmlArmes + resultArmes
                resultMunis = cmlMunis + resultMunis
                resultdollars = cmldollars + resultdollars
                cmlArmes = 0
                cmlMunis = 0
                cmldollars = 0
     
            Wend
            Next cell
            Range("G4").Value = resultArmes
            Range("H4").Value = resultMunis
            Range("I4").Value = resultdollars
    Je reste à votre écoute pour plus de précisions si besoin.

    Merci par avance.
    Cordialement.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Bonjour le forum;

    Quelque chose ne va pas dans ma question, ou je m'explique peut être très mal ?

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

    Quelque chose ne va pas dans ma question, ou je m'explique peut être très mal ?
    Absolument pas. Bonne question, belle expression.
    J'avais déjà repéré votre demande. J'ai l'idée d'une piste mais je n'ai pas eu le temps de m'en occuper. Je vais m'y mettre prochainement.
    Peut être qu'un contributeur aura apporté une réponse d'ici là.

    A bientôt donc.

  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,

    Voici une piste avec le code ci-dessous.
    Vérifiez que le résultat est bien celui que vous attendez.
    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
    Sub cumul_Tous()
    Dim nivActuel As Integer
    Dim nivObjectif As Integer
    Dim cumularmes As Long
    Dim resultatarmes As Long
    Dim cumulmunis As Long
    Dim resultatmunis As Long
    Dim cumuldollars As Long
    Dim resultatdollars As Long
     
    '### Je reste dans votre logique de programmation puisque (je vous cite) :
    '### Je ne cherche pas de réponse toute mâchée; ni que vous me rendiez le fichier
    '###  avec le code tout refait, je veux comprendre ce que je fais, et vous demande
    '###  donc des pistes à étudier.
    Dim i As Long
    For i = 0 To 11   'il y a 12 passages à faire mais on commence à 0 pour l'incrémentation de l'Offset
      nivActuel = Range("B3").Offset(i, 0)
      nivObjectif = Range("c3").Offset(i, 0)
      resultatarmes = 0
      resultatmunis = 0
      resultatdollars = 0
    '---
      While nivActuel < nivObjectif
        Range("B3").Offset(i, 0) = Range("B3").Offset(i, 0) + 1
        nivActuel = nivActuel + 1
        cumularmes = Range("D3").Offset(i, 0)
        resultatarmes = resultatarmes + cumularmes
        cumularmes = 0
        cumulmunis = Range("E3").Offset(i, 0)
        resultatmunis = resultatmunis + cumulmunis
        cumulmunis = 0
        cumuldollars = Range("f3").Offset(i, 0)
        resultatdollars = resultatdollars + cumuldollars
        cumuldollars = 0
      Wend
      Range("G3").Offset(i, 0) = resultatarmes
      Range("H3").Offset(i, 0) = resultatmunis
      Range("I3").Offset(i, 0) = resultatdollars
    Next i&
    End Sub

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Par défaut
    Bonjour.
    Tout d'abord, il me semble que dans le module les différentes macros font toutes la même chose, simplement à des lignes différentes. J'avoue que j'y ai régardé très rapidement et des choses peuvent m'avoir échappé.
    Si c'est le cas, effectivement tu peux faire une première macro qui lance la procédure sur toute les lignes avec une boucle For Next, et à l'intérieur de cette macro tu appelles une deuxième macro qui elle fait les opérations; il faudra l'appeler avec Call et lui passer au moins le numéro de ligne en paramètre. Ensuite, puisque les calculs sont toujours les mêmes, les variables qui composent le calculs peuvent être renseignée avec un mécanisme du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub calcul_constant (r)
    Dim ... (bla bla bla)
    cout_machin = Cells(r, 3).Value + Cells(r, 4).Value
    cout_bidule = etc un autre calcul entre valeurs de cellules
    résultat = cout_machin + cout_bidule
    ... autres calculs...
    Cells(r, 7).Value = resultat ' pour mettre le résultat dans une cellule à la colonne G
    End Sub
    Dans un code comme-ça, tu fais, sur une ligne donnée, des opérations à structure constante de colonne.
    Exemple pour appeler la macro ci-dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Boucle ()
    Dim... (bla bla bla)
    For numerodeligne = 2 to 15 '(je ne sais plus à quelles lignes se trouvent tes données)
    Call calcul_constant (numérodeligne)
    next
    Voilà, tout ça n'est évidemment qu'une suggestion de structure qu'il faut remplir avec tes idées...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Bonjour Pmo 2017 et luca.donati, et merci !

    Je regarde tout ça, et reviens dès que j'ai atteint l'objectif !

    Merci beaucoup pour vos réponse !

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/04/2014, 16h28
  2. Optimiser un code procédural avec autoload
    Par max-mag dans le forum Langage
    Réponses: 8
    Dernier message: 25/09/2008, 15h01
  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