You have figured out how to find the last Row.
So the next free cell is the cell below the last used cell (lastcell.Offset(1))
Similar for the Column
Last used Cell in Row1
lc = Cells(1, Columns.Count).End(xlToLeft).Column
So the next free Column based on the top row would be
Cells(1, Columns.Count).End(xlToLeft).Column + 1
The 1 in above examples is fir the first Row. Change accordingly
You can also use
Range("XFD1").End(xlToLeft).Column + 1 '(the 1 in XFD1 again is for the first row)
If you have staggering row lengths and you need the first free column, use
First free column = Cells.Find("*", , , , xlByColumns, xlPrevious).Column.Offset(, 1)
A quick example would be
Dim sh1 As Worksheet, sh2 As Worksheet
Set sh1 = Sheets("Data")
Set sh2 = Sheets("Destination")
sh1.Range("D1:D" & sh1.Cells(Rows.Count, 4).End(xlUp).Row).Copy sh2.Cells(1, sh2.Cells.Find("*", , , , xlByColumns, xlPrevious).Column).Offset(, 1)