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 :

simplification macro pour gain de temps


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
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Par défaut simplification macro pour gain de temps
    Bonjour,

    Voici ma macro que j’exécute sur un fichier de plus de 200 000 lignes :

    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
    Sub suppression_doublons()
        vchrono = Now()
        Dim B As String
        B = InputBox("Quelle est la colonne pour supprimer les 3?")
        If B = "" Then
            'MsgBox "annulé"
        Exit Sub
        Else
        End If
             Dim C As String
        C = InputBox("Quelle est la colonne pour supprimer les doublons?")
     
     
        If C = "" Then
            MsgBox "annulé"
        Exit Sub
        Else
        End If
     
        Dim z As Long
        Partir du bas du tableau
        For z = Range(B & Rows.Count).End(xlUp).Row To 2 Step -1
        If Range(B & z) = "3" Then Range(B & z).EntireRow.Delete xlShiftUp
        Next z
     
     
    Dim i&, l&, t()
         With Feuil1.Columns(C & ":" & C)
        l = .Cells(.Rows.Count).End(xlUp).Row
        t = Range(.Cells(1), .Cells(l)).Value
        With Application: .ScreenUpdating = 0: .EnableEvents = 0: .Calculation = -4135: End With
        For i = l To 3 Step -1
          If Not IsEmpty(t(i, 1)) Then If AscW(t(i, 1)) <> 9658 And IsEmpty(t(i - 1, 1)) Then .Cells(i).Value = Chr(33) & .Cells(i).Value: i = i - 1: .Parent.Rows(i).Delete
        Next
        With Application: .Calculation = -4105: .EnableEvents = 1: .ScreenUpdating = 1: End With
      End With
          Cells.Replace What:="!", Replacement:="", LookAt:=xlPart, SearchOrder:= _
            xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
      vchrono = Now() - vchrono
    MsgBox Format(vchrono, "h:mm:ss")
      MsgBox ("traitement terminé")
    End Sub
    Elle dure 20 minutes ce qui est quand même long. Je voulais donc savoir si il y avait des choses à enlever pour gagner du temps.

    Merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Déjà interdire les rafraichissement d'écran, les évènements Excel et passe en calcul manuel des formules pendant le traitement de la macro!

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il n'y a pas besoin de faire des boucles pour ça :

    Version la plus intuitive :
    1) suppression des lignes contenant 3 en colonne B : poser un filtre automatique sur la colonne B, n'appeler que les lignes contenant 3 et supprimer la plage visible
    2) suppression des doublons en colonne C : utiliser la méthode RemoveDuplicates (méthode native excel "supprimer les doublons")

    Version optimale :

    1) filtre avancé pour exporter les lignes <> 3 en colonne B
    2) RemoveDuplicates sur la plage exportée, en ciblant les doublons de la colonne C


    tout ceci peut s'appréhender en effectuant manuellement l'opération avec l'enregistreur de macro

    on obtient un code qu'il suffit d'adapter pour l'intégrer à ta procédure.

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tout à fait joe +1
    Il faudra penser d'abord Excel

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Par défaut
    Pour la colonne contenant les 3 je le fais manuellement car ça va plus vite.

    Par contre les doublons je suis obligé de passer par une macro car quand il y a un code analytique je dois effacer la colonne du dessus qui elle n'a pas de code analytique.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B:B,Z:Z").Delete xlShiftUp

Discussions similaires

  1. [XL-2007] Aide pour optimisation/gain de temps sur une macro
    Par Nono Sto dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 04/01/2016, 02h02
  2. Réponses: 3
    Dernier message: 10/10/2014, 13h43
  3. Aide pour simplification macro
    Par teddy72000 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 07/02/2013, 15h03
  4. Réponses: 4
    Dernier message: 24/11/2005, 08h34
  5. [VBA-E] [help]macro pour dupliquer une feuille (en valeur)
    Par minikisskool dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 07/11/2005, 19h24

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