Option Explicit
Sub CopyData()
Dim x, i As Long, j As Long, der As Long, n As Long
Dim st As Worksheet, WS As Worksheet, s As String
Application.ScreenUpdating = False
Set st = Sheets("sheet1")
der = st.Range("d" & Rows.Count).End(xlUp).Row
x = st.Range("d1:n" & der)
ReDim Preserve x(1 To UBound(x), 1 To UBound(x, 2) + 1) 'on ajoute une colonne vide à x
' dans cette colonne, on va y concaténer toutes les valeurs des colonnes précédentes (F à N)
' si F à N sont toutes vides, alors la dernière colonne de x sera égale à ""
For i = 1 To UBound(x)
For j = 3 To UBound(x, 2) - 1: x(i, UBound(x, 2)) = x(i, UBound(x, 2)) & x(i, j): Next j
Next i
Set WS = Sheets("résultat")
WS.Range("a:k").ClearContents
For i = 1 To UBound(x)
If x(i, UBound(x, 2)) <> "" Then
' on déplace les lignes à copier vers le haut du tableau x
' on utilise le même tableau x pour la source et le résultat
' la ligne i prend la place de la ligne n (pas de chevauchement possible
' puisque n est toujours inférieur ou égal à la ligne courante i)
n = n + 1
For j = 1 To UBound(x, 2): x(n, j) = x(i, j): Next
End If
Next
' les données à copier sont les n premières lignes de x
' (sauf la dernière colonne de chaque ligne qui nous a servi à savoir
' si la ligne était vide ou non)
With WS.Range("a1").Resize(n, UBound(x, 2) - 1)
.Value = x
.HorizontalAlignment = xlCenter
.Borders.LineStyle = xlContinuous
End With
End Sub