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 :

Suppression de ligne en fonction d'une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut Suppression de ligne en fonction d'une colonne
    Bonjours à tout le monde,

    Alors voila, petit scarabé a encore besoin de vous.
    Donc mon problème est un fichier avec plein de ligne et plein de colonne (jusque là rien d'anormal).Le problème c'est que toutes les cellulles ne sont pas renseignées.Et pour que je puisse l'exploiter, il faudrait que par exemple si la cellule C4 et C18 alors la ligne 4 et 18 s'efface.Et évidement que la ligne 4 devienne la 4 et la 18 devienne la 16 .

    Merci d'avance pour vos précieux conseil
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné Avatar de Jean-Pierre49
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2007
    Messages
    659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2007
    Messages : 659
    Points : 2 056
    Points
    2 056
    Par défaut
    Bonjour

    il faudrait que par exemple si la cellule C4 et C18
    Soient égales a quoi?

    A quel moment les lignes seraient effacées?

    Explique un peu mieux STP

    A toi

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    désolé si ces deux cellules sont vides.
    On utilise se code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A:A").Cells.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Mais par exemple j'ai une colonne avec (route,barge,rail,mixte et vide)
    Je voudrais récupérer que les lignes qui sont en route.

    Et que tout ça se fasse quand on clic sur un bouton de commande.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Je ne comprens toujours pas.
    Je remplace TypeBlanks par Type"Route" par exemple
    Et là une grosse erreure.
    Je voudrais juste que excel vérifie la colonne A et à chaque fois que la cellule n'est pas ="route" alors qu'il supprime la ligne cerrespondante.

  5. #5
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TEST()
    Dim i As Integer
     
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 '<-- s'arrête à la ligne 2 si la colonne comporte une en-tête, à adapter
        If Cells(i, 1) <> "route" Then Rows(i).Delete
    Next
    End Sub

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    merci beaucoup fring,

    Mais par contre ou est-ce qu'il faut changer le code pour qu'il me fasse ça sur la colonne D par exemple (désolé mais je vous avais prévenu que j'étais nul ... non .... et bien là c'est fait lol)

    Et puis dans le code tu écris

    "<-- s'arrête à la ligne 2 si la colonne comporte une en-tête, à adapter"


    si ça s'arrête à la ligne 2 ça veut dire qu'il ne vérifie que les en-tête?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Fring vous a donné le code en fonction de votre exemple qui n'est pas tout à fait représentatif de ce que vous voulez faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TEST()
    Dim i As Integer
     
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 '<-- s'arrête à la ligne 2 si la colonne comporte une en-tête, à adapter
        If Cells(i, 1) <> "route" Then Rows(i).Delete
    Next
    End Sub
    Dans ce code la variable "i" va changer de valeur à chaque passage dans la boucle.

    Et dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(i, 1) <> "route" Then Rows(i).Delete
    le 1 en rouge indique la colonne A.

    si vous voulez faire le test sur la colonne "D" il faut remplacer le 1 par 4
    (colonne 4 = colonne D).

    Ensuite vous écrivez :

    si ça s'arrête à la ligne 2 ça veut dire qu'il ne vérifie que les en-tête?
    Bien sûr que non. Dans votre exemple le titre de colonne se trouve en ligne 2 et il y toutes les chances pour que ce titre ne corresponde pas au texte "Route".

    Donc le code donné par Fring précise simplement qu'il faut tester la valeur de chaque ligne mais arrêter cette comparaison à la ligne 2 sinon votre ligne de titre serait également supprimée puisque vous dîtes :

    Je voudrais récupérer que les lignes qui sont en route.
    Dernière modification par Invité ; 14/06/2008 à 11h15.

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Juste pour compléter l'excellente explication de Jacques-Jean (que je salue au passage), lorsque l'on fait une boucle afin de supprimer des lignes entières, il faut faire une boucle inversée de bas en haut.

    Pourquoi ?
    Supposons que l'on part de la ligne 1 à la ligne 5 et que les lignes à supprimer sont les lignes 2 et 3. Lorsque la boucle passera sur la ligne 2, elle la supprimera puis passera sur la ligne 3 seulement...comme la ligne 2 vient d'être supprimée, la ligne 3 est passée en ligne 2, ne sera pas contrôlée par la boucle (puisque celle-ci vient de contrôler la ligne 2) et ne sera donc pas supprimée.
    En faisant une boucle inversée de bas en haut le problème ne se produit pas, la boucle contrôlera d'abord la ligne 3, la supprimera (la 4 devient la 3 mais a déjà été contrôlée), puis contrôlera la ligne 2 et la supprimera aussi.

    Voilà pourquoi dans le code que j'ai proposé, je commence à la dernière ligne Cells(Rows.Count, 1).End(xlUp).Row pour remonter et m'arrêter à la ligne 2, la ligne 1 étant souvent le titre de la colonne.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup à tous

    vous êtes vraiment géniaux, ça fonctionne à la perfection.

    Et les explications sont super clair (même moi j'ai compris )

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Argggggg.
    Dans les fichiers test tout était ok. Mais par contre dès que je lance le programme avec les données réelles, il me met un message d'erreur
    "erreur d'exécution '6':
    Dépassement de capacité"
    est-ce que quelqu'un aurais une petite idée ?

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

    Regardez les types de variables.

    Exemple :

    si vous traitez un N° de ligne > 32767 il faut indiquer :

    Vous pouvez trouver où cette erreur se produit et avec quelle variable en plaçant un point d'arrêt au début de la procédure et en appuyant sur "F8"
    pour avancer instruction par instruction dans le code jusqu'à ce que l'erreur se produise.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    Bonjours Jacques_Jean

    le problème c'est que je n'ai qu' environs 8500 lignes à traiter, J'ai essayé de changer le "integer" par "long" et plus rien.
    J'ai tout repris à zéro
    Donc j'ai pris une feuille à traiter, puis j'ai fais un commandbutton et dans le code, J'y ai mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub CommandButton1_Click()
     
    Dim i As Integer
    For i = Cells(Rows.Count, 20).End(xlUp).Row To 2
    If Cells(i, 20) <> "Road" Then Rows(i).Delete
    Next
     
    End Sub
    et toujours rien,j'ai essayé de faire un point d'arrêt et F8 .Il met "Private Sub CommandButton1_Click()" en surbrillance, ensuite il met "For i = Cells(Rows.Count, 20).End(xlUp).Row To 2" en surbrillance et enfin c'est "End Sub" qui est en surbrillance.

    est-ce que c'est normal ?

  13. #13
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Par défaut, le pas d'une boucle est +1, dans ton cas tu fais une boucle inverse, il faut donc lui préciser que le pas est -1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = Cells(Rows.Count, 20).End(xlUp).Row To 2 Step -1

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    bonjour fring,

    Impécable la boucle ce fait bien et je n'ai plus que les lignes qui me sont utiles.

    Un très gros merci à tous.

    bonne journée.

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

Discussions similaires

  1. Colorer lignes DBGrid en fonction d'une colonne
    Par juju1988 dans le forum Langage
    Réponses: 21
    Dernier message: 01/08/2013, 12h12
  2. Suppression d'une ligne en fonction d'une cellule
    Par flo1411 dans le forum Excel
    Réponses: 6
    Dernier message: 26/03/2013, 16h28
  3. Réponses: 1
    Dernier message: 10/02/2008, 19h56
  4. Supprimer lignes en fonction d'une colonne
    Par eillon dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 10/12/2007, 11h15
  5. Concaténer des lignes d'enregistrements dans une colonne
    Par dany13 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 08/07/2005, 21h56

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