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 :

Boucle for et plusieurs if enchainés --> comment optimiser le code?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Par défaut Boucle for et plusieurs if enchainés --> comment optimiser le code?
    Bonjour,

    Dans le cadre d'un exercice, je souhaite faire un ranking un peu comme les agences de notations.

    Dans la feuille 1, j'ai 4000 entreprises portant chacune un n° pr les identifier en colonne A, une année en colonne B et leur note historique pour l'année correspondante en colonne L.

    Je souhaite faire des petites matrices en Feuil 3 pour savoir de manière précise, combien d'entreprises classées AAA en 1995 sont restées AAA en 1996 ou devenues AA etc...

    Ainsi, j'ai réalisé le bout de code suivant:

    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
    Sub MatriceTransitionAAA9596()
     
    Dim i As Integer
    Dim j As Integer
     
    j = 0
    With Sheets("Feuil3").Cells(11, "B")
        For i = 2 To 830
     
            If Sheets("Feuil1").Cells(i, "A") = Sheets("Feuil1").Cells(i + 1, "A") Then
                If Sheets("Feuil1").Cells(i, "B").Value = 1995 And Sheets("Feuil1").Cells(i + 1, "B").Value = 1996 Then
                    If Sheets("Feuil1").Cells(i, "L") = "AAA" Then
                        If Sheets("Feuil1").Cells(i + 1, "L") = "AAA" Then
                        .Value = .Value + 1
                        End If
                    End If
                End If
            End If
     
        Next
    End With
     
    With Sheets("Feuil3").Cells(11, "C")
        For i = 2 To 830
     
            If Sheets("Feuil1").Cells(i, "A") = Sheets("Feuil1").Cells(i + 1, "A") Then
                If Sheets("Feuil1").Cells(i, "B").Value = 1995 And Sheets("Feuil1").Cells(i + 1, "B").Value = 1996 Then
                    If Sheets("Feuil1").Cells(i, "L") = "AAA" Then
                        If Sheets("Feuil1").Cells(i + 1, "L") = "AA" Then
                        .Value = .Value + 1
                        End If
                    End If
                End If
            End If
     
        Next
    End With
    Je vous passe toutes les notes car ca deviendrait redondant...

    Ma macro fonctionne mais je me doute que le code est pas optimisé...

    Je voudrais savoir si quelqu'un a une meilleure idée que la mienne?

    Merci d'avance!

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    As tu pensé a utiliser un Tableau Croisée Dynamique (TCD)?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Par défaut
    Non... Je connais pas!

    Je me renseigne! Merci du conseil!

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Effectivement les Tableaux Dynamique Croisé serait une bonne solution pour ce type de problème.

    Sinon pour ce qui était de l'optimisation du code #1 :
    - la variable "j" ne sert pas,

    - le choix des With n'est pas le meilleurs choix :
    2 utilisations dans la boucle de Sheets("Feuil3").Cells(), alors que Sheets("Feuil1"), est appelé 6 fois par boucle.

    - en remplaçant les With par Sheets("Feuil1"), on voit qu'il n'y a plus qu'une boucle utile.

    - enfin on peut regrouper les tests sur Sheets("Feuil1").Cells(i, "L") = "AAA"

    [Edit] : post en aveugle de #4. Ajout, peut être un With Sheets("Feuil1") ?

  5. #5
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    Bonjour,
    Avec une comparaison par ligne on gagne un peu de temps
    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
     
    k=timer
    For i = 2 To 830
     
            If Sheets("Feuil1").Cells(i, "A") = Sheets("Feuil1").Cells(i + 1, "A") Then
                If Sheets("Feuil1").Cells(i, "B").Value = 1995 Then
                  If Sheets("Feuil1").Cells(i + 1, "B").Value = 1996 Then
                    If Sheets("Feuil1").Cells(i, "L") = "AAA" Then
                        Select Case Sheets("Feuil1").Cells(i + 1, "L")
                        Case "AAA"
                          Sheets("Feuil3").Cells(11, "B") = Sheets("Feuil3").Cells(11, "B") + 1
                        Case "AA"
                          Sheets("Feuil3").Cells(11, "C") = Sheets("Feuil3").Cells(11, "C") + 1
                        End Select
                    End If
                  End If
                End If
            End If
     
        Next
    msgbox("Durée : " & timer-k)
    En classant les comparaisons de la moins probable à la plus probable, on gagne encore du temps
    Le Timer pour mesurer la durée d'execution

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

Discussions similaires

  1. Boucle for appelant plusieurs variables
    Par charleslaidi dans le forum Shell et commandes GNU
    Réponses: 23
    Dernier message: 05/05/2015, 22h51
  2. comment optimiser le code avec eclipse ?
    Par isoman dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 28/10/2008, 16h36
  3. Comment optimiser ce code?
    Par BnA dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 21/07/2007, 12h25
  4. comment optimiser son code en calcul ???
    Par gronaze dans le forum C
    Réponses: 5
    Dernier message: 21/03/2006, 10h41
  5. [Perf] Comment optimiser son code ?
    Par Frifron dans le forum Général Java
    Réponses: 12
    Dernier message: 11/08/2005, 09h05

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