Похоже, это решается с помощью двух индексов строк ndx_1 (в Sheet1) и ndx_2 (в Sheet2).
И нескольких начальных значений ndx_1_end, ndx_2_top и ndx_2_end, которые вычисляются изначально.
И переменные памяти - prevColA как строка, изначально установленная как пустая, и thisColA как строка.
Loop thru all of Sheet1,
get thisColA
and whenever ColA changes and is non-blank do two things
Move thisColA value to prevColA
Reset ndx_2 to its top minus 1
endif
then if thisColA is non-blank
Increment ndx_2
If ndx_2 is past its end,
then Move spaces to Sheet1.Cells(ndx_1, "B") 'cleanup
else Move Sheet2.Cell(ndx_2, Col1) to Sheet1.Cells(ndx_1, "B")
endif
increment ndx_1
Until end of non-blank Sheet1 ColA items (e.g. ndx_1 >= ndx_1_end)
Я оставляю вам право сейчас написать код для реализации этого.