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 :

Complexité d'une macro pour Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut Complexité d'une macro pour Excel
    Bonjour

    j'ai une macro qui fonctionne pour 5000 lignes en un temps correct (environ 20 min)

    cependant au passage a plus de 6500 lignes, ca n'est plus supportable (temps supérieur à 15 heures !!!)

    à quoi cela peut il être dû ?

    merci d'avance

    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
    50
    51
    52
    53
    54
     
    Option Explicit
     
    Dim WsDo    As Worksheet
    Dim WsBs    As Worksheet
    Dim WsLs    As Worksheet
     
    Sub RemplacerCaracteres()
        Dim Cell        As Range
        Dim LigLs       As Long
     
        If ActiveSheet.Cells(1, 1).Value <> "IRN" Then
            MsgBox "Vous n'étes pas dans la bonne feuille pour lancer l'application"
            Exit Sub
        End If
        Worksheets.Add after:=Worksheets(1)
     
        On Error Resume Next
        ActiveSheet.Name = "Base"
        If Err > 0 Then
            MsgBox "La feuille Base existe déjà"
            Exit Sub
            On Error GoTo 0
        End If
        On Error GoTo 0
     
        Set WsDo = ActiveWorkbook.Worksheets(1)
        Set WsBs = ActiveWorkbook.Worksheets("Base")
        Set WsLs = ThisWorkbook.Worksheets("Liste")
     
        WsDo.Activate
        WsDo.Cells.Select
        Selection.Copy Destination:=WsBs.Cells(1, 1)
        WsBs.Columns.AutoFit
     
        WsBs.Activate
        Cells(1, 1).Select
        Cells.SpecialCells(xlCellTypeConstants, 23).Select
        LigLs = 2
        While WsLs.Cells(LigLs, 1) <> ""
            For Each Cell In Selection
                If Not IsError(Cell.Value) Then
                    Cell.Value = Replace(Cell.Value, _
                                         WsLs.Cells(LigLs, 1).Value, _
                                         WsLs.Cells(LigLs, 2).Value)
                End If
            Next
            Application.StatusBar = " n° de ligne " & LigLs
            LigLs = LigLs + 1
        Wend
     
        MsgBox "Terminé"
        Application.StatusBar = False
    End Sub

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    masque ta feuille
    sur ce type traitement le temps de traitement s'allonge avec le carré
    du nombre de données
    il faut trouver une autre voie
    sous access le temps sera divisé par 100
    Elle est pas belle la vie ?

  3. #3
    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
    As-tu essayé en ne sélectionnant pas ta plage de cellules ? Je n'ai pas testé mais tu peux le faire pour moi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Plage = Cells.SpecialCells(xlCellTypeConstants, 23).Address
    et au lieu de "For Each Cell In Selection"
    tu le fais sur la plage.

    Juste pour l'idée et le fait que tu travailles sur une sélection ce qui "pourrait" (?) ralentir ta procédure

    A+

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par random
    masque ta feuille
    sur ce type traitement le temps de traitement s'allonge avec le carré
    du nombre de données
    il faut trouver une autre voie
    sous access le temps sera divisé par 100
    je ne comprends pas le "masque ta feuille"

    pour le but de la macro, j'ai une matrice énoooorme avec du texte dedans, suite à des prob d'export-charset, je veux remplacer les &#... par des caractères normaux

    je dois donc faire un replace pour chaque caractère !!! (j'ai mis dans une feuille WsLs dans la première colonne les carac de type &#... et dans la seconde, le remplacement qui y correspond)

    merci !

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    j'ai bien compris fais comme cela
    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
     
    Function remplace()
    Dim ante As New Collection
    Dim post As New Collection
    Dim boucle As Integer
    ante.Add ("&")
    ante.Add ("bonjour")
    post.Add ("pas d'arobase")
    post.Add ("")
     
     For boucle = 1 To ante.Count
       Worksheets("mafeuille").Cells(maplage).Replace _
        What:=ante(boucle), Replacement:=post(boucle), _
        SearchOrder:=xlByColumns, MatchCase:=True
    Next boucle
    End Function
    Elle est pas belle la vie ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    Ouaip, j'ai l'impression que c'est pas mal

    cependant il me faudrait pouvoir tester objectivement la différence de perf'

    donc :

    - existe t'il des directives permettant de calculer le temps d'exécution d'une macro ?
    - existe t'il des directives permettant de calculer le nombre d'opérations effectuées dans une macro ?

    merci d'avance !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    bah j'ai une petite idée pour le temps :

    - tu fais un
    au debut de ta macro et un à la fin et tu regardes

    limite y doit y avoir moyen de faire Temps=now() (en debut de macro)
    et à la fin temps=now()-temps et t'aura directement le temps d'execution (mais là je suis moins sur, je ne sait pas trop de quel type sera Temps mais peut etre qu'en ne le declarant pas ca ira ou en le declarant en variant je pense )

    Et pour le nombre d'operation un compteur ne suffirait-il pas? tu declares un petit "compt" que t'initialise à 0 et quand ca passe dans une boucle fait un ptit compt=compt+1 non?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    je vais essayer les différentes feintes pour le temps

    mais pour le compteur, ca ne me parait pas bon

    je veux en fait comparer globalement combien d'opérations font 2 algo qui ont la meme fonction mais un codage différent, avec des directives différentes mais sur les memes donnés

    merci

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    beuh,

    pour les 2 algo, suffit juste de mettre (si tu veux les tester pendant la meme execution) 2 compteur différents et lorsque tu vois qu'il va y avoir des "opérations", tu incremente le compteur de l'algo qui effectue l'operation.

    apres je sais pas à quoi ressemblent ces 2 algo

  10. #10
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Salut,

    Ce que tu peux faire, c'est aussi figer le raffraichissement de la fenêtre Excel car ça bouffe pas mal de mémoire...

    Tu fais la chose suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Application.ScreenUpdating=False
    'Ton code qui fait la modification sur la plage de données
    Application.ScreenUpdating=True
    +

    Théo

    EDIT : Petite bévue dans le code mais c'est remplacé maintenant
    Forums VB : lire la notice
    La touche existe pour être utilisée
    Pensez au tag
    Pour ceux n'ayant pas l'aide installée :
    - Aide MSDN pour VB6
    - Aide MSDN pour VBA
    Je ne réponds pas aux questions techniques par MP. Merci d'utiliser le forum fait pour çà.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 175
    Points : 65
    Points
    65
    Par défaut
    et bien merci à tous !!!! a priori mon prob est résolu

    au cas où, si j'ai d'autres blèmes, je reviens

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

Discussions similaires

  1. [Toutes versions] macro pour excel : application d'une augmentation annuelle en %
    Par friseb dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/03/2010, 09h13
  2. [XL-2003] Créer une macro pour plusieurs fichiers excel
    Par bocki dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/06/2009, 22h53
  3. Problème pour lancer une macro dans Excel
    Par jujuf1 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 29/12/2008, 16h32
  4. Aide pour une macro mêlant Excel et Lotus!
    Par andyranai dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/05/2008, 09h25
  5. [Excel] Une macro pour F4
    Par Viper7 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 20/06/2006, 16h09

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