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 :

[Débutant] Suppression ligne


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2017
    Messages : 14
    Points : 4
    Points
    4
    Par défaut [Débutant] Suppression ligne
    Bonjour,

    Je viens tout juste de commencer sur VBA, et je bloque déjà sur ma première manipulation.

    J'ai un fichier excel avec plusieurs colonnes, dans le colonne A j'essaye de supprimer les lignes dont les cellules = ?.

    Colonne A Colonne B Colonne C Ect.
    DATA CODE NOM_SITE
    9623977 112946 CHANTILLY
    9623978 126067 CARCASSONNE/10/DU CHÂTEAU
    ? ? CARBONNE

    J'ai trouvé une solution sur internet qui marche bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SuppBIO()
    Dim I As Integer
    For I = [A65000].End(xlUp).Row To 1 Step -1
        If Not Cells(I, 1).Find("~?") Is Nothing Then Rows(I).Delete
    Next I
    End Sub
    Toutefois j'essaye de comprendre mon erreur avec le code que j'ai commencé à créer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub exemple()
    Dim i As Variant
    i = Range("A:A")
    If Cells(i, 1) = "~?" Then
        Cells(i, 1).EntireRow.Delete
    End If
     
    End Sub
    Pourriez-vous m'éclairer ? et me conseiller éventuellement des ouvrages ou des sites internet.

    En vous remerciant par avance pour votre aide je vous souhaite à tous une bonne semaine,

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 947
    Points : 4 058
    Points
    4 058
    Par défaut
    Citation Envoyé par Delta2017 Voir le message
    Pourriez-vous m'éclairer ? et me conseiller éventuellement des ouvrages ou des sites internet.
    Tu peux commencer par lire ceci :
    http://laurent-ott.developpez.com/tu...el-vba-tome-1/

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 254
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub exemple()
    Dim i As Variant
    i = Range("A:A")
    If Cells(i, 1) = "~?" Then
        Cells(i, 1).EntireRow.Delete
    End If
     
    End Sub
    Dans le code ci-dessus, plusieurs choses :

    - A chaque fois que tu fais référence à une cellule, pense à ajouter au moins la feuille Parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("LeNomDeTaFeuille").cells(i,1)
    Ca t'évitera bien des problèmes de référence par la suite. Ou sinon, encore plus simple, tu déclares un objet worksheet permettant d'y faire référence facilement et rapidement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim MaFeuille as worksheet
    set MaFeuille = workbooks("MonClasseur").worksheets("MaFeuille")
     
    'Pour y faire référence de cette manière :
    MaFeuille.cells(i,1)
    Pour supprimer des lignes, dans un premier temps, tu dois connaître le numéro de la dernière ligne non vide de ton tableau. Pour cela, utilise la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Ligne as long
    Ligne=MaFeuile.cells(rows.count,1).end(xlup).row 'Tu connaîtras ainsi la dernière ligne non vide de la colonne 1
    Ensuite, pour supprimer proprement les lignes, il faut boucler à partir de la fin (pour éviter de sauter des lignes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = Ligne to 1 'Tu vas ici boucler de la fin de ton tableau jusqu'à la ligne 1
    'Ta procédure
    Next i
    Si tu sais quel va être le type unique de données que ta variable i va prendre, alors il faut lui donner un type précis. En l’occurrence ici, ce que tu cherches à faire c'est boucler sur chaque ligne.

    Une dernière chose concernant la suppression d'une ligne, il y a plusieurs façons de le faire. Moi j'utilise celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaFeuille.rows(i).delete
    Reprenons ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim i as variant
    i=range("A:A")
    Il est possible de procéder ainsi en intégrant une boucle "For Each" qui te permettra de boucler sur chaque cellule de la zone A:A. Cependant, maintenant qu'Excel à plus d'1 million de ligne, c'est un peu laborieux. Donc si tu as besoin de travailler sur une zone, il est toujours préférable de bien la définir. C'est là que reviens la variable "Ligne" utilisé précédemment pour baliser ta zone de la manière suivante :

    Ps : Dans ce cas, à la place de déclarer i as variant, tu peux la typer en tant que Range car elle va recevoir une zone de cellule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i=MaFeuille.range("A:A" & Ligne)
    Bonne lecture et bon apprentissage !

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Delta2017 Voir le message
    J'ai trouvé une solution sur internet qui marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SuppBIO()
    Dim I As Integer
    For I = [A65000].End(xlUp).Row To 1 Step -1
        If Not Cells(I, 1).Find("~?") Is Nothing Then Rows(I).Delete
    Next I
    End Sub
    Les variables qui désignent des numéros de lignes doivent être typé en Long (à moins de travailler encore avec une version Excel antérieure à 2007).
    A priori, je ne vois pas trop à quoi sert le Find.
    Il serait plus simple d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub SuppBIO()
    Dim I As Long
    For I = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
        If Cells(I, 1).Text = "?" Then Rows(I).Delete
    Next I
    End Sub
    Si tu as beaucoup de lignes, ceci sera plus rapide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub SuppBIO()
    Dim R As Range
    Set R = Range("A1", Cells(Rows.Count, 1).End(xlUp).Find("?")
    While Not R Is Noting
        R.EntireRow.Delete
        Set R = FindNext
    Wend
    End Sub

    Toutefois j'essaye de comprendre mon erreur avec le code que j'ai commencé à créer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub exemple()
    Dim i As Variant
    i = Range("A:A")
    If Cells(i, 1) = "~?" Then
        Cells(i, 1).EntireRow.Delete
    End If
     
    End Sub
    Pourriez-vous m'éclairer ? et me conseiller éventuellement des ouvrages ou des sites internet.
    Si ce code est supposé faire la même chose que le précédent, tu as déjà un problème au niveau algorithmique : il manque une boucle.

    Pour les ouvrages : http://bidou.developpez.com/article/VBA/
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Trystan441 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i=MaFeuille.range("A:A" & Ligne)
    Il est peu probable que cette ligne de code fonctionne : quand on définit une zone, on met soit autant de référence de lignes que de colonnes soit aucune référence de ligne mais jamais deux références de colonne et une seule de ligne.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Candidat au Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2017
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2017
    Messages : 14
    Points : 4
    Points
    4
    Par défaut
    Un grand merci à ceux qui on prit le temps de répondre !
    Je vais prendre le temps de tout décortiquer :-)
    Un grand merci !

  7. #7
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous,

    Menhir,

    Bien ton processus.

    Sinon j'avais

    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
    Option Explicit
     
    Public Sub supprime()
     
    Dim dernl As Long
     
    Application.ScreenUpdating = False
     
    With Feuil1
            dernl = .Cells(.Rows.Count, 1).End(xlUp).Row
            With .Range("A1:A" & dernl)
                    .Replace What:="~?", Replacement:="", lookat:=xlWhole
                    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
            End With
    End With
     
    End Sub
    J'ai eu un échange, de mémoire avec Laurent, sur la rapidité du code pour 1 million de lignes.
    Je vais essayer.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  8. #8
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Menhir,

    J'ai un problème avec ton code que j'ai modifié (il manque une parenthèse après xLuP, Noting, FindNext non rattaché...)

    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
    Public Sub supprime_menhir()
     
    Dim T As Single
    T = Timer
     
    Dim R As Range
     
    Application.ScreenUpdating = False
     
    With Feuil1
      With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
            Set R = .Find("toto")
            While Not R Is Nothing
                        R.EntireRow.Delete
                       Set R = .FindNext(R)
            Wend
      End With
    End With
     
    Set R = Nothing
     
    Debug.Print Timer - T & " secondes"
     
    End Sub
    Apparaît une erreur
    1004 Impossible de lire la propriété.....
    sur la ligne .
    D'après moi, elle proviendrait de la suppression de ligne.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  9. #9
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    J'ai déjà constaté qu'utiliser la méthode Find() pour la suppression de lignes ou colonnes n'était pas la meilleure façon de faire et généré parfois des résultats plutôt surprenants surtout que FindNext() à besoin de la position de la cellule précédemment trouver pour repartir, je préfère une remontée dans les lignes (ou une venue de droite à gauche pour les colonnes) pour la suppression mais comme dit, ce n'est que mon opinion. Sinon, il y a aussi le filtrage avec suppression, chercher ce qui est différent et copier sur une autre feuille puis vider la plage et recoller les données.

  10. #10
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour le Forum,

    Bonjour Theze (ravi de te retrouver)

    surtout que FindNext() à besoin de la position de la cellule précédemment trouver pour repartir,
    C'est ce que j'ai reporté dans mon dernier post.

    Quant au processus lui-même, si l'on veut conserver la méthode Find (pour le Fun ) alors il faudrait envisager l'union des cellules trouvées pour pouvoir ensuite effectuer la suppression de lignes en un bloc.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Option Explicit
     
    Public Sub supprime_union()
     
    Dim T As Single
    T = Timer
     
    Dim R As Range
    Dim U As Range
    Dim firstaddress As String
     
    Application.ScreenUpdating = False
     
    With Feuil1
    With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp))
                    Set R = .Find("toto", LookIn:=xlValues)
                    If Not R Is Nothing Then
                            firstaddress = R.Address
                            Set U = R
                            Do
                                    Set R = .FindNext(R)
                                    Set U = Union(U, R)
                            Loop While Not R Is Nothing And R.Address <> firstaddress
                    End If
                    Set R = Nothing
            End With
    End With
     
    If Not U Is Nothing Then U.EntireRow.Delete
     
    Set U = Nothing
     
    Debug.Print Timer - T & " secondes"
     
    End Sub

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  11. #11
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Peut-être comme ça (je n'ai pas testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub SuppBIO()
    Dim R As Range, Deb As Range, Fin As Range
    Set Deb = Range("A1")
    Set Fin = Cells(Rows.Count, 1).End(xlUp).Offset(2, 0)
    Set R = Range(Deb, Fin).Find("?")
    While Not R Is Nothing
        Set Deb = R.Offset(1, 0)
        R.EntireRow.Delete
        Set R = Range(Deb, Fin).Find("?")
    Wend
    End Sub


    Si ce code est supposé faire la même chose que le précédent, tu as déjà un problème au niveau algorithmique : il manque une boucle.

    Pour les ouvrages : http://bidou.developpez.com/article/VBA/[/QUOTE]
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

Discussions similaires

  1. Débutant - Suppression de lignes dans un fichier
    Par Mil17 dans le forum Langage
    Réponses: 1
    Dernier message: 20/11/2007, 17h08
  2. [HTML]Débutant-Suppression d'une ligne dans un tableau
    Par Kotik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 19/07/2006, 11h53
  3. [VBA][Word] débutant suppression d'une page
    Par cyrcroix dans le forum VBA Word
    Réponses: 3
    Dernier message: 30/12/2005, 19h22
  4. [JTable] probleme suppression ligne
    Par lilou77 dans le forum Composants
    Réponses: 1
    Dernier message: 01/11/2005, 10h34

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