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 :

Solutions pour macros trop lente


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut Solutions pour macros trop lente
    Bonjour tout le monde,
    En fait j'utilise la macro ci dessous pour repérer mes "faux doublons" c'est à dire les doublons causés par un espace, un +, un -, un /.
    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
    For i = 1 To dercol
        If Cells(1, i) Like "xxx*" Then 'si colonne xxx
            For j = 2 To derl
                For k = j + 1 To derl
                    If Cells(j, i) <> 0 And Cells(k, i) <> 0 Then
                        If j <> k Then
                            If Cells(j, i) <> Cells(k, i) Then
                                texte = Replace(Replace(Replace(Replace(Replace(Cells(j, i), " ", ""), "_", ""), "/", ""), "+", ""), "-", "")
                                texte1 = Replace(Replace(Replace(Replace(Replace(Cells(k, i), " ", ""), "_", ""), "/", ""), "+", ""), "-", "")
                                If texte = texte1 Then
                                    l = l + 1
                                    Cells(j, i).Interior.ColorIndex = 3
                                    Cells(k, i).Interior.ColorIndex = 3
                                End If
                            End If
                        End If
                    End If
                Next k
            Next j
        End If
    Next i
    Comme vous le voyez dans la macro, elle compare chaque cellule par rapport à toutes les autres cellule. Et puisque mon fichier est énorme, la macro est trop lente, elle tourne au moins 5mn.
    Je viens auprès de vous pour voir si vous avez des solutions pour contourner ce problème de lenteur de la macro.

    Merci d'avance.

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    -Dimensionne correctement tes variables,
    -application.screenupdating = false au début de ton code et application.screenupdating = true en fin de code

    Par contre.. si tu compares un à un un énorme fichier difficile d'améliorer..

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut
    Merci EngueEngue. Mes variables sont bien dimensinnés et j'ai bien fai application.screenupdating=false au debut et =true a la fin.
    Y a-t-il un moins d'avoir une vue d'ensemble de la colonne au lieu de comparer chaque cellule par rapport a toutes les autres?

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    tu peux faire un .find

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut
    Très bonne idée pour la fonction .find jy avait pas pensé. Je vais essayer de modifier mon code et je te dirai

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    On peut gagner beaucoup de temps en travaillant en mémoire.
    Il faut monter toute la place concernée dans un Variant comme par exemple
    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
    Sub aa()
    Dim R As Range
    Dim var As Variant
    Dim i&
    Dim j&
    Dim g&
    Dim pos&
    Dim A_Remplacer As Variant
    '---
    Set R = [a1].CurrentRegion 'par exemple
    'Set R = Range("a5:z1234")  'ou cet autre exemple
     
    var = R 'monte d'un seul coup toutes les valeurs du range
     
    A_Remplacer = Array(" ", "_", "/", "+", "-")
     
    For i& = 1 To UBound(var, 1)    'toutes les lignes
      For j& = 1 To UBound(var, 2)  'toutes les colonnes
     
        For g& = LBound(A_Remplacer) To UBound(A_Remplacer)
          pos& = InStr(1, var(i&, j&), A_Remplacer(g&))
          If pos& > 0 Then
     
            var(i&, j&) = Mid(var(i&, j&), 1, pos& - 1) & Mid(var(i&, j&), pos& + 1)  'à vérifier (je n'ai pas testé)
     
          End If
        Next g&
     
      Next j&
    Next i&
     
    R = var 'écrit le Variant Tableau dans le range d'un seul coup
     
    End Sub
    Si je ne me suis pas trompé, essayez sur une copie de votre classeur.

  7. #7
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut
    Bonjour PMO2017. Merci pour ton code il est rapide et très intéressant.
    Mais il m'enleve les espaces les +, - .... Moi je veux juste qu'il me repere les doublons causés par les espaces, /, _ etc....(par un message ou par un signe) La macro ne doit rien changer sur le fichier.
    Jai essayer de modifier ton code pour cela mais je n'y arrive pas.

    Bonjour,
    J'ai toujours pas trouvé solution à mon problème.
    J'ai essayer avec la fonction .Find comme l'avait suggéré EngueEngue mais ça n'a aboutit a rien je crois cest imposible de passer par là.

    Est que vous avez d'autres idées?
    Merci

  8. #8
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Pourquoi serai-ce impossible de passer par là?

    Si tu nous files un classeur exemple on peut essayer de travailler dessus.. construire les données pour tester n'est pas notre boulot :p

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Moi je veux juste qu'il me repere les doublons causés par les espaces, /, _ etc....(par un message ou par un signe) La macro ne doit rien changer sur le fichier.
    Essayez ce code qui affiche le résultat des données épurées dans une nouvelle feuille.
    'EXEMPLE de suite du traitement :
    'Dans la nouvelle feuille, on peut ajouter une nouvelle colonne
    'et y indiquer le numéro de ligne. On effectue un tri sur la colonne
    'concernée pour comparer les éventuels pseudo doublons. (etc)
    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
    Sub bb()
    Dim S As Worksheet
    Dim R As Range
    Dim var As Variant
    Dim i&
    Dim j&
    Dim g&
    Dim pos&
    Dim A_Remplacer As Variant
    '---
    Set R = [a1].CurrentRegion 'par exemple
    'Set R = Range("a5:z1234")  'ou cet autre exemple
     
    var = R 'monte d'un seul coup toutes les valeurs du range
     
    A_Remplacer = Array(" ", "_", "/", "+", "-")
     
    For i& = 1 To UBound(var, 1)    'toutes les lignes
      For j& = 1 To UBound(var, 2)  'toutes les colonnes
     
        For g& = LBound(A_Remplacer) To UBound(A_Remplacer)
          pos& = InStr(1, var(i&, j&), A_Remplacer(g&))
          If pos& > 0 Then
     
            var(i&, j&) = Mid(var(i&, j&), 1, pos& - 1) & Mid(var(i&, j&), pos& + 1)  'à vérifier (je n'ai pas testé)
     
          End If
        Next g&
     
      Next j&
    Next i&
     
    '--- On affiche le résultat dans une autre feuille ---
    Set S = Worksheets.Add
    Set R = S.Range(R.Address)
    R = var 'écrit le Variant Tableau dans le range d'un seul coup
     
    '###############
    'EXEMPLE de suite du traitement :
    'Dans la nouvelle feuille, on peut ajouter une nouvelle colonne
    'et y indiquer le numéro de ligne. On effectue un tri sur la colonne
    'concernée pour comparer les éventuels pseudo doublons. (etc)
     
    End Sub

Discussions similaires

  1. [XL-2003] macro trop lente
    Par tioch dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/07/2011, 09h48
  2. [XL-2007] Boucles for imbriquées, macro trop lente
    Par Jambonpurée dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2011, 19h25
  3. [XL-2007] macros trop lentes (85 onglets)
    Par dodo28 dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 16/04/2009, 22h20
  4. Réponses: 14
    Dernier message: 21/07/2006, 12h44
  5. OpenGL trop lent pour la 2D !!!
    Par kagemusha dans le forum OpenGL
    Réponses: 17
    Dernier message: 14/12/2005, 12h06

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