Microsoft 365 Cherche aide VBA pour intégration lignes tableaux automatique

MagaliCLC

XLDnaute Nouveau
Bonjour,

Nouveau jour, nouvelle question :)

J'ai un tableau dont les données varient et pour lequel une macro permet le tri selon la colonne C.
J'aimerais que la ligne d'en-tête du tableau soit intégrée en nouvelle(s) ligne(s) dès lors que la valeur en colonne C est nouvelle.

Je vous joins l'explication en PJ.

Un grand merci à celui/celle qui m'aidera !

Magali
 

Pièces jointes

  • Classeur1.xlsx
    9.9 KB · Affichages: 4
Solution
Bonjour Magali, bonjour le forum,

Il faut prendre l'habitude d'envoyer soit le fichier original soit un fichier test qui reprend exactement la même structure que l'original. Dans le test le tableau commence à la ligne 1 dans l'original à la ligne 4. Il est évident qu'il faut supprimer les trois premières lignes pour que ça fonctionne avec le premier code, ou bien, adapter en décalant le code de 3 lignes.
Le code adapté :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim ET As Range 'déclare la variable ET (En-Tête)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

Set O =...

Robert

XLDnaute Barbatruc
Repose en paix
Re,

En effet c'est beaucoup mieux !... Essaie comme ça :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim ET As Range 'déclare la variable ET (En-Tête)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O
Set PL = O.Range("A1").CurrentRegion 'définit la plage PL
DL = PL.Rows.Count 'définit la dernière ligne DL de la plage PL
Set ET = PL.Rows(1) 'définit la plage ET
PL.Sort key1:=O.Range("C1"), Header:=xlYes 'tri la plage PL en fonction du Lot
For I = DL To 3 Step -1 'boucle inversée des lignes DL à 3
    'condition : si la cellule au-dessus est différente que la cellule de la boucle
    If O.Cells(I - 1, "C").Value <> O.Cells(I, "C").Value Then
        O.Rows(I).Insert 'insère une ligne en position I
        ET.Copy Rows(I) 'copy l'en tête dans la ligne I
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle inversée
End Sub
 

MagaliCLC

XLDnaute Nouveau
Merci beaucoup Robert !
Ca fonctionne parfaitement sur mon fichier de test mais pas sur mon tableau de travail, malgré mes essais pour adapter le code.

Dans mon fichier de travail, je bosse sur un tableau sur la plage A4:M304.
La variable PL est placée en case C4.
A noter que certaines lignes et colonnes de mon tableau seront potentiellement vides.
Ci-joint le fichier complet.

Merci encore
 

Pièces jointes

  • Classeur1.xlsx
    19.3 KB · Affichages: 6

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Magali, bonjour le forum,

Il faut prendre l'habitude d'envoyer soit le fichier original soit un fichier test qui reprend exactement la même structure que l'original. Dans le test le tableau commence à la ligne 1 dans l'original à la ligne 4. Il est évident qu'il faut supprimer les trois premières lignes pour que ça fonctionne avec le premier code, ou bien, adapter en décalant le code de 3 lignes.
Le code adapté :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim ET As Range 'déclare la variable ET (En-Tête)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O
Set PL = O.Range("A4").CurrentRegion 'définit la plage PL
DL = PL.Rows.Count + 3 'définit la dernière ligne DL de la plage PL
Set ET = PL.Rows(1) 'définit la plage ET
PL.Sort key1:=O.Range("C4"), Header:=xlYes 'tri la plage PL en fonction du Lot
For I = DL To 6 Step -1 'boucle inversée des lignes DL à 3
    'condition : si la cellule au-dessus est différente que la cellule de la boucle
    If O.Cells(I - 1, "C").Value <> O.Cells(I, "C").Value Then
        O.Rows(I).Insert 'insère une ligne en position I
        ET.Copy Rows(I) 'copy l'en tête dans la ligne I
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle inversée
End Sub
 

Discussions similaires

Réponses
7
Affichages
482
Réponses
8
Affichages
609

Statistiques des forums

Discussions
311 540
Messages
2 080 529
Membres
101 234
dernier inscrit
Layani89