Lấy dữ liệu xuống dòng cuối

Liên hệ QC
Xin phép @Thớt và anh @HieuCD , Thấy các bạn bàn tán rôm rả tôi cũng muốn tham gia chút.
Trong file tôi dùng For - Next thay vì dùng mảng. Mong các bạn góp ý thêm.
@hongphuong1997 xem đúng ý cô chưa ?
Mã:
Sub test1()
Dim i, j, k As Integer
Dim a, b, vLue, vCopy

For k = 2 To 12
    For i = 3 To 8
        vLue = Sheets(1).Cells(i, k)
    If vLue <> "" Then
        a = i
    End If
Next i

b = 17 - a
For j = 3 To a
    vCopy = Sheets(1).Cells(j, k)
    Sheets(1).Cells(j + b, k) = vCopy
Next j
Next k

End Sub
Nhưng anh ơi em muốn lấy số "0" ở đầu các số thì phải làm như nào hở anh?
 
Bạn nên coi chừng chỗ nguy hiểm của code (tôi chú thích trong code):

Rút gon code lại
Mã:
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

Chú: vòng lặp i và j hoàn toàn độc lập với nhau. Trên nguyên tắc, bạn có thể dùng lại biến i, khong cần dùng j. Vả lại một trong những điều mà lập trình nên tránh là dùng j làm chỉ số dòng.
 
Bạn nên coi chừng chỗ nguy hiểm của code (tôi chú thích trong code):



Chú: vòng lặp i và j hoàn toàn độc lập với nhau. Trên nguyên tắc, bạn có thể dùng lại biến i, khong cần dùng j. Vả lại một trong những điều mà lập trình nên tránh là dùng j làm chỉ số dòng.
Em cám ơn. Về biến a thì trong trường hợp này đúng là em đã quên không reset. Nó sẽ chạy sai nếu 1 cột bất kỳ không có dữ liệu (nói đúng hơn là chạy thừa, lãng phí, vì suy cho cùng nếu không có dữ liệu thì cũng không có gì để copy cả). Còn ý 2 "lập trình" cần tránh những gì em chưa rõ hết, nhưng vẫn xin ghi nhận góp ý của anh.
Bài đã được tự động gộp:

Nhưng anh ơi em muốn lấy số "0" ở đầu các số thì phải làm như nào hở anh?
Thì bạn ghi dạng Text của cell dữ liệu đó là được mà. Lưu ý là bảng 2 bạn cũng cần để định dạng text luôn :)
 
Lần chỉnh sửa cuối:
Bạn nên coi chừng chỗ nguy hiểm của code (tôi chú thích trong code):



Chú: vòng lặp i và j hoàn toàn độc lập với nhau. Trên nguyên tắc, bạn có thể dùng lại biến i, khong cần dùng j. Vả lại một trong những điều mà lập trình nên tránh là dùng j làm chỉ số dòng.
Viết code nhiều mà còn bị sơ sót khá nguy hiểm :(, cũng may chỉ gán giá trị trống nên thoát nạn:)
 
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.
@VetMini Em cũng thử viết theo cách anh hướng dẫn, không biết em viết đúng hay không?
Mã:
For i = 8 To 3 Step -1
    If Sheets(1).Cells(i, k).Value <> "" Then
      a = i
      Exit For
    End If
Next i
 
Lần chỉnh sửa cuối:
Em cảm ơn anh, code ngắn gọn quá anh.
Nhưng code không chạy được anh à
Cái này là mình theo chỉ dẫn của anh VetMiNi "Đếm từ dưới lên", mình viết tắt, hoàn chỉnh phải là :
Mã:
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 = 8 To 3 Step -1
    If Sheets(1).Cells(i, k).Value <> "" Then
      a = i
      Exit For
    End If
Next i   
    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
 
Cái này là mình theo chỉ dẫn của anh VetMiNi "Đếm từ dưới lên", mình viết tắt, hoàn chỉnh phải là :
Mã:
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 = 8 To 3 Step -1
    If Sheets(1).Cells(i, k).Value <> "" Then
      a = i
      Exit For
    End If
Next i  
    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
Em cảm ơn anh
Chúc anh luôn luôn yêu đời và nhanh chóng lấy vợ đi anh nhé!
 
Web KT
Back
Top Bottom