Sub test1()
Dim i As Integer, j As Integer, k As Integer
Dim a As Integer, b As Integer
For k = 2 To 12
For i = 3 To 8
If Sheets(1).Cells(i, k).Value <> "" Then a = i
Next i
' 1. Biến a không được reset lại ở đầu hoặc cuối vòng lặp k, như vậy nếu không gặp ô thoả thì nó sẽ giữ lại trị của dòng trước nó
' Tôi khong rõ điều này có đúng ý định hay khong, nhưng nếu khong phải thì rất khó debug
' 2. Vòng lặp này tìm ô khác trống cuối cùng trong dãy
' Như vậy, bạn có thể đếm ngược từ 8 về 3, gặp không trống thì thoát. Code như vậy đọc dễ hiểu hơn.
b = 17 - a
For j = 3 To a
Sheets(1).Cells(j + b, k).Value = Sheets(1).Cells(j, k).Value
Next j
Next k
End Sub