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

Excel Discussion :

Macro lente, à optimiser ou reformuler


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Macro lente, à optimiser ou reformuler
    Bonjour,

    Je suis en train d'optimiser ma macro et j'ai déjà réussi à passer de 5 minutes de moulinette à 1 minutes 20.

    J'ai une colonne NOM (A) et une colonne HABILITATION (C)
    Je veux mettre toute les habilitations sur la ligne de la personne (actuellement c'est une habilitation par ligne et par personne)
    Puis j'enlève tout les doublons.

    Si c'est trop compliqué à comprendre je mettrai un fichier en enlevant les noms.

    Le dernier bloc de ma macro qui est lente est le suivant (surtout la partie en rouge environ 1 minute) :

    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
    Sub copie()
    Dim i As Integer
    Dim j As Integer
    Dim a As Integer
    Dim LastRow As Long
    Dim MyRange As Range
    
    
    Application.ScreenUpdating = False
    LastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
    
    For a = 2 To LastRow
    For i = 3 To LastRow
    
    If Cells(a, 1) = Cells(i, 1) Then
    Cells(i, 3).Copy
    For j = 4 To 15
        If Cells(a, j) <> "" Then GoTo Line1 Else GoTo Line2
    Line1:
    Next j
    Line2:
    Cells(a, j).PasteSpecial Paste:=xlPasteValues
    
    
    End If
    
    Next i
    Next a
    
    
    Range("C3:C" & LastRow).Delete Shift:=xlToLeft
    
    Set MyRange = ActiveSheet.Range("A1:O" & LastRow)
    MyRange.RemoveDuplicates Columns:=1, Header:=xlYes
    
    
    For O = 2 To LastRow Step 1
    
    Cells(O, 13).FormulaR1C1 = "=CONCATENATE(RC[-10],""  "",RC[-9],""  "",RC[-8],""  "",RC[-7],""  "",RC[-6],""  "",RC[-5],""  "",RC[-4],""  "",RC[-3],""  "",RC[-2],""  "",RC[-1])"
       
       Next O
        
        Application.CutCopyMode = False
          Range("M:M").Copy
          Range("C:C").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
          Range("D:M").Delete Shift:=xlToLeft
    
    
    Application.ScreenUpdating = True
    End Sub
    Merci !

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 383
    Points : 659
    Points
    659
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For a = 2 To LastRow
    For i = 3 To LastRow
     
    If Cells(a, 1) = Cells(i, 1) Then
    Si tu dois parcourir des tableaux de données importants, alors saches que tu gagneras un temps inconsidérable à mettre des données dans des variables tableau et à parcourir le tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For j = 4 To 15
        If Cells(a, j) <> "" Then GoTo Line1 Else GoTo Line2
    Line1:
    Next j
    Line2:
    Cells(a, j).PasteSpecial Paste:=xlPasteValues
    Excuse-moi, mais cette partie là est particulièrement moche
    Tu peux utiliser la méthode END qui te permet de capter en un clin d'oeil la dernière colonne vide, et donc d'y mettre ta valeur (qui au passage peut y être mis sans passer par un copier-coller qui est assez gourmand en ressources)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For O = 2 To LastRow Step 1
     
    Cells(O, 13).FormulaR1C1 = "=CONCATENATE(RC[-10],""  "",RC[-9],""  "",RC[-8],""  "",RC[-7],""  "",RC[-6],""  "",RC[-5],""  "",RC[-4],""  "",RC[-3],""  "",RC[-2],""  "",RC[-1])"
     
    Next O
    Là tu peux gagner tu temps également en évitant la boucle.
    Tu peux directement mettre une formule dans une plage de données, grâce à RANGE(cells(ligne, colonne), cells(ligne,colonne))
    Demain, je vais commencer par m'acheter des lunettes. Et après, je verrai bien.

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 651
    Points : 5 769
    Points
    5 769
    Par défaut
    Bonjour,

    Une proposition en Excel, en supposant que les entêtes soient sur la ligne 1 et que les colonnes D et E soient disponibles:
    Tri par nom et habilitation
    En D2 à tirer vers le bas: =SI(A2=A1;C2& " " &D1;C2)
    Copie-colle la colonne D en valeur
    En E2 à tirer vers le bas: =NBCAR(D2)
    Tri décroissant sur la colone E
    Utilise la suppression de doublon Excel pour ne garder qu'une ligne par nom

    Si besoin l'enregistreur de macro te donnera 90% du code, c'est sans boucle donc très rapide même sur un grand volume de données
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Avril 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Avril 2018
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci à tous les deux.

    J'avais commencé à corriger suite au message de mat955 mais du coup j'ai plus besoin de cette partie du code avec celui de halaster08.

    La macro entière fait 7,41secondes.

    Merci beaucoup !!

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

Discussions similaires

  1. Macro lente a optimiser
    Par hidalg007 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/04/2018, 19h56
  2. Optimisation d'une macro lente
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/12/2012, 23h35
  3. Macro lente pour contrôle nombre caractere
    Par roidurif dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/04/2009, 21h43
  4. [VBA-E]macro lente. étrange. étrange.
    Par zenix dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/04/2006, 12h59

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