Sub Macro1()
Dim dl As Integer 'déclare la variable dl
Dim x As Integer 'déclare la variable x (incrément)
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1")
dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne A
For Each cel In .Range(.Cells(4, 1), .Cells(dl, 4)) 'boucle sur toutes les cellules de la plage A4:D & dl
cel.Value = Trim(cel.Value) 'supprime les espaces inutiles à droite et à gauche
Next cel 'prochaine cellule cel de la boucle
For x = 4 To dl 'boucle des lignes 4 à dl
'si la cellule en colonne A est vide et la cellule en colonne B n'est pas vide,
If .Cells(x, 1).Value = "" And .Cells(x, 2).Value <> "" Then
'récupère dans la cellule en colonne A la valeur de la cellule au dessus
.Cells(x, 1).Value = .Cells(x - 1, 1).Value
End If
Next x 'prochaine ligne de la boucle
'tri alphabétique
.Columns("A:D").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
.Rows("2:2").Insert Shift:=xlDown 'insère une ligne
.Rows("2:2").Insert Shift:=xlDown 'insère une ligne
dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'redéfinit la dernière ligne éditée dl de la colonne A
For x = dl To 4 Step -1 'boucle inversée des lignes dl à 4
'condition : si la cellule en colonne A est identique à la cellule au dessus
If .Cells(x, 1).Value = .Cells(x - 1, 1).Value Then
.Cells(x, 1).Value = "" 'efface la cellule
Else 'sinon
.Rows(x).Insert Shift:=xlDown 'insère une ligne
End If 'fin de la condition
Next x 'prochaine ligne de la boucle
End With 'fin de la prise en compte de l'onglet "Feuil1"
End Sub