giúp mình tìm dòng cuối

Liên hệ QC

choinodiba

Thành viên mới
Tham gia
12/10/19
Bài viết
17
Được thích
6
Mình bị kẹt lâu quá về cách tìm dòng cuối ae chỉ giúp mình vì đâu mình sai để mình hiểu đc bản chất của vấn đề. lúc redim nó nhận hết cả mảng mặc dù mảng chỉ có 1 dòng.
Mã:
Sub voisheet1()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    arr = Sheet1.Range("B2:D" & lr).Value
    MsgBox lr
' tai sao dong cuoi cua bang tinh la la dong cuoi cung cua Excel
End Sub
Sub voisheet2()
    Dim lr2 As Long
    Dim arr2()
    lr2 = Sheet2.Range("BangKe").End(xlDown).Row
    arr2 = Sheet2.Range("A2:E" & lr2).Value
    MsgBox lr2
'dong cuoi lai là 6 ma ko phai là 2
End Sub
 

File đính kèm

  • AEChiGiupMinh.xlsm
    16.6 KB · Đọc: 10
Mình bị kẹt lâu quá về cách tìm dòng cuối ae chỉ giúp mình vì đâu mình sai để mình hiểu đc bản chất của vấn đề. lúc redim nó nhận hết cả mảng mặc dù mảng chỉ có 1 dòng.
Mã:
Sub voisheet1()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    arr = Sheet1.Range("B2:D" & lr).Value
    MsgBox lr
' tai sao dong cuoi cua bang tinh la la dong cuoi cung cua Excel
End Sub
Sub voisheet2()
    Dim lr2 As Long
    Dim arr2()
    lr2 = Sheet2.Range("BangKe").End(xlDown).Row
    arr2 = Sheet2.Range("A2:E" & lr2).Value
    MsgBox lr2
'dong cuoi lai là 6 ma ko phai là 2
End Sub
Thử: lr = Sheet1.range("BK").end(xlup).row
 
Upvote 0
Mã:
Sub voisheet1()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    arr = Sheet1.Range("B2:D" & lr).Value
    MsgBox lr
' tai sao dong cuoi cua bang tinh la la dong cuoi cung cua Excel
End Sub
Bạn lấy chuột bấm chọn vùng 'BK'; Sau đó bấm tiếp tổ hợp {CTRL} +{Mũi tên xuống} sẽ thấy ô tới của bạn là ô nào
PHP:
Sub voisheet2()
    Dim lr2 As Long
    Dim arr2()
    lr2 = Sheet2.Range("BangKe").End(xlDown).Row
    arr2 = Sheet2.Range("A2:E" & lr2).Value
    MsgBox lr2
'dong cuoi lai là 6 ma ko phai là 2
End Sub
[/QUOTE]
Cũng làm theo cách tương tự như trên để biết thêm chi tiết

& chúc vui vẻ & thành công!
 
Upvote 0
Mình bị kẹt lâu quá về cách tìm dòng cuối ae chỉ giúp mình vì đâu mình sai để mình hiểu đc bản chất của vấn đề. lúc redim nó nhận hết cả mảng mặc dù mảng chỉ có 1 dòng.
Mã:
Sub voisheet1()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    arr = Sheet1.Range("B2:D" & lr).Value
    MsgBox lr
' tai sao dong cuoi cua bang tinh la la dong cuoi cung cua Excel
End Sub
Sub voisheet2()
    Dim lr2 As Long
    Dim arr2()
    lr2 = Sheet2.Range("BangKe").End(xlDown).Row
    arr2 = Sheet2.Range("A2:E" & lr2).Value
    MsgBox lr2
'dong cuoi lai là 6 ma ko phai là 2
End Sub
Bạn thử dùng phím Ctrl+shift+mũi tên xuống dưới.Nó sẽ thể hiện câu lệnh của bạn.
lr = Sheet1.Range("BK").End(xlDown).Row
 
Upvote 0
Mình bị kẹt lâu quá về cách tìm dòng cuối ae chỉ giúp mình vì đâu mình sai để mình hiểu đc bản chất của vấn đề. lúc redim nó nhận hết cả mảng mặc dù mảng chỉ có 1 dòng.
Mã:
Sub voisheet1()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    arr = Sheet1.Range("B2:D" & lr).Value
    MsgBox lr
' tai sao dong cuoi cua bang tinh la la dong cuoi cung cua Excel
End Sub
Sub voisheet2()
    Dim lr2 As Long
    Dim arr2()
    lr2 = Sheet2.Range("BangKe").End(xlDown).Row
    arr2 = Sheet2.Range("A2:E" & lr2).Value
    MsgBox lr2
'dong cuoi lai là 6 ma ko phai là 2
End Sub
bạn sửa lại nư vậy lr = Sheet1.Range("BK").Rows.Count
Số lượng dòng trong Vùng "BK"
 
Upvote 0
Hix nhờ các bạn giải thích giúp mình. Chứ loanh quanh 1 hồi mình vẫn như lúc mới đăng, thậm chí còn rối rắm hơn.
Mình muốn lấy arr() theo lr nhưng lr luôn luôn sai, khi Redim theo mảng 1 chiều nó luôn nhẩy max dòng excel hoặc max dòng của Bảng đã tạo.a269ee639a807cde2591.png
Mã:
Sub voisheet1()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    arr = Sheet1.Range("B2:D" & lr).Value
    Dim arr2()
    Dim lr2
    ReDim arr2(1 To UBound(arr, 1) * UBound(arr, 2))
    lr2 = Sheet3.Cells(Rows.Count, 1).End(xlUp).Row + 1
    Dim i, j, k As Integer
    For i = 1 To UBound(arr, 1)
        For j = 1 To UBound(arr, 2)
            k = k + 1
            arr2(k) = arr(i, j)
            
        Next j
    Next i
    Sheet3.Range(lr2, 1).Resize(1, k).Value = arr2
 
Lần chỉnh sửa cuối:
Upvote 0
Hix nhờ các bạn giải thích giúp mình. Chứ loanh quanh 1 hồi mình vẫn như lúc mới đăng, thậm chí còn rối rắm hơn.
Mình muốn lấy arr() theo lr nhưng lr luôn luôn sai, khi Redim theo mảng 1 chiều nó luôn nhẩy max dòng excel hoặc max dòng của Bảng đã tạo.View attachment 227523
Mã:
Sub voisheet1()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    arr = Sheet1.Range("B2:D" & lr).Value
    Dim arr2()
    Dim lr2
    ReDim arr2(1 To UBound(arr, 1) * UBound(arr, 2))
    lr2 = Sheet3.Cells(Rows.Count, 1).End(xlUp).Row + 1
    Dim i, j, k As Integer
    For i = 1 To UBound(arr, 1)
        For j = 1 To UBound(arr, 2)
            k = k + 1
            arr2(k) = arr(i, j)
          
        Next j
    Next i
    Sheet3.Range(lr2, 1).Resize(1, k).Value = arr2
Bạn muốn lấy trong Vùng hay lấy dòng cuối trong Sheet1
Sheet1.Range("BK").End(xlDown).Row
Vùng BK xlDown dòng dưới không có dữ liệu thì nó phải xuống dòng cuối củng trên bàng tính chứ
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Sub hocdot()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    MsgBox lr
End Sub
đây nếu mình ghi thêm dữ liệu 1 dòng thì vẫn sai lr nhưng điền từ dòng tiếp theo thì cái lr của mình mới đúng theo ý mình hiểu.
 

File đính kèm

  • AEChiGiupMinh.xlsm
    20.6 KB · Đọc: 4
Upvote 0
Mã:
Sub hocdot()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").End(xlDown).Row
    MsgBox lr
End Sub
đây nếu mình ghi thêm dữ liệu 1 dòng thì vẫn sai lr nhưng điền từ dòng tiếp theo thì cái lr của mình mới đúng theo ý mình hiểu.
Bạn làm thí nghiệm như các bạn trên chỉ rồi rút ra kết luận nhé
 
Upvote 0
Mã:
lr = Cells(Sheet1.Range("BK").Rows.Count, Sheet1.Range("BK").Column).End(xlUp).Row

Tôi biết ý đồ của bạn làm gì tui chết liền
 
Upvote 0
Hix nhờ các bạn giải thích giúp mình. Chứ loanh quanh 1 hồi mình vẫn như lúc mới đăng, thậm chí còn rối rắm hơn.
Mình muốn lấy arr() theo lr nhưng lr luôn luôn sai, khi Redim theo mảng 1 chiều nó luôn nhẩy max dòng excel hoặc max dòng của Bảng đã tạo.
Theo mình hiểu thì Ir là tham biến chứa dòng cuối nào đó mà bạn đang cần?
& Tham biến này đang chứa kết quả chưa mong muốn của bạn, chứ gì?

Vậy hãy mô tả bằng lời đi, Ở Sheet1 bạn muốn Ir sẽ phải là dòng nào (1 cách cụ thể nhất, như còng cuối của cột nào?)
& tương tự ở Sheet2:. . . ?
Bạn đang phức tạp hóa tự mình & chưa thể ra khỏi bùng nhùng!
 
Upvote 0
Mã:
lr = Cells(Sheet1.Range("BK").Rows.Count, Sheet1.Range("BK").Column).End(xlUp).Row

Tôi biết ý đồ của bạn làm gì tui chết liền

Theo mình hiểu thì Ir là tham biến chứa dòng cuối nào đó mà bạn đang cần?
& Tham biến này đang chứa kết quả chưa mong muốn của bạn, chứ gì?

Vậy hãy mô tả bằng lời đi, Ở Sheet1 bạn muốn Ir sẽ phải là dòng nào (1 cách cụ thể nhất, như còng cuối của cột nào?)
& tương tự ở Sheet2:. . . ?
Bạn đang phức tạp hóa tự mình & chưa thể ra khỏi bùng nhùng!
Tôi muốn lấy dòng cuối trong "BK" để Mảng arr() nó sẽ thay đổi theo lr.
Bạn xem lại ví dụ của tôi. trong file đính kèm. Hiện tại nó hoạt động đc theo ý tôi muốn. nhưng nếu tôi xóa dữ liệu dòng thứ 3 trong excel thì code lại lỗi.
Bản chất của vấn đề vẫn chưa hiểu đc, nên mới phải hỏi để mọi người chỉ giúp, chứ ko làm theo thói quen mà chả hiểu nó vì sao.
 

File đính kèm

  • AEChiGiupMinh.xlsm
    20.3 KB · Đọc: 10
Upvote 0
Tôi muốn lấy dòng cuối trong "BK" để Mảng arr() nó sẽ thay đổi theo lr.
Bạn xem lại ví dụ của tôi. trong file đính kèm. Hiện tại nó hoạt động đc theo ý tôi muốn. nhưng nếu tôi xóa dữ liệu dòng thứ 3 trong excel thì code lại lỗi.
Bản chất của vấn đề vẫn chưa hiểu đc, nên mới phải hỏi để mọi người chỉ giúp, chứ ko làm theo thói quen mà chả hiểu nó vì sao.
Bạn chạy macro này & tự rút ra kết luận & khoan hãy nhận xét 1 khi chưa rõ ý định của người khác có nhã ý với mình.
PHP:
Sub VoiTrang01()
    Dim lr As Long, Dm As Long, Dg As Long
    Dim arr()
    [B7:B789].ClearContents
    For Dm = 1 To 3
        Dg = 99 - 10 * Dm
        Cells(Dg, "B").Value = "GPE.COM"
        lr = Sheet1.Range("BK").End(xlDown).Row
        MsgBox lr
    Next Dm
End Sub
 
Upvote 0
Bạn chạy macro này & tự rút ra kết luận & khoan hãy nhận xét 1 khi chưa rõ ý định của người khác có nhã ý với mình.
Tôi xin lỗi, mình nghĩ bạn nhầm ý mình, mình nói mình muốn hiểu chứ ko phải để nó theo thói quen.Mình không có ý xúc phạm ai ở đây cả, bạn có biết trc khi đăng bài tôi cũng phải tìm chán trc khi hỏi. Tôi kẹt ko hiểu khoảng 10 ngày rồi, tôi đọc đi đọc lại trong blog.excel rồi. lúc nó đc lúc nó lại lỗi mà tôi k biết lỗi từ đâu.
Giới thiệu luôn với bạn mình tên Nguyễn Khánh Lộc 35 tuổi, mình đọc VBA của Phan Tự Hướng, tự cày Excel khoảng 2 tháng nay. cái nào kẹt mình search google. xem clip của Gà Excel. Blueshop. vv mây mây, mình tham gia diễn đàn để học ko phải đi chửi lộn. Mình kinh doanh Vật liệu xây dựng. đang tự đọc thêm cả VB.Net nữa mà mông lung quá, VB6 thì nhiều người nói đã quá cũ mặc dù có vẻ dễ tiếp thu.
 
Upvote 0
Tôi xin lỗi, mình nghĩ bạn nhầm ý mình, mình nói mình muốn hiểu chứ ko phải để nó theo thói quen.Mình không có ý xúc phạm ai ở đây cả, bạn có biết trc khi đăng bài tôi cũng phải tìm chán trc khi hỏi. Tôi kẹt ko hiểu khoảng 10 ngày rồi, tôi đọc đi đọc lại trong blog.excel rồi. lúc nó đc lúc nó lại lỗi mà tôi k biết lỗi từ đâu.
Giới thiệu luôn với bạn mình tên Nguyễn Khánh Lộc 35 tuổi, mình đọc VBA của Phan Tự Hướng, tự cày Excel khoảng 2 tháng nay. cái nào kẹt mình search google. xem clip của Gà Excel. Blueshop. vv mây mây, mình tham gia diễn đàn để học ko phải đi chửi lộn. Mình kinh doanh Vật liệu xây dựng. đang tự đọc thêm cả VB.Net nữa mà mông lung quá, VB6 thì nhiều người nói đã quá cũ mặc dù có vẻ dễ tiếp thu.
Bạn muốn hiểu cách thức hoạt động của xlDown thì tôi giải thích như sau. Tôi không dám chắc là hiểu đúng nhưng tôi sẽ nói tôi hiểu thế nào. Việc dùng các phím tắt để xác định không giải thích được về bản chất của xlDown. Giải thích kiểu: xlDown trả về ô cuối cùng có dữ liệu là không chính xác vì:
1. Nếu trong cột B chỉ có B2 có dữ liệu thì Sheet1.Range("B2").End(xlDown).Row trả về 1048576 chứ không phải là 2.
2. Nếu ngoài B2 còn có 1 hoặc nhiều ô khác có dữ liệu thì kết quả trả về cũng chỉ chính xác khi các ô có dữ liệu là liên tục, không có dòng trống - hãy đọc lưu ý ở dưới.

Mọi code trong chủ đề này cũng chỉ trả về kết quả chứ không nói được gì về bản chất và cách thức hoạt động của xlDown.

Ta xét Range.end(xlup).

- Nếu Range là 1 ô thì "ô xuất phát" sẽ là ô ở cùng cột với Range và dưới 1 dòng. Tức ô dưới ô Range. Nếu Range là vùng nhiều cột / hoặc (và) nhiều dòng thì "ô xuất phát" là ô ở dưới ô nằm ở dòng 1 và cột 1 của vùng. Tức ô ở dưới ô nằm ở góc trên bên trái của vùng.

- từ "ô xuất phát" đi xuống cho tới khi gặp ô ĐẦU TIÊN KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG, và trả về chỉ số dòng của ô này. Nếu đi tới dòng cuối cùng của trang tính mà không gặp ô KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG thì trả về chỉ số của dòng cuối cùng trong trang tính. Tức 1048576 trong Excel >= 2007.

Bây giờ xét ví dụ của bạn. BK là vùng Sheet1!$B$2:$D$5. Vậy với câu lệnh
Mã:
lr = Sheet1.Range("BK").End(xlDown).Row
thì "ô xuất phát" là B3 (ô ở góc trên bên trái là B2).

- Trong trường hợp 1 B3 = Rubi và dưới nó là ô rỗng. B3 thỏa điều kiện là ô ĐẦU TIÊN KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG, vậy trả về chỉ số dòng của B3 là 3.

- Trong trường hợp 2 B3 = rỗng, và dưới B3 không có ô nào khác rỗng nên đi tới dòng cuối cùng của trang tính không có ô nào thỏa điều kiện là ô ĐẦU TIÊN KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG. Vậy trả về 1048576.

Lưu ý:
Nếu dữ liệu của bạn có những dòng trống, tức dữ liệu không liên tục, mà bạn muốn lấy dòng cuối cùng có dữ liệu thì bạn không dùng xlDown được. Vd. B3 = Rubi, B4 rỗng, B5 = hichic. Nếu bạn muốn lấy kết quả 5 thì không dùng xlDown được. Vì xlDown trả về 3. Vì sao? Vì chỉ có B3 thỏa điều kiện là ô ĐẦU TIÊN KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG. Ô B5 cũng thỏa điều kiện KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG nhưng không là ô ĐẦU TIÊN như thế. Ô B3 là ô ĐẦU TIÊN thỏa điều kiện KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG.
------------
Trong trường hợp dữ liệu không liên tục, tức có dòng trống xen kẽ thì để lấy dòng cuối cùng có dữ liệu bạn phải dùng xlUp như sau:
Mã:
lr = Sheet1.Range("B1000").End(xlUp).Row
Nhưng nếu có hơn 1000 dòng dữ liệu thì tèo. Có thể thay bằng 10000, 100000, nhưng tốt nhất là
Mã:
lr = Sheet1.Range("B" & Rows.Count).End(xlUp).Row

hoặc

lr = Sheet1.Cells(Rows.Count, "B").End(xlUp).Row
-----
Nếu dữ liệu của bạn nằm trong bảng (Table) thì cả xlDown và xlUp đều có thể trả về không chính xác. Vì với xlDown hay xlUp luôn trả về dòng cuối cùng của bảng cho dù bảng có hay không có dữ liệu. Thử như sau: nhập dữ liệu trong bảng, vd. Table1, cho tới dòng 20. Tiếp theo xóa hết dữ liệu. Sau cùng chạy code. Dù với xlDown hay xlUp thì kết quả là 20 cho dù Table1 đã không còn dữ liệu.
 
Lần chỉnh sửa cuối:
Upvote 0
Giới thiệu luôn với bạn mình tên Ng Kh Lc 35 tuổi, mình đọc VBA. . . . .
Còn thằng út cùa mình sinh ra vào cái tháng & cái năm đổi tiền gần đây nhất
Chúc bạn vui.
 
Upvote 0
Chúc vui nhé em zai hihihihih
Mã:
Sub hocdot()
    Dim lr As Long
    Dim arr()
    lr = Sheet1.Range("BK").Rows(Sheet1.Range("BK").Rows.Count + 1).End(xlUp).Row
    If lr < Sheet1.Range("BK").Rows(1).Row Then Exit Sub
    arr = Sheet1.Range("B2:D" & lr).Value
    lr2 = Sheets("Data").Cells(Sheets("Data").Rows.Count, 1).End(xlUp).Row + 1
    Sheets("data").Cells(lr2, 1).Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lưu ý:
Nếu dữ liệu của bạn có những dòng trống, tức dữ liệu không liên tục, mà bạn muốn lấy dòng cuối cùng có dữ liệu thì bạn không dùng xlDown được. Vd. B3 = Rubi, B4 rỗng, B5 = hichic. Nếu bạn muốn lấy kết quả 5 thì không dùng xlDown được. Vì xlDown trả về 3. Vì sao? Vì chỉ có B3 thỏa điều kiện là ô ĐẦU TIÊN KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG. Ô B5 cũng thỏa điều kiện KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG nhưng không là ô ĐẦU TIÊN như thế. Ô B3 là ô ĐẦU TIÊN thỏa điều kiện KHÁC RỖNG MÀ SAU NÓ LÀ Ô RỖNG.
Cảm ơn các bạn và đặc biệt là bạn, sáng mình đã đưa Cả tiêu đề vào trong Table và đều cho kết quả ngay từ dòng minh cần lấy dữ liệu.
Mình cần xldown vì mình thấy khi arr() của mình chuyển sang Sheets khác nó đếm đủ số Mảng 1 chiều mình cần.
 
Upvote 0
Web KT
Back
Top Bottom