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
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 :
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
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,
[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
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 !
Re Pedro !
Elles restent à leur place !
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
@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.
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 ^^