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 lignes par condition Excel [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Avril 2018
    Messages : 39
    Par défaut Supprimer lignes par condition Excel
    Bonjour,
    Je voulais créer une Macro qui supprime:
    - Les lignes Vides.
    - Les Lignes ou la colonne B n'est pas un chiffre.
    - Toutes les lignes ou la colonne B commence par une *

    Voici mon code: ca fonctionne à date, mais je me demande s'il y a mieux (par curiosité )
    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
     
     
    Sub Mise_En_Forme()
    Dim i As Integer
     
     
        For i = Range("B65536").End(xlUp).Row To 1 Step -1
        ' Supprimer les lignes ou les colonnes B commence par une *
        If Range("B" & i) Like "* *" Then Rows(i).Delete
        If Range("B" & i) Like "Rubrique*" Then Rows(i).Delete
        If Range("B" & i) Like "Montant*" Then Rows(i).Delete
        If Range("B" & i) Like "Devise*" Then Rows(i).Delete
        If Range("B" & i) Like "*** " Then Rows(i).Delete
        ' Supprimer les lignes vides
        Range("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
     
    Next i
     
    End Sub
    Merci!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Les conditions énoncées dans le code que tu montres ne correspondent pas à celles énoncées dans ton message.

    La condition like "* *" ne teste pas ce qui commence par * (il y a un espace de trop dans la chaîne)

    Le problème avec ton code, c'est que tu testes des lignes déjà testées. En effet, si pour Bi (i = compteur de boucle), le code de ta ligne 9 supprime la ligne, tes lignes remontent et donc, les lignes 10 à 13 testent une ligne déjà testée à la boucle précédente.

    La ligne de code [codeinline]Range("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete[/codeineline] supprime la ligne entière si B est vide (et pas si la ligne entière est vide).

    La macro vient manifestement d'un fichier 2003. En XL2010, tu aurais intérêt à utiliser range("b1048576").end(xlup), au cas ou ta feuille serait remplie au delà de la ligne 65536.

    Conclusion rapide: ton énoncé pose problème par rapport au code proposé
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Avril 2018
    Messages : 39
    Par défaut
    Merci pour la réponse, Effectivement, je savais qu'il y a des choses à améliorer... Par contre pour la condition like "* *" , il n'y a pas d'espace de trop, car si tu ne fait pas d'espace, la condition va effacer toutes les lignes.

    Tu peux le tester...



    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    Les conditions énoncées dans le code que tu montres ne correspondent pas à celles énoncées dans ton message.

    La condition like "* *" ne teste pas ce qui commence par * (il y a un espace de trop dans la chaîne)

    Le problème avec ton code, c'est que tu testes des lignes déjà testées. En effet, si pour Bi (i = compteur de boucle), le code de ta ligne 9 supprime la ligne, tes lignes remontent et donc, les lignes 10 à 13 testent une ligne déjà testée à la boucle précédente.

    La ligne de code [codeinline]Range("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete[/codeineline] supprime la ligne entière si B est vide (et pas si la ligne entière est vide).

    La macro vient manifestement d'un fichier 2003. En XL2010, tu aurais intérêt à utiliser range("b1048576").end(xlup), au cas ou ta feuille serait remplie au delà de la ligne 65536.

    Conclusion rapide: ton énoncé pose problème par rapport au code proposé

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Moi, je m'en tiens à ce que tu as écrit, à savoir :
    Je voulais créer une Macro qui supprime:
    - Les lignes Vides.
    - Les Lignes ou la colonne B n'est pas un chiffre.
    - Toutes les lignes ou la colonne B commence par une *
    Il suffit alors de supprimer toutes les lignes dont la propriété text de la cellule Bn n'est pas un numérique, puisqu'un vide n'est pas un numérique et qu'un texte commençant par un "*" n'en est pas un non plus .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not isnumeric(Range("B" & i).text) then Rows(i).Delete
    Il n'y aura aucun croche-pieds dans la numérotation puisque je vois (step -1) que le parcours est fait de bas en haut.

    Au passage : l'utilisation de l'opérateur Like (si on l'utilise) pour vérifier que le premier caractère d'un texte est un astérisque se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If la_chaîne like "[*]*" Then ...

  5. #5
    Membre actif
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Avril 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Avril 2018
    Messages : 39
    Par défaut
    Merci C'est super, je savais qu'on pouvait faire beaucoup mieux.


    Citation Envoyé par unparia Voir le message
    Bonjour
    Moi, je m'en tiens à ce que tu as écrit, à savoir :

    Il suffit alors de supprimer toutes les lignes dont la propriété text de la cellule Bn n'est pas un numérique, puisqu'un vide n'est pas un numérique et qu'un texte commençant par un "*" n'en est pas un non plus .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not isnumeric(Range("B" & i).text) then Rows(i).Delete
    Il n'y aura aucun croche-pieds dans la numérotation puisque je vois (step -1) que le parcours est fait de bas en haut.

    Au passage : l'utilisation de l'opérateur Like (si on l'utilise) pour vérifier que le premier caractère d'un texte est un astérisque se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If la_chaîne like "[*]*" Then ...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je me suis mal exprimé...

    "* *" ne teste pas ce qui commence par "*", mais bien ce qui contient un espace... Si tu veux tester ce qui commence par *, tu dois utiliser "[*]*"

    Pour le reste, ta demande ne correspondant pas au code, qui teste que les lignes commencent par tel ou tel mot, il serait utile que tu précises ce que tu souhaites supprimer, afin d'éviter des discussions interminables sur le pourquoi du comment dont certains sont hélas friands
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. [XL-MAC 2011] supprimer ligne par rapport a un combobox
    Par sebing dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2011, 09h20
  2. supprimer lignes sous conditions
    Par mehdi.017 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2010, 02h42
  3. supprimer ligne selon condition
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/06/2009, 16h39
  4. Supprimer ligne par macro
    Par a.dequidt dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/09/2007, 11h36
  5. Macro: Insertion de ligne par condition
    Par Monteninho dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/08/2007, 14h48

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