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 :

[Tableaux Structurés] Suppression des lignes [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 134
    Points : 84 788
    Points
    84 788
    Billets dans le blog
    15
    Par défaut [Tableaux Structurés] Suppression des lignes
    Bonjour,

    Je souhaite supprimer les lignes d'un tableau structuré, merci de votre aide pour corriger ce code, car actuellement ce dernier fait juste l'effacement des données (Clear).

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub OuvrirOngletGL()
        Sheets("GL").Visible = True
        Sheets("GL").Activate
        Range("Tableau_GL").Clear ' Efface seulement les données.
     
        MsgBox "Le tableau GL a été vidé"
        Range("A2").Activate
    End Sub

    L'idée c'est de supprimer les lignes afin de pouvoir faire une nouvelle importation de données.
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Malick Voir le message
    Bonjour Malick,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("GL").ListObjects("Tableau_GL").DataBodyRange.Delete

  3. #3
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 134
    Points : 84 788
    Points
    84 788
    Billets dans le blog
    15
    Par défaut
    Bonjour Eric,

    Merci la suppression se fait bien à l'ouverture.
    Cependant, lorsque le tableau est vide et que j'ouvre l'onglet en question à nouveau, j'ai ce message :

    Nom : Sans titre.png
Affichages : 3732
Taille : 21,4 Ko

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub OuvrirOngletGL()
        Sheets("GL").Visible = True
        Sheets("GL").Activate
        ' Suppression des données à l'activation de la feuille
        Sheets("GL").ListObjects("Tableau_GL").DataBodyRange.Delete
                MsgBox "Le tableau GL a été vidé"
        Range("A2").Activate
    End Sub

    Débogage : en jaune la ligne Sheets("GL").ListObjects("Tableau_GL").DataBodyRange.Delete
    J'imagine que c'est parce qu'il ne trouve plus de données à supprimer.
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Malick Voir le message
    Essaye :
    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
     
    Sub OuvrirOngletGL()
     
        With Sheets("GL")
             .Visible = True
             .Activate
             ' Suppression des données à l'activation de la feuille
             With .ListObjects("Tableau_GL")
                  If .ListRows.Count > 0 Then
                    .DataBodyRange.Delete
                    MsgBox "Le tableau GL a été vidé"
                  End If
            End With
            .Range("A2").Activate
        End With
     
    End Sub

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,


    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
    Sub SuppressionLigneTableau2()
      nomtableau = "tableau1"
      n = 1
      If Range(nomtableau).Item(n, 1) <> "" Then Range(nomtableau).Rows(n).delete
    End Sub
     
    Sub InsèreLigneTableau2()
      nomtableau = "tableau1"
      Range(nomtableau).Rows(1).Insert
    End Sub
     
    Sub AjoutFinTableau2()
      nomtableau = "tableau1"
      If Range(nomtableau).Item(1, 1) <> "" Then n = Range(nomtableau).Rows.Count + 1 Else n = 1
      Range(nomtableau & "[nom]").Item(n, 1) = "xxxx"
    End Sub
     
    Sub VideTableau2()
       nomtableau = "tableau1"
       If Range(nomtableau).Item(1, 1) <> "" Then Range(nomtableau).delete
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  6. #6
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 134
    Points : 84 788
    Points
    84 788
    Billets dans le blog
    15
    Par défaut
    Salut,

    Citation Envoyé par Eric KERGRESSE Voir le message
    Essaye :
    Merci Eric, ça marche nickel.

    Citation Envoyé par boisgontierjacques Voir le message
    Bonjour,

    Boisgontier
    Merci Boisgontierjacques

    Bonne journée à vous

    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  7. #7
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut Malick,

    Depuis longtemps, j'ai mis ces fonctions génériques dans mon xlTools... Et perso, je préfère ne pas passer par la feuille mais par la plage, ce qui permet au code de continuer à fonctionner en cas de déplacement sur une autre feuille ou si on la renomme. Ca rend le code très générique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Table_Clear(Tablename As String)
      If Not Range(Tablename).ListObject.DataBodyRange Is Nothing Then Range(Tablename).ListObject.DataBodyRange.Delete
    End Sub



    Bien que tu ne l'aies pas demandé, mais comme un code t'a été donné...

    Pour insérer, je préfère utiliser le listobject et le listrow, qui permettent de travailler avec la plage du listrow

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
      Dim lr As ListRow
     
      Set lr = Range("tableau1").ListObject.ListRows.Add()
    End Sub
    Ca peut alors être utilisé de façon générique, avec un code lui aussi placé dans le xlTools, comme je le montre dans cette contribution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Table_Insert(Tablename As String, Values, Optional Before As Long = 0)
      Dim lr As ListRow
      Dim lo As ListObject
      Dim Counter As Long
     
      Set lo = Range(Tablename).ListObject
      If Before < 1 Or Before > lo.ListRows.Count Then Before = lo.ListRows.Count + 1
      Set lr = lo.ListRows.Add(Before)
      For Counter = 0 To UBound(Values) Step 2
        lr.Range(lo.ListColumns(Values(Counter)).Index).Value = Values(Counter + 1)
      Next
    End Sub
    Dès lors, pour insérer des données dans le tableau après l'avoir vidé, on peut utiliser ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Test()
      xlTools.Table_Clear "tableau1"
      xlTools.Table_Insert "tableau1", Array("Nom", "Térieur", "Prénom", "Alain", "DN", DateSerial(1985, 12, 14))
      xlTools.Table_Insert "tableau1", Array("Prénom", "Jean", "Nom", "Aymar")
      xlTools.Table_Insert "tableau1", Array("DN", DateSerial(1970, 9, 14), "Nom", "Hénas", "Prénom", "Julie"), 1
    End Sub
    On remarque alors que l'on peut insérer une ligne où on veut (les deux premières sont poussées à la suite alors que la troisième est placée en première ligne) et tu peux pousser tes données dans le tableau sans avoir à te soucier de l'ordre des colonnes (chaque ligne d'insertion possède un ordre différent pour les données). Si tu les permutes, ton code continue à fonctionner.

    Nom : 2020-04-21_203844.png
Affichages : 3608
Taille : 3,0 Ko



    Tu peux aussi pousser un array entier dans le tableau, par exemple pour récupérer un recordset d'Access ou de SQL dans un tableau structuré (ici, j'ai créé le tableau par code, mais le principe est là). Tu n'auras plus le choix de l'ordre des colonnes dans ce cas, mais tu passeras les données en 1 bloc (C'est une tuerie quand tu ramènes un recordset SQL server de 100000 lignes dans un tableau => quasi instantané)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test1()
      Dim t(1, 2)
     
      xlTools.Table_Clear "Tableau1"
      t(0, 0) = "Alain"
      t(0, 1) = "Térieur"
      t(0, 2) = DateSerial(1985, 12, 14)
      t(1, 0) = "Jean"
      t(1, 1) = "Aymar"
      t(1, 2) = DateSerial(1970, 9, 14)
      Range("tableau1").Resize(2, 3).Value = t
    End Sub

    En espérant t'avoir aidé
    "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...
    ---------------

  8. #8
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 134
    Points : 84 788
    Points
    84 788
    Billets dans le blog
    15
    Par défaut
    Salut Pierre,

    Excellente démonstration

    Effectivement avec ta proposition,on ne se soucie plus du nom de la feuille.

    Clairement ta contribution m'a aidé aussi, mais en aidera plus d'un autre sûrement.

    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  9. #9
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Pour vider un tableau (#3):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub VideTableau2()
      nomtableau = "tableau1"
      If Range(nomtableau).Item(1, 1) <> "" Then Range(nomtableau).delete
    End Sub

    Boisgontier

  10. #10
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    La solution pour l'ajout d'une ligne proposée au message #5 est erronée (outre la non déclaration des variables, le nom paramétrage de la fonction qui fait qu'on ne peut l'utiliser qu'avec le tableau1,...), car elle ne tient pas compte de la présence éventuelle d'une ligne de total en bas de la table de données. En effet, elle pousse la nouvelle donnée dans la ligne de total, ce qui est du plus mauvais effet

    Nom : 2020-04-22_103655.png
Affichages : 3684
Taille : 3,8 Ko

    L'utilisation de ListRows.Add se fout de la présence de la ligne de total et délègue au ListObject la responsabilité de tenir compte de la présence éventuelle de cette ligne.

    Pour revenir au sujet de la demande qui est de supprimer les lignes d'un tableau (de le vider, en fait, sans tenir compte d'une quelconque condition), la solution proposée au #9 est assez étonnante. Elle laisse supposer que le tableau est vide si la première cellule de la plage structurée est vide, puisqu'elle ne videra le tableau que si cette cellule n'est pas vide. Dès lors, le tableau suivant ne sera pas vidé... Passer par le ListObject ( Listobject.ListRows.Count> 0 ou Not ListObject.DataBodyRange Is Nothing) supprime les lignes si le tableau n'est pas vide, sans tenir compte d'une condition qui n'est pas exprimée dans la demande, et qui s'avère ne pas être judicieuse pour déterminer qu'un tableau doit être vidé ou pas

    Nom : 2020-04-22_104510.png
Affichages : 3760
Taille : 3,1 Ko


    En résumé: Pour coder de façon propre et professionnelle, il faut utiliser les bons outils. Lorsque l'on travaille sur la structure d'un tableau structuré (ajouter ou supprimer des lignes, c'est toucher à la structure), il est de loin préférable de travailler avec le listobject plutôt que d'essayer des fantaisies caduques ou franchement erronées qui ne travaillent qu'avec la plage
    "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...
    ---------------

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    La solution pour l'ajout d'une ligne proposée au message #5 est erronée (outre la non déclaration des variables, le nom paramétrage de la fonction qui fait qu'on ne peut l'utiliser qu'avec le tableau1,...), car elle ne tient pas compte de la présence éventuelle d'une ligne de total en bas de la table de données. En effet, elle pousse la nouvelle donnée dans la ligne de total, ce qui est du plus mauvais effet

    Nom : 2020-04-22_103655.png
Affichages : 3684
Taille : 3,8 Ko

    L'utilisation de ListRows.Add se fout de la présence de la ligne de total et délègue au ListObject la responsabilité de tenir compte de la présence éventuelle de cette ligne.

    Pour revenir au sujet de la demande qui est de supprimer les lignes d'un tableau (de le vider, en fait, sans tenir compte d'une quelconque condition), la solution proposée au #9 est assez étonnante. Elle laisse supposer que le tableau est vide si la première cellule de la plage structurée est vide, puisqu'elle ne videra le tableau que si cette cellule n'est pas vide. Dès lors, le tableau suivant ne sera pas vidé... Passer par le ListObject ( Listobject.ListRows.Count> 0 ou Not ListObject.DataBodyRange Is Nothing) supprime les lignes si le tableau n'est pas vide, sans tenir compte d'une condition qui n'est pas exprimée dans la demande, et qui s'avère ne pas être judicieuse pour déterminer qu'un tableau doit être vidé ou pas

    Nom : 2020-04-22_104510.png
Affichages : 3760
Taille : 3,1 Ko

    Pierre, comment ajouter un total en fin de tableau à la suite de l'ajout des lignes ?

    Merci


    En résumé: Pour coder de façon propre et professionnelle, il faut utiliser les bons outils. Lorsque l'on travaille sur la structure d'un tableau structuré (ajouter ou supprimer des lignes, c'est toucher à la structure), il est de loin préférable de travailler avec le listobject plutôt que d'essayer des fantaisies caduques ou franchement erronées qui ne travaillent qu'avec la plage

  12. #12
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 419
    Points : 16 262
    Points
    16 262
    Par défaut
    Bonjour

    Ta question noyée au milieu de la citation...

    Un tableau a intrinsèquement une ligne de total, affichable/masquable à volonté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("Tableau1").ListObject.ShowTotals=True
    ou False

    "Tableau1" à remplacer par la référence à l'objet qui est manipulé

    Mais sans code le bouton existe déjà dans l'interface Excel...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

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

Discussions similaires

  1. suppression des lignes qui se répètent
    Par linooo dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/06/2007, 15h49
  2. Traitement des lignes [suppression des lignes vides]
    Par turbo_chess dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2007, 09h16
  3. [Word] Suppression des lignes d'un tableau
    Par sat478 dans le forum VBA Word
    Réponses: 2
    Dernier message: 06/09/2006, 14h22
  4. suppression des ligne ds une table
    Par roger.pouamoun dans le forum Oracle
    Réponses: 6
    Dernier message: 28/07/2006, 12h00

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