XL 2016 Supprimer ligne d'un tableau structuré en vba

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

halecs93

XLDnaute Impliqué
Bonjour à toutes et à tous.

Et d'abord merci pour toute l'aide rencontrée ici.

J'ai pu presque finaliser mon fichier. Je n'arrive pas à ajouter une dernière fonction : une macro qui permettrait à l'utilisateur de supprimer une ligne (en utilisant les numéros qui s'incrémentent de 1 en 1 en colonne A) tout en renumérotant ces lignes pour que cela reste logique (1, 2, 3, etc.)

Quoi qu'il en soit... grand merci.
 

Pièces jointes

Bonjour,
Dans la conception du TS.
Inutile de masquer la ligne 3 (contre-productif)
Démasque-là, et dans la cellule A3, tu mets cette formule :
Code:
=LIGNE()-2
Puis, clic droit dans cette ligne, "Supprimer-Ligne de tableau"
Dès que tu entres une donnée (dans la cellule Date, par exemple), la formule se met automatiquement...
Donc, rien à "Ajouter/Supprimer", le TS garde en mémoire la formule
Bonne fin d'apm
 
bonjour
met ça dans un module
VB:
Sub deleteListrow()
    Dim I&
    ActiveSheet.Unprotect
    DoEvents
    With Range("Tableau1").ListObject


        .ListRows(ActiveCell.Row - .Range.Row).Delete
        For I = 1 To .ListRows.Count
            .ListRows(I).Range.Cells(I, 1) = I
        Next
        ActiveSheet.Protect
    End With
End Sub
ajoute lui un bouton dans ta feuille et affecte lui la macro
tu selection une cellule n'importe ou dans le tableau et tu clique sur ton nouveau bouton
terminé ta ligne est supprimée et ta numerotation est révisée
 
bonjour
met ça dans un module
VB:
Sub deleteListrow()
    Dim I&
    ActiveSheet.Unprotect
    DoEvents
    With Range("Tableau1").ListObject


        .ListRows(ActiveCell.Row - .Range.Row).Delete
        For I = 1 To .ListRows.Count
            .ListRows(I).Range.Cells(I, 1) = I
        Next
        ActiveSheet.Protect
    End With
End Sub
ajoute lui un bouton dans ta feuille et affecte lui la macro
tu selection une cellule n'importe ou dans le tableau et tu clique sur ton nouveau bouton
terminé ta ligne est supprimée et ta numerotation est révisée
Bonsoir,
Je pense que tu n'as pas essayé ta proposition....
Edit, je n'avais pas non plus regardé son code...
Lorsqu'on veut utiliser des TS, on utilise les codes qui vont bien...
@halecs93 , déjà, pour ma proposition, supprime la 1ère ligne de code :

VB:
ws.Cells(nextRow, 1).Value = rowNum ' Colonne A (Numéro de ligne)

Et surtout, revoies tout le code, afin d'utiliser les bonnes procédures lorsqu'on utilise les TS
 
re
si j'avais essayé mais pas dans les bonnes conditions
petite correction
VB:
Sub deleteListrow()
    Dim I&
    ActiveSheet.Unprotect
    DoEvents
    With Range("Tableau1").ListObject


        .ListRows(ActiveCell.Row - .Range.Row).Delete
       [A1].Select
       For I = 1 To .ListRows.Count - 1
            .ListRows(I).Range.Cells(1) = I
        Next
        'ActiveSheet.Protect
    End With
End Sub

par contre effectivement la numérotation ne se fait pas
par contre si je sépare le code delete et le code renumérotation dans deux subs différentes
là oui la numérotation se fait
peut être un delay pas suffisant par rapport a l’occupation du procc
 
allez cette fois ci c'est la bonne
il y avait 1 soucis son TS n'avait pas de header alors que je me basais sur le listrows 2
donc transformé en un TS avec header
et pour le delay je ne passe plus par le listobject mais par le range

démonstration
le bouton supprime la ligne active
et de plus je supprime la shapes aussi qui restait
demo.gif

VB:
Sub deleteListrow()
    Dim I&
    ActiveSheet.Unprotect
    'suppression de la shape
    For Each shap In ActiveSheet.Shapes
        If shap.TopLeftCell.Row = ActiveCell.Row Then shap.Delete
    Next

    'suppression de la ligne
    With Range("Tableau1").ListObject
        .ListRows(ActiveCell.Row - .Range.Row).Delete
    End With
    DoEvents

    'réindexation dans la colonne "A"
    With Range("Tableau1")
        For I = 1 To .Rows.Count
            .Cells(I, 1) = I
        Next
    End With
    'ActiveSheet.Protect
End Sub
 

Pièces jointes

allez cette fois ci c'est la bonne
il y avait 1 soucis son TS n'avait pas de header alors que je me basais sur le listrows 2
donc transformé en un TS avec header
et pour le delay je ne passe plus par le listobject mais par le range

démonstration
le bouton supprime la ligne active
et de plus je supprime la shapes aussi qui restait
Regarde la pièce jointe 1178170
VB:
Sub deleteListrow()
    Dim I&
    ActiveSheet.Unprotect
    'suppression de la shape
    For Each shap In ActiveSheet.Shapes
        If shap.TopLeftCell.Row = ActiveCell.Row Then shap.Delete
    Next

    'suppression de la ligne
    With Range("Tableau1").ListObject
        .ListRows(ActiveCell.Row - .Range.Row).Delete
    End With
    DoEvents

    'réindexation dans la colonne "A"
    With Range("Tableau1")
        For I = 1 To .Rows.Count
            .Cells(I, 1) = I
        Next
    End With
    'ActiveSheet.Protect
End Sub
Piste intéressante.... mais cela efface la dernière ligne.... or je cherchais moyen de demander à l'utilisateur d'effacer la ligne de son choix. (je m'aperçois que le total des points en B4.... n'apparait plus...). Merci beaucoup
 
Bonsoir,
Je pense que tu n'as pas essayé ta proposition....
Edit, je n'avais pas non plus regardé son code...
Lorsqu'on veut utiliser des TS, on utilise les codes qui vont bien...
@halecs93 , déjà, pour ma proposition, supprime la 1ère ligne de code :

VB:
ws.Cells(nextRow, 1).Value = rowNum ' Colonne A (Numéro de ligne)

Et surtout, revoies tout le code, afin d'utiliser les bonnes procédures lorsqu'on utilise les TS
Merci... j'avoue avoir construit ces codes petit à petit...ils sont sans doute perfectibles.
 
Bonjour,
Dans la conception du TS.
Inutile de masquer la ligne 3 (contre-productif)
Démasque-là, et dans la cellule A3, tu mets cette formule :
Code:
=LIGNE()-2
Puis, clic droit dans cette ligne, "Supprimer-Ligne de tableau"
Dès que tu entres une donnée (dans la cellule Date, par exemple), la formule se met automatiquement...
Donc, rien à "Ajouter/Supprimer", le TS garde en mémoire la formule
Bonne fin d'apm
Merci pour ce conseil
 
Bonjour,

Si l'index doit changer de valeur suite à la suppression d'une ligne, ça veut dire qu'il n'a pas grand intérêt...
Donc on doit pouvoir, soit supprimer la première colonne du TS, soit mettre une formule pour numéroter les lignes du TS.

N'est-il point ?
 
Bonsoir,
Je pense que tu n'as pas essayé ta proposition....
Edit, je n'avais pas non plus regardé son code...
Lorsqu'on veut utiliser des TS, on utilise les codes qui vont bien...
@halecs93 , déjà, pour ma proposition, supprime la 1ère ligne de code :

VB:
ws.Cells(nextRow, 1).Value = rowNum ' Colonne A (Numéro de ligne)

Et surtout, revoies tout le code, afin d'utiliser les bonnes procédures lorsqu'on utilise les TS
Là, j'avoue ne pas tout comprendre....
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
156
Retour