Hỏi về code tìm dòng cuối cùng! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vova2209

Thành viên tích cực
Tham gia
5/4/17
Bài viết
835
Được thích
112
Giới tính
Nam
Nghề nghiệp
Đường bộ
em muốn tìm dòng cuối cùng của tất cả cột, Nhưng giờ em có nhiều Sub mỗi lần phải tạo như này:
Dim lr As Long
lr = Range("F65535").End(xlUp).row
Range("G3:J3").Copy
Range("G3:J" & lr).PasteSpecial Paste:=xlPasteFormulas
---------------------
>> Hay là có cách khác không ạ!
 
Lần chỉnh sửa cuối:
em muốn tìm dòng cuối cùng của tất cả cột, Nhưng giờ em có nhiều Sub mỗi lần phải tạo như này:
Dim lr As Long
lr = Range("F65535").End(xlUp).row
Range("G3:J3").Copy
Range("G3:J" & lr).PasteSpecial Paste:=xlPasteFormulas
---------------------
>> Hay là có cách khác không ạ!
tham khảo cái này nhé bạn
Mã:
MsgBox Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
 
Upvote 0
tham khảo cái này nhé bạn
Mã:
MsgBox Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
à! ý em là muốn tạo 1 funciton thay code này "lr = Range("F65535").End(xlUp).row". Nhưng em muốn code tìm dòng cuối của tất cả các cột trong bảng
 
Upvote 0
Function LastRow(byVal Col As String, Optional Sh As WorkSheet = Nothing) As Long
If Sh Is Nothing Then
LastRow = Cells(Rows.Count, Col).End(xlUp).Row
Else
LastRow = Sh.Cells(Rows.Count, Col).End(xlUp).Row
End If
End Function

Range("G3:J" & LastRow("F")).PasteSpecial Paste:=xlPasteFormulas
 
Upvote 0
Function LastRow(byVal Col As String, Optional Sh As WorkSheet = Nothing) As Long
If Sh Is Nothing Then
LastRow = Cells(Rows.Count, Col).End(xlUp).Row
Else
LastRow = Sh.Cells(Rows.Count, Col).End(xlUp).Row
End If
End Function

Range("G3:J" & LastRow("F")).PasteSpecial Paste:=xlPasteFormulas
Vẫn báo lỗi anh à! file đính kèm dưới anh xem em làm đúng chưa ạ
 

File đính kèm

Upvote 0
Vâng em hiểu rồi! cảm ơn anh nhiều
Ối giời ơi! kinh đấy. tui chả hiểu gì cả :(
đề bài là thế này mà nhỉ
"em muốn tìm dòng cuối cùng của tất cả cột"
nhưng tại sao lại tìm trong cột F
-------------------------------------
chắc là mình không đọc kỹ đề nên hướng giải sai mất :D
lr = Range("F65535").End(xlUp).row
 
Upvote 0
Ối giời ơi! kinh đấy. tui chả hiểu gì cả :(
đề bài là thế này mà nhỉ
"em muốn tìm dòng cuối cùng của tất cả cột"
nhưng tại sao lại tìm trong cột F
-------------------------------------
chắc là mình không đọc kỹ đề nên hướng giải sai mất :D
lr = Range("F65535").End(xlUp).row
Như này là vẫn bị phụ thuộc vào Range("G3:J" & LastRow("F")).PasteSpecial Paste:=xlPasteFormulas à anh! anh chỉnh lại dùm e với ạ!
 
Upvote 0
Như này là vẫn bị phụ thuộc vào Range("G3:J" & LastRow("F")).PasteSpecial Paste:=xlPasteFormulas à anh! anh chỉnh lại dùm e với ạ!
Bạn thử cách này xem sao
PHP:
Sub Copydulieu()
    Dim Rng As Range, R As Long
Set Rng = Range("G3:J3")
R = LastRowRange(Rng)
'MsgBox J
Range("G3:J3").Copy
Range("G3:J" & R).PasteSpecial Paste:=xlPasteFormulas
End Sub
PHP:
Function LastRowRange(ByVal Vungtieude As Range) As Long
    Dim I As Long, J As Long, N As Long, Dongcuoi As Long
    For Each Cll In Vungtieude
        J = Cll.Column:    I = Rows.Count
        N = Cells(I, J).End(3).Row
        If Dongcuoi < N Then Dongcuoi = N
    Next
    LastRowRange = Dongcuoi
End Function
 
Upvote 0
Bạn thử cách này xem sao
PHP:
Sub Copydulieu()
    Dim Rng As Range, R As Long
Set Rng = Range("G3:J3")
R = LastRowRange(Rng)
'MsgBox J
Range("G3:J3").Copy
Range("G3:J" & R).PasteSpecial Paste:=xlPasteFormulas
End Sub
PHP:
Function LastRowRange(ByVal Vungtieude As Range) As Long
    Dim I As Long, J As Long, N As Long, Dongcuoi As Long
    For Each Cll In Vungtieude
        J = Cll.Column:    I = Rows.Count
        N = Cells(I, J).End(3).Row
        If Dongcuoi < N Then Dongcuoi = N
    Next
    LastRowRange = Dongcuoi
End Function
Function này LastRowRange không sài được trực tiếp như này à anh!
Range("B3:C3").Copy
Range("B4:C" & LastRowRange).PasteSpecial Paste:=xlPasteFormulas
Mà vẫn phải gán định dạng
Dim Rng As Range
R As Long; Set Rng = Range("G3:J3")
R = LastRowRange(Rng).
Nếu như này thì làm như này vẫn hơi dài anh ạ!
Dim lr As Long
lr = Range("E65000").End(xlUp).row
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Function LastRowRange(ByVal Vungtieude As Range) As Long
    Dim I As Long, J As Long, N As Long, Dongcuoi As Long
    For Each Cll In Vungtieude
        J = Cll.Column:    I = Rows.Count
        N = Cells(I, J).End(3).Row
        If Dongcuoi < N Then Dongcuoi = N
    Next
    LastRowRange = Dongcuoi
End Function

For i = Vungtieude.Column to Vungtieude.Column + Vungtieude.Columns.Count - 1
Dongcuoi = Application.Max(Dongcuoi, Cells(Rows.Count, i).End(3).Row)
Next i

Tôi chỉ chỉnh code theo thuật toán của bạn thôi.
Còn việc thuật toán có đáp ứng được gì thì tôi không biết.
 
Upvote 0
Em hỏi thêm ạ!
Mục này đổi thành Function như nào anh nhỉ :
VD
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Code
Application.CutCopyMode = False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

Em muốn Function dùng như này:
Sub GPC ()

GetSpeed = true
Code
GetSpeed = False
End sub
 
Upvote 0
For i = Vungtieude.Column to Vungtieude.Column + Vungtieude.Columns.Count - 1
Dongcuoi = Application.Max(Dongcuoi, Cells(Rows.Count, i).End(3).Row)
Next i

Tôi chỉ chỉnh code theo thuật toán của bạn thôi.
Còn việc thuật toán có đáp ứng được gì thì tôi không biết.
Vẫn báo lỗi! file đính kèm dưới anh xem hộ em làm đúng chưa với ạ.
em thay vào vẫn ko dc:
For i = Vungtieude.Column to Vungtieude.Column + Vungtieude.Columns.Count - 1
Dongcuoi = Application.Max(Dongcuoi, Cells(Rows.Count, i).End(3).Row)
Next i
 

File đính kèm

Upvote 0
Vẫn báo lỗi! file đính kèm dưới anh xem hộ em làm đúng chưa với ạ.
em thay vào vẫn ko dc:
For i = Vungtieude.Column to Vungtieude.Column + Vungtieude.Columns.Count - 1
Dongcuoi = Application.Max(Dongcuoi, Cells(Rows.Count, i).End(3).Row)
Next i

Bạn ví dụ lại cho rõ rệt là bạn muốn gì.
Từ đầu chí cuối, chả ai hiểu bạn muốn làm gì.

tiều đề là bạn muốn tìm dòng cuối cùng. Từ "cuối cùng" nó có cái ngữ cảnh của nó. Cuối cùng của nhóm nào? nhóm ấy gồm những gì, và như thế nào thì gọi là cuối cùng.
 
Upvote 0
Bạn ví dụ lại cho rõ rệt là bạn muốn gì.
Từ đầu chí cuối, chả ai hiểu bạn muốn làm gì.

tiều đề là bạn muốn tìm dòng cuối cùng. Từ "cuối cùng" nó có cái ngữ cảnh của nó. Cuối cùng của nhóm nào? nhóm ấy gồm những gì, và như thế nào thì gọi là cuối cùng.
- Em muốn copy công thức B3:C3
- Code sẽ tự tìm 1 cột có dữ liệu nhiều nhất ( dòng cuối cùng)
sẽ copy đến đó. Mà không phải là mình tự đi tìm 1 cột có dòng nhiều dữ liệu nhất để gán so với cột đó!
 

File đính kèm

Upvote 0
Có 2 cách xác định dòng cuối cùng.
1. Xác định theo vùng. Cứ đến chỗ trống là hết vùng, không nhất thiết phải là ô cuối thật sự
2. Xác định chính xác ô cuối cùng trong vùng. Bỏ qua các khoảng trống ở giữa.
 
Upvote 0
Có 2 cách xác định dòng cuối cùng.
1. Xác định theo vùng. Cứ đến chỗ trống là hết vùng, không nhất thiết phải là ô cuối thật sự
2. Xác định chính xác ô cuối cùng trong vùng. Bỏ qua các khoảng trống ở giữa.
Em muốn cách 2 bỏ qua các ô trống tìm đếm dữ liệu cuối cùng của cột!
 
Upvote 0
Hàm LastRowRange ở bài #10 đáp ứng điều này
 
Upvote 0
Tạo 1 sub tháo ẩn dòng và 1 sub cài trở lại.

Khi làm việc với VBA có liên quan đến số dòng, gọi sub 1 và làm xong thì gọi sub 2
 
Upvote 0
Cái đó gặp ẩn dòng thì không đúng thầy ạ
dùng cách của bạn Mutants Men để tìm dòng cuối kể cả bị ẩn
Mã:
Function LastRowRange(ByVal Rng As Range) As Long
    LastRowRange = Range(Rng(1, 1), Cells(Rows.Count, Rng(1, Rng.Columns.Count).Column)).Find(What:="*", After:=
Rng(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
VBA là bút sa gà chết. Làm việc với một mớ dữ liệu lớn làm sao kiểm soát hết. Vì vậy trước khi bước vào phải khẳng định:
1 là chấp nhận dòng/cột ẩn và merged cells, 2 là không chấp nhận

Nếu bạn theo 1 thì mọi code đều phải viết theo kiểu đại chúng để bao trùm hết
Néu bạn theo 2 thì phải gỡ cột/dòng ẩn và merged cells trước khi làm việc

Đầu nào cũng có cái lợi và cái bất lợi của nó. Tôi không kêu gọi theo đường nào nhưng nếu theo đường nào thì phải giữ cho đúng lệ của đường ấy.
 
Upvote 0
Hàm LastRowRange ở bài #10 đáp ứng điều này
Sub CopyTHCD()

getSpeed True
Range("B3:C3").Copy 'Copy Công thuc'
Range("B4:C" & Fdongcuoi(1)).PasteSpecial Paste:=xlPasteFormulas

Range("A3").Select

Application.CutCopyMode = False
getSpeed False
End Sub

'TÌM DÒNG CUÔI CÙNG------------------------------------------------
Function Fdongcuoi(ByVal Col As String, Optional Sh As Worksheet = Nothing) As Long
If Sh Is Nothing Then
Fdongcuoi = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
Else
Fdongcuoi = Sh.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
End If
End Function
Em làm được rồi chỉ cần cột nào có dữ liệu nhiều nhất nó sẽ chạy theo cột đó. Fdongcuoi(1) em phải thêm số (1) vào code nó mới chạy là sao ạ..
 
Upvote 0
dùng cách của bạn Mutants Men để tìm dòng cuối kể cả bị ẩn
Mã:
Function LastRowRange(ByVal Rng As Range) As Long
    LastRowRange = Range(Rng(1, 1), Cells(Rows.Count, Rng(1, Rng.Columns.Count).Column)).Find(What:="*", After:=
Rng(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End Function
Nếu cột không có dữ liệu nó lỗi anh ạ
 
Upvote 0
Nếu cột không có dữ liệu nó lỗi anh ạ
Nếu không có dữ liệu thì "tìm dòng cuối có dữ liệu" không biết nên trả kết quả là gì?
Mã:
Function LastRowRange(ByVal Rng As Range) As Long
  On Error Resume Next
  LastRowRange = Range(Rng(1, 1), Cells(Rows.Count, Rng(1, Rng.Columns.Count).Column)).Find(What:="*", After:=Rng(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
  If Err.Number > 0 Then Err.Clear ': LastRowRange = 1
End Function
 
Upvote 0
Nếu không có dữ liệu thì "tìm dòng cuối có dữ liệu" không biết nên trả kết quả là gì?
Mã:
Function LastRowRange(ByVal Rng As Range) As Long
  On Error Resume Next
  LastRowRange = Range(Rng(1, 1), Cells(Rows.Count, Rng(1, Rng.Columns.Count).Column)).Find(What:="*", After:=Rng(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
  If Err.Number > 0 Then Err.Clear ': LastRowRange = 1
End Function
Nó trả về dòng đầu tiên. Với lại anh bỏ qua tham số LookIn nên nó nó bỏ qua dòng có công thức luôn ạ.
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Upvote 0
Sao khi Gõ hàm trực tiếp vào Exel nếu số dòng > dòng chứa công thức kết quả bằng 1 . Còn nhỏ hơn hoặc băng thì kết quả bằng 17 anh ạ
Do chỉ tìm từ dòng của tham số Rng trở xuống, Chỉnh lại để tìm cả cột
Mã:
Function LastRowRange(ByVal Rng As Range) As Long
  On Error Resume Next
  LastRowRange = Range(Cells(1, Rng(1, 1).Column), Cells(Rows.Count, Rng(1, Rng.Columns.Count).Column)).Find(What:="*", After:=Cells(1, Rng(1, 1).Column), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
  If Err.Number > 0 Then Err.Clear: LastRowRange = 1
End Function
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom