Bonjour Neodule, bonjour le forum,
Essaie comme ça :
Sub Macro1()
Dim OB As Worksheet 'déclare la variable OB (Onglet Bl)
Dim OE As Worksheet 'déclare la variable OE (Onglet Etiquette)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim PL As Range 'déclare la variable PL (PLage)
Dim NL As Integer 'déclare la variable NL (Nombre de Lignes)
Set OB = Worksheets("BL") 'définit l'onglet OB
Set OE = Worksheets("ETIQUETTE") 'définit l'onglet OB
Set PL = OE.Range("D1") 'initialise la plage PL
DL = OE.Cells(Application.Rows.Count, "D").End(xlUp).Row - 1 'définit la dernière ligne éditée DL de la colonne D de l'onglet OE
For I = 3 To DL 'boucle sur toutes les lignes I de 3 a DL
If OE.Cells(I, "M").Value <> "" Then 'condition : si la cellule ligne I colonne M de l'onglet OE n'est pas vide
'définit la plage PL
Set PL = IIf(PL.Cells.Count = 1, OE.Cells(I, "D").Resize(1, 24), Application.Union(PL, OE.Cells(I, "D").Resize(1, 24)))
NL = NL + 1 'définit le nombre de lignes de la plage PL
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
Application.ScreenUpdating = False 'amasque les rafraîchissements d'écran
OB.ListObjects(1).DataBodyRange.Rows.Delete 'supprime les lignes du tableau structuré
OB.ListObjects(1).Resize Range(Cells(1, "D"), Cells(2 + NL, "AA")) 'redimensionne le tableau structuré
PL.Copy OB.Range("D2") 'copie la plage PL en D2 de l'onglet OB
End Sub