Création de lignes dans un tableau structuré

Bonjour,

Je ne suis pas expert en VBA (j'en suis très loin) mais j'ai tenté de créer un petit code car je voudrais pouvoir créer à la suite de mon action N°1 (et après toute nouvelle action) 3 lignes portants le même numéro (dans mon exemple il y aura donc le chiffre 2 en B10, B11, et B12), puis mettre "Détail" dans la cellule de droite de la 2ème nouvelle ligne crée (dans mon exemple c'est en C11), puis mettre "Réponse" dans la cellule de droite de la 3ème nouvelle ligne crée (ici C12).

Mon code fonctionne mais j'ai 2 problèmes et une question complémentaire :

Mes problèmes sont que mon code ne doit pas être très joli voire bancale (même si il marche), et la première ligne qui se crée à la suite de mon tableau structuré génère une ligne de total au lieu de continuer le tableau ? comment faire pour que ça continue naturellement le tableau ?

Ma question complémentaire c'est comment grouper automatiquement par code vba les 2ème et 3ème lignes nouvellement crées ? (ici il faudrait que les lignes 11 et 12 soient groupées, comme c'est le cas pour les lignes 8 et 9).

Merci d'avance pour votre aide.

12planning-essai.xlsm (23.56 Ko)

Bonjour

Dans votre fichier pourquoi laissez-vous C7 vide ?

En B10, vous devez trouver quoi comme valeur ? En fait à quoi vous sert la ligne des totaux ?

C'est ceci que vous voulez ?

image

Bonjour Dan,

Je laisse C7 vide car je viens y mettre via une liste déroulante la priorité de l'action.

En B10 il me faut bien la valeur 2. Le problème c'est que si je me remets à l'état initial (c'est à dire si j'efface les lignes 10, 11 et 12) et que j'exécute la macro, alors ça me met bien 2 en B10, mais au lieu que ce soit une ligne standard du tableau, cette ligne est une ligne de total dont je n'ai pas besoin. Ensuite j'ai bien la génération du chiffre 2 en B11 et B12 (c'est ce que je veux) mais c'est hors du tableau...

Si vous mettez une liste déroulante en C7, elle risque d'être reprise automatiquement dans les cellules suivantes. A surveiller..

cette ligne est une ligne de total dont je n'ai pas besoin.

Avec le tableau structuré c'est normal que vous ayez cette ligne Total.

Pour moi vous n'avez pas besoin de ce chiffre. ce qui compte c'est que le chiffre 2 soit bien mentionné en B10, B11 et B12. Juste ?
Ce qu'il vous faut c'est ceci non ?

image

Oui, c'est exactement ça qu'il me faut.

Re,

1. en premier, cliquez dans une cellule du tableau puis désactivez "ligne total" dans le menu "Création tableau"

2. ensuite remplacez votre code par celui-ci :

Private Sub CommandButton1_Click()
Dim TS As ListObject
Dim num As Integer
Dim i As Byte

Set TS = Range("Tableau1").ListObject
num = (TS.ListRows.Count / 3) + 1

For i = 1 To 3
    With TS
        If .ListRows.Count = 0 Then
            .ListRows.Add: lig = 1
        Else: .ListRows.Add: lig = .ListRows.Count

        End If
        .DataBodyRange.Item(lig, 1) = num
        Select Case i
            Case Is = 2: .DataBodyRange.Item(lig, 2) = "Détail"
            Case Is = 3: .DataBodyRange.Item(lig, 2) = "Réponse"
        End Select
    End With
Next i
End Sub

Cordialement

Impeccable, ça fonctionne parfaitement. Merci.

Y'a t'il moyen que ça groupe automatiquement pour chaque nouvelle action les 2 lignes "Détail" et "Réponse" ? C'est à dire dans l'exemple ci dessous grouper les lignes 11et 12 puis 14 et 15 (comme pour 8 et 9) ?

capture d ecran 2025 09 25 163514

Bonjour nickal et salut @dan
Remplacer votre code par celui-ci. Voir Fichier joint

Private Sub CommandButton1_Click()
Dim n As Integer
 With Range("Tableau1").ListObject
    .ListRows.Add
    n = .ListRows.Count
    With .DataBodyRange
        .Item(n, 1) = .Item(n - 1, 1) + 1
        .Item(n + 1, 1) = .Item(n, 1)
        .Item(n + 1, 2) = "Détail"
        .Item(n + 2, 1) = .Item(n, 1)
        .Item(n + 2, 2) = "Réponse"
    End With
 End With
End Sub

Cdt,
Papy Henri

Oups!! Dan est trop rapide

Bonjour à tous,

Vous pouvez ajouter l'instruction du groupage de lignes à la fin du code de @Dan :

Private Sub CommandButton1_Click()
Dim TS As ListObject
Dim num As Integer
Dim i As Byte

Set TS = Range("Tableau1").ListObject
num = (TS.ListRows.Count / 3) + 1

For i = 1 To 3
    With TS
        If .ListRows.Count = 0 Then
            .ListRows.Add: lig = 1
        Else: .ListRows.Add: lig = .ListRows.Count

        End If
        .DataBodyRange.Item(lig, 1) = num
        Select Case i
            Case Is = 2: .DataBodyRange.Item(lig, 2) = "Détail"
            Case Is = 3: .DataBodyRange.Item(lig, 2) = "Réponse"
        End Select
    End With
Next i

' groupement ici
TS.ListRows(TS.ListRows.Count).DataBodyRange.EntireRow.Offset(-2).Resize(3).Group
End Sub

EDIT : mais il me semble que les groupes successifs vont se combiner... en théorie il faut une ligne vide entre chaque groupe je crois... Je ne me rappelle plus trop.

Re

Je ne comprends pas ce que vous voulez dire par regrouper les lignes.
Au besoin postez une vue de ce que vous voulez

edit : Voyez la proposition de Saboh12617 qui vous a répondu pendant que j'écrivais ma réponse

re

Je ne comprends pas ce que vous voulez dire par regrouper les lignes.

Désolé je viens de comprendre pour le regroupement
J'ai simplifié le code et ajouté la ligne pour grouper

Private Sub CommandButton1_Click()
Dim TS As ListObject
Dim num As Integer
Dim i As Byte

Set TS = Range("Tableau1").ListObject
num = (TS.ListRows.Count / 3) + 1

For i = 1 To 3
    With TS
        .ListRows.Add: lig = .ListRows.Count
        With .DataBodyRange
            .Item(lig, 1) = num
            Select Case i
                Case Is = 2: .Item(lig, 2) = "Détail"
                Case Is = 3: .Item(lig, 2) = "Réponse"
            End Select
        End With
    End With
Next i

TS.ListRows(TS.ListRows.Count - 1).Range.Resize(2).Rows.Group
End Sub

La ligne placée par Saboh12617 buguait chez moi

Crdlt

Merci à tous les 2, cela fonctionne parfaitement.

Bonne soirée.

Rechercher des sujets similaires à "creation lignes tableau structure"