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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 85
    Par défaut Optimisation de code
    Bonjour à tous,
    Je soliscite votre aide pour m'aider à optimiser mon code !
    En effet, je traite du fichier texte avec des variables non constantes ce qui fait parfois exploser le compteur de caractère dans le fichier string, il me faudrait donc l'aide de développeur expérimentés pour m'indiquer comment optimiser mon code.

    En fait ce n'est qu'une partie de mon code qui prend son temps (ayant testé toutes les parties une par une c'est de loin celle la la plus longue).

    Je vous explique brièvement ce que fait cette partie de code et je vous montre mon code ensuite :

    Tableau numéro 1 ou Tab_fin:
    • le "|" correspond à un "Chr(9)" mais pour soucis de lisiblité je vous fais cette petite barre
    • le 0 au début est un délimiteur
    • nous avons dans l'exemple suivant x1x x2x et x3x ==> le chiffre au milieu correspond au numéro de module
    • il y a plusieurs lignes à ce tableau car il y a des mesures à différents temps


    nb_mod| param1 | param2 | param3 | vbCrLf
    0 | x11 | x12 | x13 | x21 | x22 | x23 | x31 | x32 | x33 | vbCrLf
    0 | x11 | x12 | x13 | x21 | x22 | x23 | x31 | x32 | x33 | vbCrLf
    0 | x11 | x12 | x13 | x21 | x22 | x23 | x31 | x32 | x33 | vbCrLf



    Tableau numéro 2 ou tab_num :
    • le "|" correspond à un "Chr(9)" mais pour soucis de lisiblité je vous fais cette petite barre
    • le 0 au début est un délimiteur
    • ce tableau correspond à la moyenne sur 10 lignes de chaque colonne de x (appelée moyenne glissante)
    • il n'y a dans ce tableau aucun retour charriot


    0 | Y01 | Y02 | Y03 |Y11 | Y12 | Y13 |Y21 | Y22 | Y23 | 0 |Y01 | Y02 | Y03 |


    But du code, obtenir le tableau suivant :
    nb_mod| param1 | param2 | param3 | vbCrLf
    0 | x11 | x12 | x13 | x21 | x22 | x23 | x31 | x32 | x33 |0 | Y01 | Y02 | Y03 |Y11 | Y12 | Y13 |Y21 | Y22 | Y23 | vbCrLf
    0 | x11 | x12 | x13 | x21 | x22 | x23 | x31 | x32 | x33 |0 | Y01 | Y02 | Y03 |Y11 | Y12 | Y13 |Y21 | Y22 | Y23 | vbCrLf

    • nb_param est égal au nombre de paramètres (nb_mod non compte)
    • nb_mod est égal au nombre de modules


    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
    'stockage dans le contenu
        sContenu = ""
        b = True
        jp = 1
        kp = 1
        y = 1
        x = 2
        For i = 1 To UBound(Tab_num)
            If (y * (nb_param * nb_mod + 1) < UBound(Tab_num) - 1) Then
     
                    If (b = True) Then
                        For j = jp To x * (nb_param * nb_mod + 1) + nb_param + 1
                            sContenu = sContenu & Tab_fin(j) & Chr(9)
                            jp = jp + 1
                        Next j
                        x = x + 1
                        b = False
                    Else
                        For k = kp To y * (nb_param * nb_mod + 1)
                            If (k < y * (nb_param * nb_mod + 1) - 1) Then
                                sContenu = sContenu & Tab_num(k) & Chr(9)
                                kp = kp + 1
                            Else
                                sContenu = sContenu & Tab_num(k) & Chr(9) & vbCrLf
                                kp = kp + 1
                            End If
                        Next k
                        b = True
                        y = y + 1
                    End If
            End If
        Next i
     
        sContenu = Replace(sContenu, "0" & Chr(9) & vbCrLf, "")
    La derniere ligne toute moche est en fait une "correction" apportée suivant mes résultats donc voila le but serait de faire sans

    Voila, ce bout de code correspond à la mise en forme du tableau 1 avec le tableau 2 suivant ce qui est défini précédemment.

    Si vous avez une quelconque question n'hésitez pas à me prévenir.

    Je sais que ça peut prendre du temps donc je tiens à remercier les personnes qui se pencheront sur ce problème.

    Cordialement

  2. #2
    Membre expérimenté Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Par défaut
    Bonjour,

    Pour l'optimisation, le 1er truc c'est d'avoir un ensemble bien pensé, bien structuré. J'ai lu ton bout de code et il me semble que tu devrais peut-être revoir les incrémentations de type: "x = x+1" à l'intérieur des boucles.

    Ensuite, en ce qui concerne l'optimisation du code en lui-même, la 1ère chose à régler ce sont les déclarations de types pour les variables, tableaux... et elles ne figurent pas dans ton code.

    Peux-tu les poster ?

    De manière générale, il faut éviter les "Variant" et leur préférer les "Double" pour les décimaux , les Long pour les nombres entiers et les String pour les chaînes de variables. Idem pour les tableaux...

    Donc voilà:
    1) optimiser l'algorithme
    2) optimiser le code en commençant par les déclarations de type "Dim"

    '----------------------------------------------------------------------
    Si j'ai pu vous aider, merci de me le dire avec 1 pouce vert

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 85
    Par défaut
    Citation Envoyé par L'Albatros Voir le message
    Ensuite, en ce qui concerne l'optimisation du code en lui-même, la 1ère chose à régler ce sont les déclarations de types pour les variables, tableaux... et elles ne figurent pas dans ton code.

    Peux-tu les poster ?
    En fait tous mes tableaux sont des strings au départ que je transforme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim Tab_fin() As String
        Dim Tab_moy() As String
        Dim Tab_num() As String
        Tab_fin = Split(sContenu2, Chr(9))
        Tab_moy = Split(sContenu2, Chr(9))
     
     For i = (nb_param + 1) To UBound(Tab_moy) 'UBound(Tab_moy) - 1
            ReDim Preserve Tab_num(y)
            If ((9 * x + i) < UBound(Tab_moy) - 1) Then
                Tab_num(y) = CStr((CDbl(Tab_moy(i)) + CDbl(Tab_moy(x + i)) + CDbl(Tab_moy(2 * x + i)) + CDbl(Tab_moy(3 * x + i)) + CDbl(Tab_moy(4 * x + i)) + CDbl(Tab_moy(5 * x + i)) + CDbl(Tab_moy(6 * x + i)) + CDbl(Tab_moy(7 * x + i)) + CDbl(Tab_moy(8 * x + i)) + CDbl(Tab_moy(9 * x + i))) / 10)
                y = y + 1
            End If
        Next i
    Ceci est un exemple de transformation de mes tableaux. Je travaille xclusivement sur des fichiers textes donc je récupère le tout en string, je convertis en double pour traiter les données et je retransforme en string.

    Le code posté avant est uniquement pour mettre en forme les données une fois traitées.

    Je comprends que le fait de mettre des x = x + 1 ne soit pas très adapté à la situation et que je passe par 40 000 variables mais j'ai essayé de faire au plus court, je ne saurais pas comment changer ça.
    Faut-il que j'insère des For -- Next ou alors que j'essaye d'en enlever ?

    Cordialement

  4. #4
    Membre expérimenté Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Par défaut
    Hé hé oui il faut que tu remplaces le plus possible d'incrémentation "x = x + 1" par de belles boucles "For...Next".
    Cela ne va pas être rigolo mais ta bécane va préférer et surtout, cela t'aidera à restructurer ton algorithme général en mettant en évidence certaines redondances.
    C'est bien pour cela que les profs d'algo ennuient leurs étudiants avec le "pseudo-code"
    Je te conseille donc de débrouissailler l'architecture de ta prose avant d'optimiser le code même (mettre des $ avec les fonctions sur String, ...)

    '-----------------------------------------------------------------------
    Si j'ai pu vous aider, merci de me le dire avec un pouce vert

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    bonjour, sans aller plus loin car je n'ai pas le temps mais il me semble qu'il y a une inversion dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For i = (nb_param + 1) To UBound(Tab_moy) 'UBound(Tab_moy) - 1
            ReDim Preserve Tab_num(y)'ici
            If ((9 * x + i) < UBound(Tab_moy) - 1) Then
                Tab_num(y) = CStr((CDbl(Tab_moy(i)) + CDbl(Tab_moy(x + i)) + CDbl(Tab_moy(2 * x + i)) + CDbl(Tab_moy(3 * x + i)) + CDbl(Tab_moy(4 * x + i)) + CDbl(Tab_moy(5 * x + i)) + CDbl(Tab_moy(6 * x + i)) + CDbl(Tab_moy(7 * x + i)) + CDbl(Tab_moy(8 * x + i)) + CDbl(Tab_moy(9 * x + i))) / 10)
                y = y + 1
            End If
        Next i
    ça ne serait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = (nb_param + 1) To UBound(Tab_moy) 'UBound(Tab_moy) - 1
                    If ((9 * x + i) < UBound(Tab_moy) - 1) Then
                        y = y + 1
                       ReDim Preserve Tab_num(y)
     
                Tab_num(y) = CStr((CDbl(Tab_moy(i)) + CDbl(Tab_moy(x + i)) + CDbl(Tab_moy(2 * x + i)) + CDbl(Tab_moy(3 * x + i)) + CDbl(Tab_moy(4 * x + i)) + CDbl(Tab_moy(5 * x + i)) + CDbl(Tab_moy(6 * x + i)) + CDbl(Tab_moy(7 * x + i)) + CDbl(Tab_moy(8 * x + i)) + CDbl(Tab_moy(9 * x + i))) / 10)
                       End If
        Next i
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 85
    Par défaut
    Alors après avoir regardé comment ça fonctionnait, l'inversement importe peu car le tableau est redimensionné seulement s'il entre dans le if, donc du coup peu importe ça me sort les bons résultats !

    Un grand merci à l'Albatros pour tes conseils, je ne sais pas trop comment tourne le VBA et ça me fait parfois tourner en bourrique donc merci encore !


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