Microsoft 365 Code VBA pour insérer/Supprimer ligne dans un Tableau

djkev76

XLDnaute Nouveau
Bonjour à tous,

Etant novice dans le codage VBA, j'ai besoin de vos services : à partir d'un Tableau défini, je souhaiterai pouvoir avoir 3 cas en cliquant sur 4 boutons :
- Insérer un nombre de lignes définis par l'utilisateur (sous forme de MsgBox) sous la ligne n°1 du Tableau, en conservant l'état de la ligne 1 comme modèle de lignes
- Supprimer 1 ou plusieurs lignes prédéfinies par l'utilisateur (sous forme de MsgBox)
- Effacer tout le tableau (RAZ), en supprimant les lignes insérées (sauf ligne n°1 du Tableau), en effaçant les cellules B3 et C3 qui sont des cellules nombre à entrer et en conservant la cellule D3 (car formule automatique)

Merci d'avance pour votre retour.
 

Pièces jointes

  • Classeur1 - Exemple test.xlsx
    17 KB · Affichages: 8

vgendron

XLDnaute Barbatruc
Bonjour et bienvenu

pour un novice, je conseille toujours de commencer par utiliser l'enregistreur de macro, qui bien souvent permet de donner une idée du code mis en jeu par l'action qu'on souhaite faire
ensuite.. il suffit d'adapter et optimiser ce code
ce qui, pour tes 3 boutons donnerait ces 3 macros à associer chacune à un de tes boutons
VB:
Sub InsertLine()
nbLigne = Application.InputBox("Combien de lignes souhaitez vous ajouter?")
With ActiveSheet.ListObjects(1)
    For i = 1 To nbLigne
        .ListRows.Add (1)
    Next i
End With
End Sub
Sub DeleteLine()
nbLigne = Application.InputBox("Combien de lignes souhaitez vous supprimer?")
With ActiveSheet.ListObjects(1)
    For i = 1 To nbLigne
        .ListRows(1).Delete
    Next i
End With
End Sub
Sub ClearLine()
With ActiveSheet.ListObjects(1)
    .DataBodyRange.ClearContents
End With
End Sub
 

djkev76

XLDnaute Nouveau
Merci pour ton code, en revanche je souhaiterais que
- les lignes soient copiés en dessous de la ligne créée et non au-dessus
- Que j'ai le choix de la ou des lignes à supprimer (exemple, je ne veux supprimer que les lignes 3 et 5 de mon tableau sans que le reste ne soit altéré
- Que la ligne "n°1" de mon modèle reste en haut du tableau
 

vgendron

XLDnaute Barbatruc
Insérer un nombre de lignes définis par l'utilisateur (sous forme de MsgBox) sous la ligne n°1 du Tableau, en conservant l'état de la ligne 1 comme modèle de lignes
qu'appelles tu la ligne 1: la ligne d'entete?

Que la ligne "n°1" de mon modèle reste en haut du tableau
c'est ce que fait la macro: elle insère une ligne sous la ligne d'entete



les lignes soient copiés en dessous de la ligne créée et non au-dessus
quelles lignes sont copiées?? il est question juste d'insérer une ligne vide.. pas de copier coller..?

regarde les codes suivants avec les commentaires

VB:
Sub InsertLine()
nbLigne = Application.InputBox("Combien de lignes souhaitez vous ajouter?")
With ActiveSheet.ListObjects(1)
    For i = 1 To nbLigne
        .ListRows.Add
        'si on ne spécifie rien, la ligne sera créée EN BAS: comme dernière ligne
        '.ListRows.Add (1) si tu spécifies 1: la ligne sera créée en première position: Juste en dessous de la ligne d'entete
        '.ListRows.Add (4) si tu spécifies 4: la ligne sera créée en 4eme position
    Next i
End With
End Sub
Sub DeleteONELine()
nbLigne = Application.InputBox("tapez la ligne à supprimer")
With ActiveSheet.ListObjects(1)
    .ListRows(nbLigne).Delete
End With
End Sub
Sub DeleteLines()
nbLigne = Application.InputBox("tapez les lignes en ordre croissant à supprimer séparée d'un -")
LigToSup = Split(nbLigne, "-")

For i = UBound(LigToSup, 1) To LBound(LigToSup, 1) Step -1
    With ActiveSheet.ListObjects(1)
        .ListRows(CDbl(LigToSup(i))).Delete
    End With

Next i
End Sub
Sub ClearLine()
With ActiveSheet.ListObjects(1)
    .DataBodyRange.ClearContents
End With
End Sub
 

djkev76

XLDnaute Nouveau
qu'appelles tu la ligne 1: la ligne d'entete?
C'est la 1ere ligne du tableau où j'ai entré des valeurs et la somme automatique, je souhaite que cette ligne fasse office de référence pour les autres lignes insérées, pour éviter de recopier les formules a chaque création de ligne

c'est ce que fait la macro: elle insère une ligne sous la ligne d'entete
Ca c'est bon



quelles lignes sont copiées?? il est question juste d'insérer une ligne vide.. pas de copier coller..?
Je souhaite garder les fonctions de ma ligne d'en tete
regarde les codes suivants avec les commentaires

VB:
Sub InsertLine()
nbLigne = Application.InputBox("Combien de lignes souhaitez vous ajouter?")
With ActiveSheet.ListObjects(1)
    For i = 1 To nbLigne
        .ListRows.Add
        'si on ne spécifie rien, la ligne sera créée EN BAS: comme dernière ligne
        '.ListRows.Add (1) si tu spécifies 1: la ligne sera créée en première position: Juste en dessous de la ligne d'entete
        '.ListRows.Add (4) si tu spécifies 4: la ligne sera créée en 4eme position
    Next i
End With
End Sub
Sub DeleteONELine()
nbLigne = Application.InputBox("tapez la ligne à supprimer")
With ActiveSheet.ListObjects(1)
    .ListRows(nbLigne).Delete
End With
End Sub
Sub DeleteLines()
nbLigne = Application.InputBox("tapez les lignes en ordre croissant à supprimer séparée d'un -")
LigToSup = Split(nbLigne, "-")

For i = UBound(LigToSup, 1) To LBound(LigToSup, 1) Step -1
    With ActiveSheet.ListObjects(1)
        .ListRows(CDbl(LigToSup(i))).Delete
    End With

Next i
End Sub
Sub ClearLine()
With ActiveSheet.ListObjects(1)
    .DataBodyRange.ClearContents
End With
End Sub
 

djkev76

XLDnaute Nouveau
qu'appelles tu la ligne 1: la ligne d'entete?
C'est la 1ere ligne de mon Tableau

c'est ce que fait la macro: elle insère une ligne sous la ligne d'entete




quelles lignes sont copiées?? il est question juste d'insérer une ligne vide.. pas de copier coller..?
Je souhaite garder les formules de ma ligne d'en-tête

regarde les codes suivants avec les commentaires

VB:
Sub InsertLine()
nbLigne = Application.InputBox("Combien de lignes souhaitez vous ajouter?")
With ActiveSheet.ListObjects(1)
    For i = 1 To nbLigne
        .ListRows.Add
        'si on ne spécifie rien, la ligne sera créée EN BAS: comme dernière ligne
        '.ListRows.Add (1) si tu spécifies 1: la ligne sera créée en première position: Juste en dessous de la ligne d'entete
        '.ListRows.Add (4) si tu spécifies 4: la ligne sera créée en 4eme position
    Next i
End With
End Sub
Sub DeleteONELine()
nbLigne = Application.InputBox("tapez la ligne à supprimer")
With ActiveSheet.ListObjects(1)
    .ListRows(nbLigne).Delete
End With
End Sub
Sub DeleteLines()
nbLigne = Application.InputBox("tapez les lignes en ordre croissant à supprimer séparée d'un -")
LigToSup = Split(nbLigne, "-")

For i = UBound(LigToSup, 1) To LBound(LigToSup, 1) Step -1
    With ActiveSheet.ListObjects(1)
        .ListRows(CDbl(LigToSup(i))).Delete
    End With

Next i
End Sub
Sub ClearLine()
With ActiveSheet.ListObjects(1)
    .DataBodyRange.ClearContents
End With
End Sub
 

Discussions similaires