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


Sujet :

Macros et VBA Excel

  1. #1
    Community Manager

    [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
    Expert éminent sénior
    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
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  3. #3
    Community Manager

    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 :



    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
    Expert éminent sénior
    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
    Eric KERGRESSE
    https://sites.google.com/site/erickergresseeirl/
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter

  5. #5
    Membre chevronné
    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

  6. #6
    Community Manager

    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

    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.





    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 remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    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

    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é
    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

    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



    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




    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 remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    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...
    ---------------

###raw>template_hook.ano_emploi###