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 :

Supprimer des lignes avec vba [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 67
    Par défaut Supprimer des lignes avec vba
    bonsoir la communauté,bonne année 2015
    je voudrais savoir comment je peux supprimer des lignes d'une feuille de calcul excel 2007 à partir du code vba.en effet j'ai un tableau de 5 colonnes et environ un millier de ligne.mon objectif est de supprimer les lignes n'ayant pas de données dans toutes les colonnes et cela à partir de vba
    merci d'avance pour votre aide.
    Cordialement.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une solution possible avec ce 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
    Sub SupprimerLesLignes()
     
    Dim LigneDeTitre As Long
    Dim DerniereLigne As Long
    Dim I As Long
     
        With ActiveSheet
             LigneDeTitre = 1
             DerniereLigne = .UsedRange.Rows.Count ' S'il n'y a pas de lignes totalement vides
            ' DerniereLigne = .Cells(.Rows.Count, 1).End(xlUp).Row ' Sinon, si la première colonne est toujours remplie
             For I = DerniereLigne To LigneDeTitre + 1 Step -1
                 If WorksheetFunction.CountA(Range(.Cells(I, 1), .Cells(I, 5))) < 5 Then .Cells(I, 1).EntireRow.Delete
             Next I
        End With
     
    End Sub
    Cordialement.
    Dernière modification par Invité ; 08/01/2015 à 07h47.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 67
    Par défaut
    salut,
    merci bien Eric KERGRESSE pour ton coup de main, le code marche à merveille juste qu'il manquait un tout petit "end if" pour que se soit parfait.vous me sortez une belle épine du pied .
    Cordialement

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut

    'il manquait un tout petit "end if"
    Juste par curiosité, où as-tu ajouté ce petit "end if" ?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonsoir le fil, bonsoir le forum,

    Pareil Qwazerty !...

    Une autre proposition plus rapide si il y a beaucoup de 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
    Sub Macro1()
    Dim O As Object 'déclare la variable O (Onglet)
    Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim LS As Range 'déclare la variable LS (LigneS)
    Dim TEST As Boolean 'déclare la variable TEST
     
    Set O = Sheets("Feuil1") 'définit l'onglet O (à adapter)
    TC = O.UsedRange 'définit le tableau de cellules TC
    Set LS = Range("A1") 'initialise la plage LS
    For I = 2 To UBound(TC, 1) 'boucle 1 : sur toutes les lignes du tableau TC (en partant de la seconde)
        For J = 1 To UBound(TC, 2) 'boucle 2 : sur toutes les colonnes du tableau TC
            'condition : si la valeur du tableau TC en ligne I, colonne J n'est pas vide, définit la variable
            'TEST comme [Vrai] et sort de la boucle 2
            If TC(I, J) <> "" Then TEST = True: Exit For
        Next J 'prochaine colonne de la boucle 2
        'si TEST est [faux] redéfinit la plage LS (si Ls ne contient qu'une seule cellule, LS devient la ligne I,
        'sinon la ligne I s'ajoute à LS)
        If TEST = False Then Set LS = IIf(LS.Cells.Count = 1, Rows(I), Application.Union(LS, Rows(I)))
        TEST = False 'définit la variable TEST comme [faux]
    Next I 'prochaine ligne de la boucle 1
    LS.Delete 'efface la plage LS
    End Sub

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 122
    Par défaut
    Salut

    En terme de rapidité d'exécution, il est très fortement conseillé lors de ce type de traitement qui peuvent être assez long, de désactiver la mise à jour de l'écran en utilisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    '...
     
    Application .ScreenUpdating = false
     
    'La boucle qui modifie le tableau Excel
    '....
     
    Application .ScreenUpdating = True
     
    '...
    C'est non négligeable comme gain de temps.
    Par contre un inconvénient, si le code plante et que vous choisissez d'arrêter l'exécution de celui-ci, penser à déplacer le curseur d'exécution (Flèche jaune qui pointe la ligne de code qui va être exécuté) sur la ligne ScreenUpdating = True et exécuté la avec la touche F8, sinon la mise à jour ne se fera plus dans Excel... et c'est pénible.
    Au global pour éviter ça, il faut faire une gestion d'erreur et activé le ScreenUpdating avant de quitter la macro.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Tout à fait d'accord avec toi Qwazerty. Je ne l'ai pas mis dans le code que j'ai proposé car seule la dernière ligne : LS.Delete agit réellement sur le SreenUpdating. Et comme elle efface toutes les lignes en une seule fois ce n'était plus nécessaire...
    Il est aussi conseillé, si le fichier contient de nombreuses formules, de mettre le calcul en manuel en début de macro (
    Application.Calculation = xlCalculationManual) puis de le remettre au automatique en fin de celle-ci (Application.Calculation=xlCalculationAutomatic) pour gagner du temps.


  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sigma17 Voir le message
    le code marche à merveille juste qu'il manquait un tout petit "end if" pour que se soit parfait.
    Bonjour Sigma17,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If WorksheetFunction.CountA(Range(.Cells(I, 1), .Cells(I, 5))) < 5 Then .Cells(I, 1).EntireRow.Delete
    Sachez que lorsque Then est suivi d'un code sur la même ligne, le End If est implicite, comme c'est le cas ici.

    Si bien sûr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(I, 1).EntireRow.Delete
    est mis à la ligne après Then, il vous faut ajouter ce End If en dessous de cette ligne.

    C'est ce qu'ont voulu vous indiquer aussi Qwazerty et Thautheme.

    Cordialement.

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

Discussions similaires

  1. [XL-2010] Besoin d'aide pour supprimer des lignes en VBA
    Par SimKmil dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/05/2013, 08h46
  2. Supprimer des lignes avec R
    Par vincent1989 dans le forum R
    Réponses: 2
    Dernier message: 03/12/2012, 15h19
  3. comment supprimer des lignes avec macros
    Par kadij dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/06/2009, 06h14
  4. supprimer des lignes avec VBA
    Par NulenVBA dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/10/2008, 17h14
  5. Supprimer plusieurs lignes avec VBA
    Par Nounours1 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/03/2008, 11h50

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