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 :

Temps execution boucle suppression ligne


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 99
    Points : 45
    Points
    45
    Par défaut Temps execution boucle suppression ligne
    Bonjour
    Je cherche à optimiser le temps d'exécution d'une boucle.
    Mon fichier fait +/- 50 000 lignes et je souhaite tester la valeur d'une cellule dans la ligne, et supprimer la ligne si cette valeur n'est pas valide.

    Dans la colonne A je dispose de valeur du genre :
    tototata
    tototutu
    rururoro
    popopapa
    ...
    Je ne souhaite garder que les valeurs du style tototata / tototutu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for each cell in .range(.cells(1,1),.cells(DerniereLigne,1))
    if instr(1,cell.value,"toto",1)=0 then rows(cell.row)delete shift:=xlup
    next cell
    Je teste donc si toto est contenu dans la cellule (avec ou sans majuscule).
    Le problème est que cela prend pas mal de temps (1'30 facile)

    Y'a t'il d'autres façon de faire ?
    Peut être autre que 'instr', je pense à 'like'...
    Le faire avec un for ? un while ?

    Merci d'avance pour vos idées !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Points : 730
    Points
    730
    Par défaut
    Bonsoir,

    Juste un conseil si tu fais une boucle il faut commencer par la dernière ligne et remonter vers la première ligne.

    PPz
    La qualité et la précision de la réponse sont proportionnelles à celles de la question.

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu!...
    bonjour
    regarde dans l'aide vba
    tu a un debut de macro au sujet de "find" et find next qui est relativement moins long qu'une boucle
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Ok je vais regarder du coté du find next.
    Pourquoi partir du bas lors d'une boucle ? C'est plus rapide ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    With Worksheets(1)
    LastLigne = .Range("A65536").End(xlUP).row
    With Range(.Cells(1,1), .Cells(LastLigne,1))
        Set c = .Find("toto", lookin:=xlValues)
        If  c Is Nothing Then
            firstAddress = c.Address
            Do
                rows(h.row).Delete shift:=xlUp
                Set c = .FindNext(c)
            Loop While  c Is Nothing And c.Address <> firstAddress
        End If
    End With
    Cela ne marche pas...
    Mais dans le principe l'exécution est plus rapide qu'un for each ?

  6. #6
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    Dans la colonne A je dispose de valeur du genre :
    Je ne souhaite garder que les valeurs du style tototata / tototutu
    Si ce que tu souhaites conserver sont les chaînes commençant par "toto", tu appliques un filtre auto avec comme condition Commence par : Toto et tu as le résultat très très rapidement.

    Le reste n'est qu'une question de code, et si il y plusieurs options, je pense que ça restera de loin la méthode la plus rapide et la plus simple..

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Vraiment pas bête comme idée... j' n'y avait pas pensé !
    par contre une autre question :
    exemple :
    A1 : tototata
    A2 : tototutu
    A3 : roro
    A4 : momo
    A5 : toto

    Cela va me sortir A1,A2,et A5 soit 3 lignes
    Comment faire pour parcourir ces cellules ensuite ?
    Car d'habitude je le fais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LastLigne = .range("A65000").end(xlup).row
    Sauf qu'ici LastLigne me renvera 5 au lieu de 3 non ?

  8. #8
    Expert éminent sénior 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
    Points : 31 877
    Points
    31 877
    Par défaut
    Essaies comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    application.screenupdating=false
    With Sheets(1)
        .AutoFilterMode = False
        LastLigne = .Cells(Rows.Count, 1).End(xlUp).Row
        With .Range("A1:A" & LastLigne)
            .AutoFilter field:=1, Criteria1:="<>toto*"
            .SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False
    End With
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour mercatog,ormonth et re ipercut
    la macro de mercatog est pas mal mais elle fait exactement le contraire de se que tu cherche au départ

    c'est justement les toto ,tototutu qu'on veux supprimer et non pas garder que cela

    cela dit plus rapide que ça tu meurs hihihi je n'y avais pas penser a "autofilter"

    y a t_il un moyen de transformer la condition positive sur l'autofilter en négative tout simplement j'ai essayé mais boum ça bug il est vrai que je ne maîtrise pas beaucoup cette fonction


    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oupps

    si j'écrivais moins vite que je réfléchi j'économiserai des posts

    en reprenant l'idée de mercatog et ormonth voila la macro qui efface toute les lignes avec toto
    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
     
    Sub eface()
     
     
     
    Application.ScreenUpdating = False
    With Sheets(1)
        .AutoFilterMode = False
        LastLigne = .Cells(Rows.Count, 1).End(xlUp).Row
        With .Range("A1:A" & LastLigne)
            .AutoFilter field:=1, Criteria1:="=*toto*"
            .SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False
    End With
    End Sub
    j'ai simplement modifier le critère 1 avec "*toto*" de façon a qu'il n'y ai pas de récalcitrants et la c'est bien les totos qui sen vont et les titi reste hihihi

    je crois que l'on peut remercier mercatog et ormonth pour leur idée tiptop

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Merci Mercatog
    Non c'est bien cela que je souhaite faire. (garder les toto)
    Ton code marche nikel.

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

Discussions similaires

  1. [ methode ] temps execution
    Par hocinema dans le forum API standards et tierces
    Réponses: 13
    Dernier message: 08/09/2005, 11h53
  2. temps execution CreateProcess
    Par dighou dans le forum MFC
    Réponses: 7
    Dernier message: 26/04/2005, 16h18
  3. [MFC] pb temps execution
    Par ricky78 dans le forum MFC
    Réponses: 4
    Dernier message: 21/01/2005, 11h50
  4. Temps execution mysql
    Par azman0101 dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/07/2004, 09h42

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