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 :

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 averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Optimiser le code
    Bonjour,

    je dois remplir un tableau avec des données se trouvant sur une autre feuille.

    Pour remplir le tableau l'utilisateur doit obligatoirement choisir une date et peut modifier le département qu'il choisit d'afficher, via 2 combo box.

    Donc je place mes macros sur les combox change.
    Voici un bout de code de ma macro, j'ai dans ma macro 17 bouts de codes similaires.
    Serait il possible de modifier le code pour l'optimiser pck pour le moment cela prend beaucoup de temps quand je change la valeur de ma combobox.

    mon code :

    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
    44
    45
    46
    47
     
    Set Plage = Fl2.Range("DR4:DR" & Fl1.Range("DR4").End(xlDown).Row)
     
    For Each Cell In Plage
     
         If Cell.Offset(0, 0) = d2 Then 
         'vérifie la date'
            If d = "Tous" Then
            'vérifie le département, premierement si egal à tous, tous étant la valeur par défaut pour afficher tous les départements'
                If Cell.Offset(0, -43) > 0 Then
                Laval = Laval + Cell.Offset(0, -43)
                'additionne le nombre de fte si fte>0'
                        If Cell.Offset(0, -101) = 1 Then 
                        valm = valm + 1
                        End If
                        'je dois aussi afficher les fte par sexe 1=m 2=f
                        If Cell.Offset(0, -101) = 2 Then
                        valf = valf + 1
                        End If
                End If
            End If
     
            If Cell.Offset(0, -34) = d Then
             'si département égal combobox'   
                If Cell.Offset(0, -43) > 0 Then
                Laval = Laval + Cell.Offset(0, -43)
                'si fte>0 on aditionne les fte'
                        'par sexe'
                        If Cell.Offset(0, -101) = 1 Then
                        valm = valm + 1
                        End If
                        'par sexe'
                        If Cell.Offset(0, -101) = 2 Then
                        valf = valf + 1
                        End If
                End If
            End If
     
          End If
    Next
     
    Worksheets("Feuil1").Range("G8").Offset(1, 2) = Laval
    Worksheets("Feuil1").Range("K8").Offset(1, 0) = valm
    Worksheets("Feuil1").Range("K8").Offset(1, 2) = valf
    Laval = 0
    valm = 0
    valf = 0
    Voila si quelqun peut jeter un coup d'oeil, parce que moi pour le mom je suis bloquée.

    Merci d'avance.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello,
    Le pb de ton code est que tu parcours toutes tes cellules
    Déjà, si tu ajoutais un exit for chaque fois que les conditions testées sont remplies, tu éviterais de poursuivre l'exament de ta plage jusqu'au bout. Quelque part par là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                End If
                'ici (**)
            End If
            'ou ici ? (*)
          End If
    Next
    Si tu as nécessairement un département par date, alors c'est là (*), dans le cas contraire, c'est sans doute là (**)
    Bref, tu vois.
    Une autre solution serait d'utiliser Find mais ne connaissant pas la structure de tes données, je ne sais pas si c'est approprié dans ce cas là. En outre ça te ferait tout ré-écrire
    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    Merci je test les exit for mais pour le mom ca ne calcule plus rien
    Comme je suis débutante c'est parfois difficile.

    Comment fonctionne le Find?

    En fait mes données sont exportées d'un logiciel vers excel.
    J'ai mes données sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Date	Nom	Dep	fte	salaire	....
    01/03	fff	102	1	300
    01/02	fff	102	1	300
    01/04	fff	103	0,5	150
    01/03	bbb	104	1	400
    01/02	bbb	104	1	400
    ...	...	...	...	....

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je reprends tout ton code tel quel en ajoutant un boolean. C'est un emplâtre sur une jambe de bois mais à défaut de tout comprendre...
    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
    44
    45
    46
    47
    48
    49
    Dim ok as boolean
    Set Plage = Fl2.Range("DR4:DR" & Fl1.Range("DR4").End(xlDown).Row)
     
    For Each Cell In Plage
     
         If Cell.Offset(0, 0) = d2 Then 
         'vérifie la date'
            If d = "Tous" Then
            'vérifie le département, premierement si egal à tous, tous étant la valeur par défaut pour afficher tous les départements'
                If Cell.Offset(0, -43) > 0 Then
                     ok = true
                Laval = Laval + Cell.Offset(0, -43)
                'additionne le nombre de fte si fte>0'
                        If Cell.Offset(0, -101) = 1 Then 
                        valm = valm + 1
                        End If
                        'je dois aussi afficher les fte par sexe 1=m 2=f
                        If Cell.Offset(0, -101) = 2 Then
                        valf = valf + 1
                        End If
                End If
            End If
     
            If Cell.Offset(0, -34) = d Then
             'si département égal combobox'   
                If Cell.Offset(0, -43) > 0 Then
                Laval = Laval + Cell.Offset(0, -43)
                'si fte>0 on aditionne les fte'
                        'par sexe'
                        If Cell.Offset(0, -101) = 1 Then
                        valm = valm + 1
                        End If
                        'par sexe'
                        If Cell.Offset(0, -101) = 2 Then
                        valf = valf + 1
                        End If
                        if ok then exit for
                End If
            End If
     
          End If
    Next
    ok = false    
    Worksheets("Feuil1").Range("G8").Offset(1, 2) = Laval
    Worksheets("Feuil1").Range("K8").Offset(1, 0) = valm
    Worksheets("Feuil1").Range("K8").Offset(1, 2) = valf
    Laval = 0
    valm = 0
    valf = 0
    Tu testes

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut
    Bon j'ai testé ca me met les bons chiffres mais ca ne change pas grand chose comparé a avant niveau rapidité..

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Deux solutions :
    Un, en gardant ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                If Cell.Offset(0, -43) > 0 Then
                     ok = true
                Laval = Laval + Cell.Offset(0, -43)
                'additionne le nombre de fte si fte>0'
                        If Cell.Offset(0, -101) = 1 Then 
                        valm = valm + 1
                        End If
                        'je dois aussi afficher les fte par sexe 1=m 2=f
                        If Cell.Offset(0, -101) = 2 Then
                        valf = valf + 1
                        End If
                   else
                        Exit for
                End If
    Ça devrait déjà accélérer les choses (?)
    Solution 2, avec find
    Tu fais une recherche de la date d2 dans la bonne colonne
    Si tu trouves, tu vérifies d, puis Cell.Offset(0, -43) > 0
    Une boucle pour trouver la date d2 suivante
    Si tu ne trouves pas, elle n'existe pas.
    Teste d'abord avec le else exit for, ensuite on verra pour find
    A+

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