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 averti
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Septembre 2014
    Messages : 58
    Par défaut Optimisation de code
    Bonjour,

    J'ai un module qui appelle consécutivement 5 modules qui se présentent ainsi (avec des instructions un peu différentes mais la structure est la même):
    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
    Sub Bascule()
     
    Dim b As Long
    Dim c As Long
    Dim e As Long
    Dim f As Long
    Dim q As Long
    Dim v As Long
    Dim I As Long
     
        Worksheets("Suivi").Select
        v = Application.WorksheetFunction.CountA(Columns(5)) + 1
     
        Worksheets("Liste des besoins").Select
        With Worksheets("Liste des besoins")
     
        q = Application.WorksheetFunction.CountA(Columns(1)) + 1
     
            For b = 3 To q
                If Worksheets("Liste des besoins").Cells(b, 26).Value = "Basculé en att. inscription" Then
     
                    With Worksheets("Suivi")
                        For e = 2 To v
                            For I = 2 To q
                                If Worksheets("Suivi").Cells(e, 17).Value = Worksheets("Liste des besoins").Cells(b, 17).Value Then
                                Worksheets("Suivi").Rows(e).Interior.Color = RGB(255, 255, 255)
                                Worksheets("Suivi").Cells(e, 24) = "Basculé en att. Inscription"
                                End If
                            Next
                        Next
                    End With
                End If
            Next
        End With
     
    b = 0
    c = 0
    e = 0
    f = 0
    q = 0
    v = 0
    I = 0
    End Sub
    Cela fonctionne très bien, le problème étant que ma macro tourne pendant 2 heures (et une journée sur les PC de mes collègues sans SSD....).
    Je pense que c'est le fait d'avoir un bouclage sur chaque cellule qui est long et qu'il faudrait faire plutôt une fonction Set. Qu'en pensez-vous svp?

    A noter que j'ai les instructions suivantes dans mon module "mère":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Application.DisplayAlerts = False 'messages excel
        Application.DisplayStatusBar = True ' info avancement macro dans barre d'infos en bas écran
        Application.StatusBar = "Synthèse PEPS en cours"
        Application.ScreenUpdating = False 'rafraichissement ecran (pour ne pas voir défiler les macros)
        Application.Cursor = xlWait 'sablier
        Application.Calculation = xlCalculationManual ' supprime calcul auto EXCEL pour gagner du temps.  A remettre dans fin_sub
    merci de votre aide,

    Alain

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    Bonjour

    Je ne comprends pas le For I = 2 To q

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     For e = 2 To v
              For I = 2 To q
                     If Worksheets("Suivi").Cells(e, 17).Value = Worksheets("Liste des besoins").Cells(b, 17).Value Then
                                Worksheets("Suivi").Rows(e).Interior.Color = RGB(255, 255, 255)
                                Worksheets("Suivi").Cells(e, 24) = "Basculé en att. Inscription"
                    End If
            Next
     Next

  3. #3
    Membre averti
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Septembre 2014
    Messages : 58
    Par défaut
    A oui en effet, il ne sert à rien j'ai oublié de l'enlever....

    premier point d'optimisation... comme quoi quand on a la tête dans son code, on finit par plus voir l'évidence

    [EDIT] mais la macro est encore très très longue dans son exécution..

  4. #4
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      If Worksheets("Suivi").Cells(e, 17).Value = Worksheets("Liste des besoins").Cells(b, 17).Value Then
                                Worksheets("Suivi").Rows(e).Interior.Color = RGB(255, 255, 255)
                                Worksheets("Suivi").Cells(e, 24) = "Basculé en att. Inscription"
                    End If
    je pense qu'il faudrait passer par une variable tableau
    qui contiendrait toutes les valeurs de la colonne 24 après traitement.


    pour écrire la colonne 24 en une seule fois.
    y a t'il d'autre valeurs que : "Basculé en att. Inscription" dans cette colonne.

    pour colorier les lignes peut être limiter le nombre d'écritures avec union.
    (colorier 30 lignes à chaque fois, a voir avec la limite de la variable ou tu mettrai les lignes à colorier.

    Sheets("Suivi").Range("11:11,18:18,26:26,34:34").Interior.Color = RGB(255, 255, 255)

    variable à construire avec la macro.

  5. #5
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    J'ai essayé ceci

    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
    Sub Bascule()
     
    Dim b As Long
    Dim c As Long
    Dim e As Long
    Dim f As Long
    Dim q As Long
    Dim v As Long
    Dim I As Long
     
      v = Application.WorksheetFunction.CountA(Worksheets("Suivi").Columns(5)) + 1
      suivi = Worksheets("Suivi").Range("A1:X" & Format(v))
     
        q = Application.WorksheetFunction.CountA(Worksheets("Liste des besoins").Columns(1)) + 1
    besoin = Worksheets("Liste des besoins").Range("A1:Z" & Format(q))
            For b = 3 To q
                If besoin(b, 26) = "Basculé en att. inscription" Then
     
                        For e = 2 To v
                             If suivi(e, 17) = besoin(b, 17) Then
                               Worksheets("Suivi").Rows(e).Interior.Color = RGB(255, 255, 0)
                               suivi(e, 24) = "Basculé en att. Inscription"
                             End If
                            Next
                End If
            Next
     
     Sheets("Suivi").Range("$A$1").Resize(UBound(suivi, 1), UBound(suivi, 2)) = suivi
    b = 0
    c = 0
    e = 0
    f = 0
    q = 0
    v = 0
    I = 0
    End Sub
    eventuellement

    ceci en début de code
    et ceci à la fin
    tempsfin = Time()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tempschrono = tempsfin - tempsdebut
     MsgBox (tempschrono) * 1000000
    pour mesurer le gain

  6. #6
    Membre averti
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Septembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Septembre 2014
    Messages : 58
    Par défaut
    Citation Envoyé par a_diard Voir le message
    J'ai essayé ceci

    [...]

    pour mesurer le gain
    Désolé pour le délai de réponse, je reviens de vacances un peu longues...

    c'est parfait, merci!

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

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