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

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

  • CALCUL DES POINTS - DEFI MOBILITE - TEST2.xlsm
    266.7 KB · Affichages: 20

Cousinhub

XLDnaute Barbatruc
Inactif
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
 

patricktoulon

XLDnaute Barbatruc
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
 

Cousinhub

XLDnaute Barbatruc
Inactif
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
 

patricktoulon

XLDnaute Barbatruc
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
 

patricktoulon

XLDnaute Barbatruc
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

  • CALCUL DES POINTS - DEFI MOBILITE - TEST2.xlsm
    282.8 KB · Affichages: 4

halecs93

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

halecs93

XLDnaute Impliqué
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.
 

halecs93

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

TooFatBoy

XLDnaute Barbatruc
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 ?
 

halecs93

XLDnaute Impliqué
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....
 

Discussions similaires

Statistiques des forums

Discussions
314 732
Messages
2 112 284
Membres
111 497
dernier inscrit
cerber08