Microsoft 365 Suppression d'une ligne d'un tableau avec une macro

Alain 79

XLDnaute Junior
Supporter XLD
Bonjour,
J'ai un fichier excel avec un tableau dont les cellules des deux premières colonnes sont verrouillées et la feuille est protégée pour éviter que les formules soient effacées.
Donc j'ai créé un bouton pour créer une nouvelle ligne.
Dans la 1ére colonne j'ai insérer un objet en forme de croix à l'aide de la mise en forme afin de permettre, en cas de besoin, la suppression de la ligne correspondante par un double click sur la croix.
Seul la 1ére ligne ne doit pas être supprimée, les deux premières colonnes contenant des formules.
Avec ma macro, je peux sans difficulté supprimer la dernière ligne du tableau.
Mais lorsque je veux supprimer une ligne intermédiaire, cela ne fonctionne pas correctement.
Existe-t-il une solution ?
Ci-joint un fichier exemple
 

Pièces jointes

  • Essai.xlsm
    19.7 KB · Affichages: 8
Solution
Bonjour Alain 79,

A la 6ème ligne de la macro remplacez - 2 par - 4 :
VB:
        If .Rows.Count = 1 Then .Cells(1, 3).Resize(, .Columns.Count - 4) = "": Exit Sub
ou si l'on préfère :
VB:
        If .Rows.Count = 1 Then .Cells(1, 3).Resize(, 6) = "": Exit Sub
A+

job75

XLDnaute Barbatruc
Bonjour Alain 79,

J'ai modifié la formule en C4 :
Code:
=N(DECALER(C4;-1;))+1
et la macro :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    With [Tableau1] 'tableau structuré
        If Intersect(Target, .Columns(1)) Is Nothing Then Exit Sub
        Cancel = True
        .Parent.Protect UserInterfaceOnly:=True
        If .Rows.Count = 1 Then .Cells(1, 3).Resize(, .Columns.Count - 2) = "": Exit Sub
        .Rows(Target.Row - .Row + 1).Delete xlUp
    End With
End Sub
La 1ère ligne de Tableau1 peut être supprimée quand le nombre de lignes est supérieur à 1.

S'il n'y a qu'une ligne elle est effacée à partir de la 3ème colonne.

A+
 

Pièces jointes

  • Essai.xlsm
    21.6 KB · Affichages: 8

Valtrase

XLDnaute Occasionnel
Bonjour,
Seul la 1ére ligne ne doit pas être supprimée, les deux premières colonnes contenant des formules.
Utiliser une formule pour incrémenter un compteur, sur des lignes qui peuvent être supprimées c'est le casse-gueule assuré.
Il vaut mieux utiliser la fonction qui incrémente le max de la colonne +1 dont voici un exemple à mettre dans un module :
VB:
'@Description "Récupère la valeur maximale des index incrémenté de 1 en option."
Public Function GetMaxID(ByVal Table As Excel.ListObject, Optional ByVal Column As Variant, Optional ByVal WithIncrement As Boolean) As Long
    If Not Table Is Nothing Then
        If Table.ListRows.Count > 0 Then
            Dim Index As Long
            Index = IndexColumn(Table, Column)
            If Index > 0 Then
                Dim IdMax As Long
                IdMax = Application.WorksheetFunction.Max(Table.ListColumns(Index).DataBodyRange)
                GetMaxID = IdMax + IIf(WithIncrement = True, 1, 0)
            Else
                GetMaxID = Index
            End If
        Else
            GetMaxID = 1
        End If
    Else
        GetMaxID = 0
    End If
End Function
Le code pour le bouton Ajouter une ligne devient :
Code:
Sub NouvelleLigne()
    Dim itemRow As Excel.ListRow
    Set itemRow = Feuil1.ListObjects(1).ListRows.Add
    With itemRow
        .Range(.Parent.ListColumns("Num").Index).Value = Tabs.GetMaxID(Feuil1.ListObjects(1), "Num", True)
        .Range(2).Select
    End With
End Sub
Puisque la feuille comporte un bouton Ajouter une ligne, pourquoi ne pas créer un bouton qui supprime la ligne de la cellule active ?
Code:
Public Sub supprimerLigne()
    With Feuil1.ListObjects(1)
        If .ListRows.Count > 0 Then
            If Not Intersect(.DataBodyRange, ActiveCell) Is Nothing Then
                Dim itemRow As Excel.ListRow
                Set itemRow = .ListRows(ActiveCell.Row - .HeaderRowRange.Row)
                itemRow.Delete
            End If
        Else
            MsgBox "Le tableau ne comporte aucune ligne !"
        End If
    End With
End Sub
 

Alain 79

XLDnaute Junior
Supporter XLD
Bonsoir,
Bien que je ne sois pas compétent pour créer une fonction donc difficile pour moi de bien comprendre le contenu, mais je vais tester malgré tout.
En revanche dans mon tableau j'ai une colonne E ou je saisi un nombre, puis la colonne F contient un taux pour lequel j'utilise la formule =xx% (afin que la formule se reproduise automatiquement lorsque j'ajoute une ligne), et la colonne G fait le calcul avec la formule = E*F. Mon problème, c'est si j'ai un changement de taux, lorsque je saisi le nouveau taux, la totalité de la colonne se modifie alors que je souhaiterai que seules les lignes suivantes utilisent le nouveau taux. Y a-t-il une astuce pour solutionner mon problème.
Par avance, merci
 

Valtrase

XLDnaute Occasionnel
Bonjour,
Mon problème, c'est si j'ai un changement de taux, lorsque je saisi le nouveau taux, la totalité de la colonne se modifie alors que je souhaiterai que seules les lignes suivantes utilisent le nouveau taux. Y a-t-il une astuce pour solutionner mon problème.
Bien sur il est possible de trouver des tournures, pour arriver à ce résultat néanmoins pour ma part je pense qu'il vaut mieux tout gérer par formulaire, et donc exit les formules.
Edit: Il faudrait, (puisque un code simple est demandé) testé en remplaçant les valeurs entrées directement pour le taux par une validation de données.
 
Dernière édition:

Alain 79

XLDnaute Junior
Supporter XLD
Bonjour,

Bien sur il est possible de trouver des tournures, pour arriver à ce résultat néanmoins pour ma part je pense qu'il vaut mieux tout gérer par formulaire, et donc exit les formules.
Edit: Il faudrait, (puisque un code simple est demandé) testé en remplaçant les valeurs entrées directement pour le taux par une validation de données.
Bonjour,
Merci d'avoir répondu.
Le formulaire impose la saisie du taux à chaque fois, ce que j'aurais aimé éviter, surtout que dans mon tableau il y en a plusieurs.
Et la validation des données impose également de sélectionner à chaque ligne le taux ou d'en indiquer un nouveau.
Je continue de chercher pour essayer de trouver une solution tout en évitant une boite de dialogue et macro pour la saisie.
 

piga25

XLDnaute Barbatruc
Bonjour,
Peut être en modifiant le code pour l'ajout d'une nouvelle ligne comme cela:
VB:
Sub NouvelleLigne()
    Sheets("Feuil1").Unprotect
    Sheets("Feuil1").ListObjects("Tableau1").ListRows.Add
    Range("B" & Rows.Count).End(xlUp).Select
    Range("F" & Rows.Count).End(xlUp).Value = Range("F1").Value
    Sheets("Feuil1").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    
End Sub
 

Pièces jointes

  • Essai (4).xlsm
    28 KB · Affichages: 3

Alain 79

XLDnaute Junior
Supporter XLD
Bonjour Alain 79,

J'ai modifié la formule en C4 :
Code:
=N(DECALER(C4;-1;))+1
et la macro :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    With [Tableau1] 'tableau structuré
        If Intersect(Target, .Columns(1)) Is Nothing Then Exit Sub
        Cancel = True
        .Parent.Protect UserInterfaceOnly:=True
        If .Rows.Count = 1 Then .Cells(1, 3).Resize(, .Columns.Count - 2) = "": Exit Sub
        .Rows(Target.Row - .Row + 1).Delete xlUp
    End With
End Sub
La 1ère ligne de Tableau1 peut être supprimée quand le nombre de lignes est supérieur à 1.

S'il n'y a qu'une ligne elle est effacée à partir de la 3ème colonne.

A+
Bonsoir Job75,
En fait mon vrai tableau comporte 10 colonnes, la colonne 1 = la croix, la 2 contient la formule DECALER pour numérotation, et les colonnes 9 et 10 contiennent des formules qui se calculent dès que la colonne 3 contient un élément saisi.
Donc lorsque l'on efface la 1ére ligne, il ne faudrait effacer que le contenu des colonnes 3 à 8.
Mais je ne sais pas comment modifier ta macro qui fonctionne très bien pour effacer uniquement les colonnes 3 à 8.

Par avance et en attendant de voir si une solution est possible, un grand merci
 

job75

XLDnaute Barbatruc
Bonjour Alain 79,

A la 6ème ligne de la macro remplacez - 2 par - 4 :
VB:
        If .Rows.Count = 1 Then .Cells(1, 3).Resize(, .Columns.Count - 4) = "": Exit Sub
ou si l'on préfère :
VB:
        If .Rows.Count = 1 Then .Cells(1, 3).Resize(, 6) = "": Exit Sub
A+
 

Discussions similaires

Réponses
5
Affichages
122

Statistiques des forums

Discussions
313 324
Messages
2 097 166
Membres
106 862
dernier inscrit
KILD974