Supprimer lignes tableau Excel

Bonjour,

Je souhaiterais pouvoir supprimer une ligne du tableau ( en la sélectionnant) via un bouton "supprimer" en n'impactant pas les lignes sous le tableau qui ne font pas partie du tableau (comme pour l'ajout) et en ne supprimant que la ligne du tableau et pas de la feuille entière.

Je pense que c'est faisable mais je ne trouve pas la solution exacte.

Pourriez-vous m'aider?

Merci

8classeur1.xlsm (18.38 Ko)

Bonjour,

Avant de partir sur une proposition, ma question est : pourquoi as-tu besoin de faire ça ? Un fichier bien conçu comporte un tableau par onglet, ce qui rend inutile ta demande (et évite les boulettes !).

Autre remarque, tes données sont sous forme de tableau structuré, donc en sélectionnant une ligne --> clique droit --> Supprimer --> Lignes de tableau, cela n'impact pas les autres colonnes de ta feuille.

Bonjour Pedro22,

En fait, c'est une demande de mon équipe. Les tableaux doivent être sur le même onglet d’où ma demande du coup.

Je me permet d'insister sur l'importance de bien concevoir un fichier pour éviter de s'embarquer dans des fonctionnalités farfelues et hasardeuses. Éventuellement, tu peux ajouter un onglet d'affichage qui te permet de centraliser plusieurs tableaux (via des fonctions RECHERCHE() et/ou INDEX() permettant de voir sur un même onglet certaines données stockées sur d'autres).

Si ça ne convient pas, je peux te proposer une macro permettant l'ajout la suppression de ligne d'un tableau sans modifier la position d'autres éléments de la page. Avec les limites que ça implique...

^^ merci mais malheureusement je ne peux pas revenir en arrière concernant ce fichier mais il y aura surement des améliorations plus tard mais pour le moment je ne peux faire qu'avec une macro.

^^ merci mais malheureusement je ne peux pas revenir en arrière concernant ce fichier mais il y aura surement des améliorations plus tard mais pour le moment je ne peux faire qu'avec une macro.

Il y a risque de créer un déséquilibre cosmique majeur ?

Même dans le cas où le fichier actuel est issu d'un travail fastidieux, il sera toujours rentable de corriger le tir dès que possible concernant la conception plutôt que de persister dans une organisation douteuse. Bref, c'était mon dernier mot sur le sujet, je planche sur une macro à partir de ton fichier initial...

^^ c'est que j'ai une deadline et comme je suis encore assez débutante, c'est assez difficile de faire les choses correctement mais bon ça viendra !

merci encore!!

Voilà ton fichier en retour :

9nossila.xlsm (20.23 Ko)

Les macros :

Sub SupprTbl()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
On Error GoTo Fin

Dim LigHaut As Long, LigBas As Long, ColGauche As Integer, ColDroite As Integer, Ltbl As Long, DerLig As Long, DataBdy As Range

With Selection
    Set DataBdy = .ListObject.DataBodyRange 'Identifie la plage de données du tableau
    LigHaut = DataBdy(1, 1).Row - 1 'Identifie la ligne d'en-tête du tableau
    LigBas = LigHaut + DataBdy.Rows.Count 'Identifie la dernière ligne du tableau
    ColGauche = DataBdy(1, 1).Column 'Identifie la première colonne du tableau
    ColDroite = ColGauche + DataBdy.Columns.Count 'Identifie la dernière colonne
    Ltbl = .Row - LigHaut 'Identifie la ligne relative au tableau de la selection
    .ListObject.ListRows(Ltbl).Delete 'Supprime la ligne sélectionnée
    Range(Cells(LigBas, ColGauche), Cells(LigBas, ColDroite)).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'Décale les données après le tableau
End With
Fin:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub
Sub AjoutTbl()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
On Error GoTo Fin

Dim LigHaut As Long, LigBas As Long, ColGauche As Integer, ColDroite As Integer, Ltbl As Long, DerLig As Long, DataBdy As Range

With Selection
    Set DataBdy = .ListObject.DataBodyRange 'Identifie la plage de données du tableau
    LigHaut = DataBdy(1, 1).Row - 1 'Identifie la ligne d'en-tête du tableau
    LigBas = LigHaut + DataBdy.Rows.Count 'Identifie la dernière ligne du tableau
    ColGauche = DataBdy(1, 1).Column 'Identifie la première colonne du tableau
    ColDroite = ColGauche + DataBdy.Columns.Count 'Identifie la dernière colonne
    Ltbl = .Row - LigHaut 'Identifie la ligne relative au tableau de la selection
    .ListObject.ListRows.Add 'Ajoute au dessus la ligne sélectionnée
    Range(Cells(LigBas + 2, ColGauche), Cells(LigBas + 2, ColDroite)).Delete Shift:=xlUp 'Décale les données après le tableau
End With
Fin:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

Il te suffit de te placer dans n'importe quelle cellule d'un tableau et de cliquer sur l'un des boutons pour ajouter une ligne ou supprimer cette ligne

Bonjour, Salut Pedro !

Je dirai d'abord que les remarques de Pedro sont particulièrement judicieuses , si l'on veut travailler dans une situation simple et fiable, c'est toujours au niveau de la conception que cela se joue, et il y a toujours intérêt à respecter au départ un certain nombre de règles dont on sait qu'elles faciliteront l'utilisation ultérieure...

Ceci dit, on peut faire sans trop de risques :

Sub AjoutLigne(lobj As String)
    Dim LO As ListObject
    Set LO = ActiveSheet.ListObjects(lobj)
    LO.ListRows.Add , True
End Sub

Sub SuppriLigne(lobj As String)
    Dim LO As ListObject, n%
    Set LO = ActiveSheet.ListObjects(lobj)
    n = ActiveCell.Row - LO.ListRows(1).Range.Row + 1
    If n <= LO.ListRows.Count Then LO.ListRows(n).Delete
End Sub

Sub AjoutLigne1()
    AjoutLigne "Tableau1"
End Sub

Sub AjoutLigne2()
    AjoutLigne "Tableau2"
End Sub

Sub SuppriLigne1()
    SuppriLigne "Tableau1"
End Sub

Sub SuppriLigne2()
    SuppriLigne "Tableau2"
End Sub

Deux proc., Ajout et Suppression (toujours bon d'éviter de répéter du code quand on peut l'éviter, et c'est quasiment toujours le cas), lancées par les procédures affectées aux divers boutons.

[NB- On aurait pu éviter ces procédures et opérer la reconnaissance par les procédures d'ajout et suppression du bouton appelant, et donc du tableau visé... mais je fais un peu la grève sur ce point car les demandeurs ne renomment jamais les boutons de formulaires ou objets Shapes qu'ils utilisent pour actionner des macros, et il serait temps qu'ils se mettent en mesure de procéder à cette opération tout à fait basique qui peut leur simplifier la vie ! ]

Un risque subsiste tout de même d'éliminer une ligne que l'on ne voudrait pas en procédant par sélection !

La procédure prend en considération la ligne de la cellule active, où qu'elle puisse se trouver dans la feuille, et la convertit en index de ligne de données du tableau visé. Si cette ligne est au-delà du tableau, elle ne fera rien, mais si l'index correspond à une ligne de données du tableau, cette ligne sera supprimée !

Il sera donc peut-être utile de rajouter une MsgBox de confirmation de la suppression par l'utilisateur si l'on doit éviter de fausses manoeuvres !

Cordialement.

Salut MFerrand,

Joli travail une fois de plus ! Mais je crois que tu omets de t'occuper des données placées sous le tableau et n'en faisant pas partie. La consigne étant que ces données restent à leur place.

Re Pedro !

Elles restent à leur place ! Nous on s'occupe du tableau Excel, qui lui s'occupe de laisser ces données à leur place (parce qu'on le lui a dit...)

C'est le rôle du True...

Cordialement.

re,

J'ai testé les deux solutions.

Effectivement, je suis d'accord avec vous 2 en ce qui concerne la création d'un fichier propre dès le début mais comme je n'ai jamais eu de formation avancée en excel, je pense qu'il me manque vraiment la vision de l'outil dans sa globalité et donc je fais des choses en pensant que c'est bien mais en fait pas forcement ... ^^ Je bidouille clairement!

Merci pour votre aide.

La solution de Pedro ne prend pas en compte les informations sous les tableaux contrairement à la solution de Mferrand.

Quoi qu'il en soit, les 2 solutions fonctionnent mais celle de Mferrand répond davantage à ma demande.

Re Pedro !

Elles restent à leur place ! Nous on s'occupe du tableau Excel, qui lui s'occupe de laisser ces données à leur place (parce qu'on le lui a dit...)

C'est le rôle du True...

Cordialement.

@MFerrand --> me voilà un peu moins bête, qui sait, un jour je ne serais peut-être plus bête du tout !

@Nossila : je ne comprends pas bien quand tu dis que ma solution ne prend pas en compte les données sous le tableau ? Justement, je me suis creusé la tête pour qu'elles restent à leur place. Ce n'est pas le cas sur ton fichier ???

Bonjour,

Suppression ligne pour le fun !...

On doit être rigoureux avec l'utilisation des tableaux.

Cdlt.

3nossilla-v2.xlsm (24.63 Ko)
Sub DeleteRowInTable()
Dim lo As ListObject
Dim lCol As Long, lRow As Long, lRows As Long
Dim rCell As Range
Dim lr As ListRow
    If ActiveCell.ListObject Is Nothing Then Exit Sub
    Set lo = ActiveCell.ListObject
    lCol = lo.ListColumns.Count
    lRow = ActiveCell.Row
    lRows = lo.ListRows.Count
    Set rCell = ActiveSheet.Cells(lRows + lo.HeaderRowRange.Cells(1).Row + 1, lo.HeaderRowRange.Cells(1).Column)
    rCell.Resize(, lCol).Insert Shift:=xlDown
    Set lr = lo.ListRows(lRow - lo.HeaderRowRange.Cells(1).Row)
    lr.Range.Delete
End Sub

Re à tous,

J'ai tiré profit de la remarque de Jean-Eric, pour noter que je n'avais pas complètement verrouillé la suppression... j'ai donc ajouté 2 conditions à la procédure :

Sub SuppriLigne(lobj As String)
    Dim LO As ListObject, n%
    Set LO = ActiveSheet.ListObjects(lobj)
    If LO.ListRows.Count = 1 Then Exit Sub
    n = ActiveCell.Row - LO.ListRows(1).Range.Row + 1
    If n <= LO.ListRows.Count And n < 1 Then LO.ListRows(n).Delete
End Sub

pour d'une part ne pas intervenir s'il ne restait qu'une ligne de données, d'autre part ne rien faire non plus lorsque la cellule active se trouve au-dessus de la première ligne de données du tableau.

Cordialement.

Re Pedro !

Elles restent à leur place ! Nous on s'occupe du tableau Excel, qui lui s'occupe de laisser ces données à leur place (parce qu'on le lui a dit...)

C'est le rôle du True...

Cordialement.

@MFerrand --> me voilà un peu moins bête, qui sait, un jour je ne serais peut-être plus bête du tout !

@Nossila : je ne comprends pas bien quand tu dis que ma solution ne prend pas en compte les données sous le tableau ? Justement, je me suis creusé la tête pour qu'elles restent à leur place. Ce n'est pas le cas sur ton fichier ???

Bonjour Pedro,

En fait, quand j'ajoute des lignes, les données du dessous "ne suivent pas" et sont donc écrasées par les nouvelles lignes ajoutées.

Ok, j'ai du mal comprendre la consigne. En fait, depuis le départ, tu n'as pas besoin de macro puisque ce que tu souhaites faire est directement faisable sous Excel en 2 cliques, tel qu'indiqué dans mon premier post ?

Bonjour, Salut à tous !

En fait, quand j'ajoute des lignes, les données du dessous "ne suivent pas" et sont donc écrasées par les nouvelles lignes ajoutées.

Pas avec le code d'ajout que j'ai fourni pour les boutons Ajout. Un clic et une ligne s'ajoute en laissant tout le reste en place.

Cordialement.

Ok, j'ai du mal comprendre la consigne. En fait, depuis le départ, tu n'as pas besoin de macro puisque ce que tu souhaites faire est directement faisable sous Excel en 2 cliques, tel qu'indiqué dans mon premier post ?

Oui je suis d'accord avec toi mais le fichier doit être extrêmement intuitif pour les futurs utilisateurs qui n'ont aucune base (vraiment aucune) d'excel et donc avec des boutons ajout et supprimer c'est plus simple ^^

Merci encore !

Rechercher des sujets similaires à "supprimer lignes tableau"