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 :

Optimisation de code : possible?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2013
    Messages : 114
    Par défaut Optimisation de code : possible?
    Bonjour,

    je viens vers vous pour profiter de vos connaissances.

    En effet, je viens de construire un code qui permet de supprimer des lignes d'un fichier qui ne m'intéresse pas.

    Deux pages dans mon classeur :
    - DATA : environ 170 000 lignes
    - LISTE PF : Listing de mes produits qui m'intéresse environ 176

    Aujourd'hui ma macro fonctionne mais elle prend environ 30mn pour traiter l'onglet Data.

    Avez vous des idées pour optimiser le 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
    Sub pic()
     
    Dim nbre_ligne_data, nbre_ligne_pf, cpt_ligne_data, cpt_ligne_pf As Integer
    Dim ref_data, ref_pf, supp As String
     
    nbre_ligne_data = Workbooks("PICPDP.xlsm").Sheets("DATA").Cells(Rows.Count, 1).End(xlUp).Row
    nbre_ligne_pf = Workbooks("PICPDP.xlsm").Sheets("LISTE PF").Cells(Rows.Count, 1).End(xlUp).Row
     
     
    For cpt_ligne_data = 2 To nbre_ligne_data
        supp = "OUI"
        For cpt_ligne_pf = 2 To nbre_ligne_pf
            ref_data = Workbooks("PICPDP.xlsm").Sheets("DATA").Cells(cpt_ligne_data, 5).Value
            ref_pf = Workbooks("PICPDP.xlsm").Sheets("LISTE PF").Cells(cpt_ligne_pf, 1).Value
            If ref_data = ref_pf Then
                supp = "NON"
                Exit For
            End If
        Next
        If supp = "OUI" Then
           Rows(cpt_ligne_data).Delete
           cpt_ligne_data = cpt_ligne_data - 1
           supp = "OUI"
        End If
    Next
     
     
    End Sub
    Merci d'avance

    Vincent

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2013
    Messages : 114
    Par défaut
    Avec une fonction qui correspond à la rechercheV et qui supprime la ligne si ERREUR.

    Ca n'irai pas plus vite?

    Merci d'avance

    Vincent

  3. #3
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonsoir
    essayer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    et à la fin du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = True

  4. #4
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    voir avec ça :
    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
    Option Explicit
    Sub test()
    Dim Plage As Range,  i As Long, j As Long
    Application.ScreenUpdating = False
    With Sheets("LISTE PF")
    j = .Range("A" & Rows.Count).End(xlUp).Row
    Set plage = .Range("A2:A" & j)
    End With
     
        With Worksheets("DATA")     
            For i = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
                    If Application.CountIf(plage, .Cells(i, 5)) < 1 Then Cells(i, 1).EntireRow.Delete
            Next i
        End With
        Application.ScreenUpdating = True
    End Sub

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Avant même de parler de vitesse, il faudrait modifier la boucle.
    Pour supprimer des lignes il faut partir de la dernière ligne vers la première et au lieu d'utiliser une chaîne de caractère "OUI", "NON" il est plus logique d'utiliser une variable booléenne voir un test logique immédiatement.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par guismoman60 Voir le message
    Avez vous des idées pour optimiser le code?
    Bonjour,

    oui : l'effacer intégralement car cela ne devrait pas dépasser une minute ou deux et ce manuellement donc sans code ‼

    Ceci afin de respecter la règle primordiale : Penser Excel avant VBA !

    Car une boucle est tout à fait inutile pour supprimer des lignes et c'est la raison d'une telle lenteur !
    En effet, il suffit juste d'utiliser une colonne annexe pour distinguer les lignes à supprimer de celles à conserver
    via une simple formule de calculs retournant VRAI ou FAUX ou encore 1 ou 0 …
    Ensuite il suffit de trier la plage sur cette colonne regroupant ainsi les lignes à supprimer en un bloc en fin de liste.
    Ne reste plus qu'à effacer (et non pas supprimer) ce bloc. Quelques exemples dans les discussions de ce forum …

    ___________________________________________________________________________________________________________
    Je suis Paris, Mogadicio, Barcelone, London, Manchester, Egypte, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2013
    Messages : 114
    Par défaut
    Merci beaucoup

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

Discussions similaires

  1. [XL-2007] Barre de progression personnalisée et possible optimisation du code.
    Par Stanler dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/08/2014, 14h15
  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