Selected Answer
Speed
In the attached revised file I'have modified your code as shown below. I created another variable "Items" and collected those (and the Total row) from the invoice so they could be copied into column A of your worksheet client_archive.
I've then modified the sizing of (Range) "a" to collect the remaining invoice item data.
The code looks long since I've added comments and indented your code to help me (and you) understand what is happening:
Sub test()
Dim a, a1, Items
' get data
With Sheets("INV_PUR")
' get common data (Date/time, Client and Invoice number)
a1 = Array(.Range("I10"), .Range("C10"), .Range("E16"))
'get items numbers (including Total)
Items = .Range(.Range("B19"), .Range("B19").End(xlDown))
' get Invoice item data
a = .Range(.Range("C19"), .Range("I19").End(xlDown))
' archive data
With Sheets("client_archive")
' calculate next free row for column A (1) not D(4)
lr = .Cells(Rows.Count, 1).End(xlUp).Row + 1
'copy item numbers
.Range("A" & lr).Resize(UBound(Items), 1) = Items
'copy common data but without Totals row
.Range("B" & lr).Resize(UBound(Items) - 1, 3) = a1
' copy invoice items
.Range("E" & lr).Resize(UBound(a), UBound(a, 2)) = a
' adjust columns
.Columns("A:K").AutoFit
End With
End With
End Sub
Note that I added lines to adjust the column widths and also copied the formatting of the first few rows of worksheet client_archive but only to row 21 (cells looked the same but your formatting was not consistent).
Hope this works well for you.