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

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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 =...
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
 
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

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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
2 K
Réponses
15
Affichages
3 K
Retour