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 :

Allégement d'une suppression de lignes parmi plusieurs lignes [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2016
    Messages : 3
    Par défaut Allégement d'une suppression de lignes parmi plusieurs lignes
    Bonjour chers tous,

    Je suis nouveau sur le forum...

    J'ai un soucis avec VBA:

    J'ai deux feuilles (TDB et Références).
    Mon programme consiste à supprimer dans la feuille TDB les lignes où la valeur de la cellule Cells(i, 35) est différente de celle de la cellule cells(4, 8) de la feuille Référence.
    La suppression se passe bien. Mon soucis est que l’exécution de mon programme met assez de temps (plus de 20 minutes) car la feuille TDB comporte 84.000 lignes.

    Ci-dessous le programme. Merci de bien vouloir m'aider à alléger mon programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    For i = 110 To (maLigne1 + 100)
    If Sheets("Références").Cells(4, 8).Value <> Sheets("TDB").Cells(i, 35).Value Then
     
    If Sheets("TDB").Cells(i, 35).Value = "" Then
    Exit Sub
     
    Else
    Sheets("TDB").Range(Cells(i, 1), Cells(i, 47)).EntireRow.Delete
    i = i - 1
     
    End If
    End If
     
    Next

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    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 681
    Par défaut
    Bonjour,

    Pour gagner du temps tu peux utiliser un filtre, puis supprimer toutes les cellules, puis défiltrer.

  3. #3
    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
    Bonjour !

    Citation Envoyé par Sylla12345 Voir le message
    l’exécution de mon programme met assez de temps (plus de 20 minutes) car la feuille TDB comporte 84.000 lignes
    Parmi les méthodes rapides en voici une pourtant accessible aux débutants avec le B-A-BA d'Excel :

    • Utiliser une colonne libre afin d'y appliquer une formule de calculs dont le résultat serta 0 ou 1 (ou encore FAUX ou VRAI),
       0 (ou FAUX) pour les lignes à conserver et donc 1 (ou VRAI) pour les lignes à supprimer.

    • Trier la plage y compris la colonne de la formule ci-dessus sur cette colonne :
       les lignes à supprimer sont regroupées en fin de plage.

    • Supprimer de la première ligne à 1 (ou VRAI) jusqu'en bas de la plage puis supprimer la colonne de la formule …

    Cette méthode peut déjà être opérée manuellement et
    en activant au préalable l'Enregistreur de macro une base de code est livrée sur un plateau !

    _________________________________________________________________________________________________________
    Je suis Paris, Berlin, Nice, Bruxelles, Charlie, …

  4. #4
    Membre chevronné
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Par défaut
    Bonjour,

    1) utiliser l'enregistreur de macro !! Il nous aide tellement mine de rien même si le code ressemble pas à grand chose en général. cependant, il nous ressort bien les objets, les méthodes et les propriétés
    2) Voir l'aide sur SpecialCells

    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
    Sub test()
    Dim DC%, VALEUR$
    Dim RG As Range
    Application.ScreenUpdating = False
    VALEUR = ThisWorkbook.Worksheets("Références").Cells(4, 8).Value
    With ThisWorkbook.Worksheets("TDB")
        DC = .Cells(1, .Columns.Count).End(xlToLeft).Column
        .Range(.Cells(1, 1), .Cells(1, DC)).AutoFilter Field:=3, Criteria1:="<>" & VALEUR, Criteria2:="<>", Operator:=xlAnd
        Set RG = .Range("_FilterDataBase").Offset(1, 0).Resize(Range("_FilterDataBase").Rows.Count - 1)
        RG.SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
        .AutoFilterMode = False
    End With
    Set RG = Nothing
    Application.ScreenUpdating = True
    End Sub

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2016
    Messages : 3
    Par défaut
    Bonjour à tous,

    Merci pour votre disponibilité!

    1/ Pour gagner du temps tu peux utiliser un filtre, puis supprimer toutes les cellules, puis défiltrer.

    J'ai essayé le code ci-dessous. Mais toutes mes lignes sont supprimées (même celles respectant la condition).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Range("AB109").Select
     Selection.AutoFilter
     ActiveSheet.Range("$AA$109:$AT$400000").AutoFilter Field:=9, Criteria1:="<>7" _
            , Operator:=xlAnd
     Rows("110:100000").Select
     Selection.Delete Shift:=xlUp
     Selection.AutoFilter

    2/ Proposition de bboy-easy:

    Avec le code, j'ai un message d'erreur (erreur d'exécution type 1004) au niveau de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set RG = .Range("_FilterDataBase").Offset(1, 0).Resize(Range("_FilterDataBase").Rows.Count - 1)

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    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 681
    Par défaut
    Citation Envoyé par Sylla12345 Voir le message

    J'ai essayé le code ci-dessous. Mais toutes mes lignes sont supprimées (même celles respectant la condition).

    Range("AB109").Select
    Selection.AutoFilter
    ActiveSheet.Range("$AA$109:$AT$400000").AutoFilter Field:=9, Criteria1:="<>7" _
    , Operator:=xlAnd
    Rows("110:100000").Select
    Selection.Delete Shift:=xlUp
    Selection.AutoFilter
    Etonnant, chez moi ça ne supprime que les lignes visibles, tu peux essayer avec specialcells:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Range("AB109").AutoFilter
     ActiveSheet.Range("$AA$109:$AT$400000").AutoFilter Field:=9, Criteria1:="<>7" _
            , Operator:=xlAnd
     Rows("110:100000").SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
     Range("AB109").AutoFilter

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2016
    Messages : 3
    Par défaut
    Bonjour à tous!

    Supeeer, merci halaster08.

    Avec ton code, ça marche bien... Sauf que j'avais ce bug:

    Erreur d'exécution 1004. Microsoft Office excel ne peut créer ni utiliser la plage de données car celle-ci est trop complexe. Essayez les solutions suivantes :
    -Utiliser les données qui peuvent être sélectionnées dans un rectangle contigu;
    -Utiliser les données de la même feuille.

    En fouillant sur le forum, j'ai trouvé une solution qui consiste à trier avant de filtrer... ça marche très bien. Et en peu de temps...

    Ci-dessous 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
    ''''''''Trier
    Range("B109").Select
        ActiveWorkbook.Worksheets("TDB").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("TDB").Sort.SortFields.Add Key:=Range("I110:I100000") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("TDB").Sort
            .SetRange Range("A109:S100000")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
    ''''''''Filtrer
    Range("B109").AutoFilter
     ActiveSheet.Range("$A$109:$T$100000").AutoFilter Field:=9, Criteria1:="<>" & Sheets("Références").Cells(4, 8).Value _
            , Operator:=xlAnd
     Rows("110:100000").SpecialCells(xlCellTypeVisible).Delete Shift:=xlUp
     Range("B109").AutoFilter
    Merci à tous!

  8. #8
    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 176
    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 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    la méthode décrite par Marc-L () que je salue au passage est excellente et facile à mettre en place pour un débutant et ce en peu de lignes de code
    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

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

Discussions similaires

  1. Copier une ligne dans plusieurs lignes de Matrice
    Par zicos dans le forum MATLAB
    Réponses: 3
    Dernier message: 22/05/2007, 10h28
  2. Réponses: 9
    Dernier message: 19/12/2006, 12h02
  3. Réponses: 2
    Dernier message: 19/01/2006, 19h33
  4. Réponses: 2
    Dernier message: 09/01/2006, 16h10
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42

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