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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    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
    Points : 15 543
    Points
    15 543
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    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
    Points : 15 543
    Points
    15 543
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    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
    Points : 15 543
    Points
    15 543
    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+

  7. #7
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Tiens, j'ai fait ça avec Find et en remplaçant les "offset", qui obligent ton code à compter les colonnes, par le N° de colonne (NoCol = Range("DR4").Offset(0, - nCol).Column)
    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
    Application.screenUpdating = false
    Set Plage = fl2.Range("DR4:DR" & fl1.Range("DR4").End(xlDown).Row)
        With Plage
            Set c = .Find(d2, LookIn:=xlValues)
            If Not c Is Nothing Then 'Si j'ai trouvé une donnée, j'entre dans la boucle
                Do
                    NoLigne = c.Row
                    'c contient la donnée cherchée
                    'ici... on fait ce qu'on a à faire
                    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 Cells(Cell.Row, 79).Value > 0 Then
                            LaVal = LaVal + Cells(Cell.Row, 79).Value
                            'additionne le nombre de fte si fte>0'
                            If Cells(Cell.Row, 21) = 1 Then valm = valm + 1
                            'je dois aussi afficher les fte par sexe 1=m 2=f
                            If Cells(Cell.Row, 21) = 2 Then valf = valf + 1
                        End If
                    End If
                    If Cells(Cell.Row, 88) = d Then
                        'si département égal combobox'
                        If Cells(Cell.Row, 79) > 0 Then
                            LaVal = LaVal + Cell.Offset(0, -43)
                            'si fte>0 on aditionne les fte'
                            'par sexe'
                            If Cells(Cell.Row, 21) = 1 Then valm = valm + 1
                            'par sexe'
                            If Cells(Cell.Row, 21) = 2 Then valf = valf + 1
                        End If
                    End If
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Row > NoLigne
            End If
        End With
    Application.screenUpdating = True
    Sans filet, non testé
    Tu testes et tu dis
    A+

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Merci c'est vrai que maintenant c'est moin lent!

    J'aimerai qd meme bien un exemple de fonction find..
    Est-ce que ce serait mieux avec find ou pas?

    je vais tester le find j'avais pas encore vu le message, je te dis quoi!

    Merci pour toute ton aide!

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    J'ai testé mais cela ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Application.ScreenUpdating = False 'cela signifie?'
    Set Plage = fl2.Range("DR4:DR" & Fl1.Range("DR4").End(xlDown).Row)
        With Plage
            Set C = .Find(d2, LookIn:=xlValues)
    Cela ne trouve pas de données.. bizarre..je cherche pourquoi...
    je pense que le probleme vient de d2 ets bien égale à la date mais xlValues = -4113

  10. #10
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Ok. Alors je pense que ça vient du format des dates.
    Si tu testes ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox 39224 = CDate(Format(Now(), "dd/mm/yy")) '=> Vrai
    donc, quand tu testes d2 = Cells(l,c).value, que les deux termes sont des dates, tu as vrai si elle correspondent
    Avec Find, la donnée cherchée est figée dans son format, et si la donnée à trouver est différente dans la feuille, hors format de cellule, find ne la trouvera pas.
    Je regarde s'il y a une option (pas à ma connaissance mais chais pas tout )
    A+

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    okok, la date sur la premiere feuille est une concaténation d'un champs mois et d'un champs année..
    Merci pr ton aide et tes recherches

  12. #12
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu as la possibilité de modifier ce que tu places dans ta la premiere feuille ?
    Parce qu'il est facile d'en modifier le format.
    Pour mes recherches sur Find, ça n'a rien donné. xlvalue est bien la constante à utiliser
    A+

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    oui je peux modifier vu que c'est une copie de mes données..
    mais je récupère aussi les dates pour la combobox...

  14. #14
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Alors, question subsidiaire : Tu peux harmoniser les formats ?
    A+

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    J'arrive pas trop en fait à harmoniser...
    Mes 2 dates sont en format dd/mm/yyyy et cela ne marche pas..

  16. #16
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Bien sûr que ça ne peut pas fonctionner. Tu as mis
    Set Plage = fl2.Range("DR4: DR" & Fl1.Range("DR4").End(xlDown).Row)
    Et moi j'ai bêtement recopié ton code. Tu dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = fl2.Range("DR4:DR" & Fl2.Range("DR4").End(xlDown).Row)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = fl1.Range("DR4:DR" & Fl1.Range("DR4").End(xlDown).Row)
    On ne peux pas instancier une plage sur deux feuilles différentes.
    Corrige ça et teste de nouveau.
    C'est également faux dans ton code d'origine
    A+

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Merci bcp, c'est vrai! quelle erreure
    Je pense que ca ralentissait mes if également.

    Mais pour le find ca ne change rien...
    Je continue mes recherches...

  18. #18
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Passons au find.
    Si dans la feuille où se trouvent tes dates, le format t'est donné par le format de cellule, le format de la donnée elle-même n'est pas forcément le même.
    Tu peux avoir le N° de série de la date ou tout autre format dans la cellule mais que le format eXCEL de la cellule "re-définisse" cette date.
    Exemple : Place "14/5/07" dans une cellule, redéfinis par le format de cellule -> Format -> Cellule -> 14/05/2007
    Tu obtiendras bien 14/05/2007 mais en réalité, tu auras toujours 14/5/07 dans ta cellule. Ce serait une explication (...)
    Tu vois.
    A+

  19. #19
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Une solution consisterait à utiliser Nombre comme format de cellule dans ta feuille et que d2 soit converti en double
    cdbl(LaDate) te donne le N° de série
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox CDbl(CDate("14/5/2007")) '=39216
    Et si tu places cette même date dans une cellule que tu mets en format nombre, tu auras aussi 39216.
    Tu peux modifier le format de ta colonne par soft avant ta recherche et la rétablir par soft à la sortie.
    C'est une solution (celle que j'utilise quand je ne suis pas certain de la correspondance des formats)
    Si tu veux, on peut mettre ça en forme ensemble
    Tu dis
    A+

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Rep 1er message :
    Oui je sais dans ma cellule de ma feuille j'ai fev-07 pourtant la valeur c'est 01/02/07.
    Dans ma combobox j'ai aussi la date en dd/mm/yyyy, mais c'est peut etre la le probleme je sais pas...

    Rep 2eme message :
    Je veux bien essayer ta proposition.
    Je regarde un peu et je te dis...

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