XL 2013 Insertion automatique d'une ligne dans un tableau

Ananas94

XLDnaute Junior
Bonjour,

J'ai un tableau de bord avec des noms de groupes, qui rassemblent des équipes. Je souhaite créer une macro qui ajoute quelqu'un , dans la bonne ligne, selon le groupe sélectionné.
Ainsi, je souhaite insérer automatiquement une ligne dans un tableau, dans le groupe choisi.
Voici ma macro (je vous joins un fichier teste également).

Sub insertion_ligne()
'Procédure pour insérer une ligne dans le tableau une fois qu'un nom de groupe a été trouvé'

Dim Cellule As Range
cat_groupe = InputBox("A quel groupe souhaitez-vous ajouter un membre ?")

'1-rechercher le nom du groupe dans la colonne Groupe, donc après la cellule B6 (40 est arbitraire)'
With Worksheets("test").ListObjects("Tableau_general")
Set Cellule = .ListColumns("Groupe").Range.Find(Range(cat_groupe), SearchDirection:=xlPrevious)
If Not Cellule Is Nothing Then
'recherche dans tableau de suivi de la dernière ligne correspondant à la catégorie produit et type produit sélectionné
Set cellule1 = Cellule
Do
i = cell.Row - .HeaderRowRange.Row 'numéro de ligne du tableau
'inserer une ligne en-dessous la dernière cellule de la catégorie de groupe concernée'
Set Cellule = .ListColumns("Groupe").Range.FindPrevious(Cellule)
'On intègre le nom du groupe dans la cellule'
Cellule.Value = Groupe
Loop Until cell.Address = cell1.Address 'On continue l'action tant que l'on rencontre une cellule de la catégorie du groupe pour que la cellule soit joutée en-dessous de la dernière'

Range(Cellule).EntireRow.Insert xlShiftDown
i = i + 1
.ListRows.Add i
.ListColumns("Groupe").DataBodyRange.Rows(i) = Range("MDB")


End If
End With

End Sub


Je vous remercie vivement,

Anna
 

Pièces jointes

  • test.xlsm
    19.5 KB · Affichages: 17
Solution
Re

Si le tri alpha existe, c'est qu'il doit y avoir une raison ;)
Donc moi je ne me complique pas la vie (et j'aime pas que la hiérarchie me la complique ;))
Les bordures, ça me rappelle les frontières, et je déteste les frontières.
(Tu me diras avec plus de frontières, moins de pandémie ;))
Quant aux formules, c'est là un des bénéfices des tableaux structurés, les formules sont recopiés à chaque insertion de ligne
(Comme le montrait mon exemple de test)

Ananas94

XLDnaute Junior
Mon code ne fonctionne pas et bloque à la ligne Set Cellule = .ListColumns("Groupe").Range.Find(Range(cat_groupe), SearchDirection:=xlPrevious) et j'obtiens l'erruer "la méthode de l'objet global a échoué". Auriez-vous une idée ? merci

NB: ne pas prendez en compte la phrase ; "donc après la cellule B6 (40 est arbitraire) " c'est une erreur
merci
 

Ananas94

XLDnaute Junior
Merci beaucoup pour le lien, que je viens de lire attentivement. Néanmoins le "battle" m'a plus embrouillée qu'autre chose : pourquoi compte-t-on les cellules du tableau (avec LG = Liste_groupe.DataBodyRange.Rows.Count) ?

Je ne comprenenais pas ce qui n'allait pas dans mon code en fait. Je viens de le modifier mais j'ai l'impression d'ajouter des bouts de code qui ne m'appartiennent pas et pour tout vous dire ça ne fonctionne pas non plus :




Sub insertion_ligne()
'Procédure pour insérer une ligne dans le tableau une fois qu'un nom de groupe a été trouvé'

Dim Cellule As Range
Dim Liste_groupes As ListObject, LG
cat_groupe = InputBox("A quel groupe souhaitez-vous ajouter un membre ?")

'1-rechercher le nom du groupe dans la colonne Groupe'
Set Liste_groupes = ThisWorkbook.Sheets("test").ListObjects("Tableau_general").ListColumns("Groupe").Range
With Liste_groupes
LG = Liste_groupe.DataBodyRange.Rows.Count 'On compte les cellules du tableau"
If Not Cellule Is Nothing Then
'recherche dans tableau de suivi de la dernière ligne correspondant à la catégorie produit et type produit sélectionné
Set cellule1 = Cellule
Do
i = cell.Row - .HeaderRowRange.Row 'numéro de ligne du tableau
'inserer une ligne en-dessous la dernière cellule de la catégorie de groupe concernée'
Set Cellule = .ListColumns("Groupe").Range.FindPrevious(Cellule)
'On intègre le nom du groupe dans la cellule'
Cellule.Value = Groupe
Loop Until cell.Address = cell1.Address 'On continue l'action tant que l'on rencontre une cellule de la catégorie du groupe pour que la cellule soit joutée en-dessous de la dernière'

Range(Cellule).EntireRow.Insert xlShiftDown
i = i + 1
.ListRows.Add i
.ListColumns("Groupe").DataBodyRange.Rows(i) = Range("MDB")


End If
End With

End Sub



J'ai cette fois-ci une incompatibilité de type ...
Je vous joins le fichier modifié, ce sera peut-être plus parlant ...

Je vous remercie par avance et reste à votre écoute,
Excellente journée

Anna
 

Pièces jointes

  • test.xlsm
    23.5 KB · Affichages: 1

Staple1600

XLDnaute Barbatruc
Re

Moi, j'en étais là de mes tests
Qu'en penses-tu?
VB:
Sub insert_B()
Dim LO As ListObject
Set LO = Worksheets("test").ListObjects("Tableau_general")
cat_groupe = InputBox("A quel groupe souhaitez-vous ajouter un membre ?")
LO.ListRows.Add.Range = Array(cat_groupe, "", "", "", "")
LO.Sort.Apply
End Sub
 

Ananas94

XLDnaute Junior
Bonjour !
Merci beaucoup pour votre réponse ! C'est presque cela, sauf que je souhaite que la ligne s'ajoute SOUS la dernière case comportant la même catégorie de groupe. Exemple : Je tape comme nom de groupe "MDB". Je souhaite alors que la ligne ajoutée s'insère sous le dernier membre du groupe "MDB" (et non tout à la fin du tableau).
C'est pour cette raison que j'avais ajouté dans mon code précédent une fonction de "recherche" grâce à la fonction Find : il faut que l'ordinateur recherche d'abord quelles sont les cellules qui concernent déjà le groupe en question.

Je propose donc :

Sub insert_B()
Dim LO As ListObject
Dim cellAjout As Range

Set LO = Worksheets("test").ListObjects("Tableau_general")
cat_groupe = InputBox("A quel groupe souhaitez-vous ajouter un membre ?")
cellAjout = LO.ListRows.Find(cat_groupe)
LO.ListRows.Add.Range(cellAjout) = Array(cat_groupe, "", "", "", "")
LO.Sort.Apply
End Sub

Sauf que j'obtiens l'erreur "Propriété ou méthode non gérée par cet objet" en sélectionnant la ligne : "cellAjout = LO.ListRows.Find(cat_groupe)"
Je ne comprends pas où est l'erreur , auriez-vous une idée ?
Merci

Anna
 

Staple1600

XLDnaute Barbatruc
Re

J'ai modifié le code pour le tri
VB:
Sub insert_C()
Dim LO As ListObject
Set LO = Worksheets("test").ListObjects("Tableau_general")
cat_groupe = InputBox("A quel groupe souhaitez-vous ajouter un membre ?", "Test", "GROUPE3")
LO.ListRows.Add(AlwaysInsert:=True).Range(1, 1) = cat_groupe
LO.DataBodyRange.Sort Key1:=Range("Tableau_general[GROUPE]"), Order1:=xlAscending
End Sub
NB: Fais le test sur un classeur vierge (où il y aura une feuille nommée: test), lance cette macro pour créer le tableau.
Puis pour tester, lance la macro: insert_C
VB:
Sub CréerTableau()
[A1:E1] = [{"GROUPE","ITEM2","ITEM3","ITEM4","ITEM5"}]
Range("B2:E10").FormulaR1C1 = "=ADDRESS(ROW(),COLUMN(),4)"
[A2:A4] = "GROUPE1": [A5:A7] = "GROUPE3": [A8:A10] = "GROUPE7"
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$E$10"), , xlYes).Name = "Tableau_general"
ActiveSheet.ListObjects("Tableau_general").DataBodyRange.Rows(6).Font.Color = vbRed
End Sub
Cela fonctionne, non?
 

Ananas94

XLDnaute Junior
Bonjour Staple 1600,

Je vous remercie vivement pour votre réponse. Je viens de tester et une erreur concernant la ligne : LO.DataBodyRange.Sort Key1:=Range("Tableau_general[GROUPE]"), Order1:=xlAscending est :"La méthode Range de l'objet Global a échoué"..

Par ailleurs, on m'a demandé tout à l'heure d'effectuer cette insertion de ligne via un formulaire. Mais cela ne change pas grand chose en fait. Je viens de le créer. J'insère votre code au moment de l'insertion de la ligne (que j'ai un peu modifié).
Je pense qu'il y a des erreurs car lorsque je teste, j'obtiens le message suivant : "Objet spécifié introuvable". On me désigne la ligne userform.show , je ne comprends pourtant pas où est le problème ...

Serait-il possible pour vous de regarder ce que que j'ai codé ?
Je vous remercie vivement,
Anna
 

Pièces jointes

  • test.xlsm
    29.9 KB · Affichages: 4

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 499
Messages
2 110 249
Membres
110 711
dernier inscrit
chmessi