Nhờ sửa code tìm dòng cuối cùng trong mảng

Liên hệ QC

anhtotbung35

Thành viên hoạt động
Tham gia
16/2/09
Bài viết
149
Được thích
26
Nghề nghiệp
Kế toán
Mình có đoạn code công thức tìm dòng cuối cùng trong excell (của bạn Domfoot) như sau:

Function xlLastRow(Optional WorksheetName As String) As Long

'Check for optional worksheetname else use activesheet
If WorksheetName = vbNullString Then
WorksheetName = ActiveSheet.Name
End If

' find the last populated row in a worksheet
With Worksheets(WorksheetName)
xlLastRow = .Cells.Find("*", .Cells(1), xlFormulas, _
xlWhole, xlByRows, xlPrevious).Row
End With

End Function

Giờ nhu cầu mình muốn công thức đó chỉ tìm dòng cuối trong mảng từ A1 đến N10 (mảng này đã có border) Mình đã thử rồi, nhưng chưa hiểu hết. Nhờ các bạn sửa giúp nhé.
 
Thử thế này xem

Mã:
Function xlLastRow(Optional WorksheetName As String) As Long
     
    'Check for optional worksheetname else use activesheet
    If WorksheetName = vbNullString Then
        WorksheetName = ActiveSheet.Name
    End If
    
     '    find the last populated row in a worksheet
    With Worksheets(WorksheetName)
        xlLastRow = .[A10].End(Xlup).Row
End With
     
End Function
 
Upvote 0
Thử thế này xem

Mã:
Function xlLastRow(Optional WorksheetName As String) As Long
 
'Check for optional worksheetname else use activesheet
If WorksheetName = vbNullString Then
WorksheetName = ActiveSheet.Name
End If
 
' find the last populated row in a worksheet
With Worksheets(WorksheetName)
xlLastRow = .[A10].End(Xlup).Row
End With
 
End Function
Sao không được bạn ơi, báo lỗi #Value!. Bạn xem lại file kèm theo giúp nhé.
 

File đính kèm

Upvote 0
Bạn sửa lại như thế này:
PHP:
Function xlLastRow(Optional WorksheetName As String) As Long
    If WorksheetName = vbNullString Then
        WorksheetName = ActiveSheet.Name
    End If
    With Worksheets(WorksheetName)
        xlLastRow = .[A1:N10].Find("*", .Cells(1), xlFormulas, xlWhole, xlByRows, xlPrevious).Row
    End With
End Function
 
Upvote 0
Tên sheet trong hàm phải có cặp dấu nháy chứ!
=xlLastRow("A")
 
Upvote 0
Bạn sửa lại như thế này:
PHP:
Function xlLastRow(Optional WorksheetName As String) As Long
If WorksheetName = vbNullString Then
WorksheetName = ActiveSheet.Name
End If
With Worksheets(WorksheetName)
xlLastRow = .[A1:N10].Find("*", .Cells(1), xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End With
End Function

Cảm ơn bạn nhé. Mình thử rồi. OK
 
Upvote 0
Bạn sửa lại như thế này:
PHP:
Function xlLastRow(Optional WorksheetName As String) As Long
If WorksheetName = vbNullString Then
WorksheetName = ActiveSheet.Name
End If
With Worksheets(WorksheetName)
xlLastRow = .[A1:N10].Find("*", .Cells(1), xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End With
End Function
Nhờ bạn xem lại một lần nữa nhé. Khi mình đổi mảng thành .[A2:N10] thì lại báo lỗi #Value!. Mình cũng đã thử đổi .Cells(2) rồi như vẫn báo lỗi.
 

File đính kèm

Upvote 0
Nhờ bạn xem lại một lần nữa nhé. Khi mình đổi mảng thành .[A2:N10] thì lại báo lỗi #Value!. Mình cũng đã thử đổi .Cells(2) rồi như vẫn báo lỗi.
Đã là UDF thì phải mang tính tổng quát... Lý nào trong code lại chỉ định chính xác A2:N10 như thế chứ (còn gì là tính tổng quát của 1 UDF)
Nếu là tôi thì sẽ sửa code này theo dạng này:
PHP:
Function xlLastRow(Optional SrcRng As Range) As Long
  On Error Resume Next
  Application.Volatile
  If SrcRng Is Nothing Then Set SrcRng = ActiveSheet.UsedRange
  xlLastRow = SrcRng.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End Function
Vậy tại cell B1 bạn sẽ gõ công thức:
=xlLastRow(A1:N100)
nếu muốn chỉ định chính xác vùng tìm kiếm là A1:N100
hoặc:
=xlLastRow() ---> sẽ ngầm hiểu là tìm trên UsedRange của ActiveSheet
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Đã là UDF thì phải mang tính tổng quát... Lý nào trong code lại chỉ định chính xác A2:N10 như thế chứ (còn gì là tính tổng quát của 1 UDF)
Nếu là tôi thì sẽ sửa code này theo dạng này:
PHP:
Function xlLastRow(Optional SrcRng As Range) As Long
On Error Resume Next
Application.Volatile
If SrcRng Is Nothing Then Set SrcRng = ActiveSheet.UsedRange
xlLastRow = SrcRng.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End Function
Vậy tại cell B1 bạn sẽ gõ công thức:
=xlLastRow(A1:N100)
nếu muốn chỉ định chính xác vùng tìm kiếm là A1:N100
hoặc:
=xlLastRow() ---> sẽ ngầm hiểu là tìm trên UsedRange của ActiveSheet
Cảm ơn bạn, cái này rất đúng như mong muốn của mình. Mình có thể chọn vùng tìm kiếm bất kỳ.
 
Upvote 0
Cảm ơn bạn, cái này rất đúng như mong muốn của mình. Mình có thể chọn vùng tìm kiếm bất kỳ.
Tôi thấy ở một topic khác bạn dùng hàm này để lấy dòng cuối cùng có dữ liệu và đưa vào một code khác. Nếu như thế thì nên thêm vào UDF 1 biến để xác định xem cần lấy thông tin ở sheet nào. Nếu cứ lấy ở sheet hiện hành mà đưa vào áp dụng với nhu cầu của bạn thì có thể không kiểm soát được kết quả.
 
Upvote 0
Tôi thấy ở một topic khác bạn dùng hàm này để lấy dòng cuối cùng có dữ liệu và đưa vào một code khác. Nếu như thế thì nên thêm vào UDF 1 biến để xác định xem cần lấy thông tin ở sheet nào. Nếu cứ lấy ở sheet hiện hành mà đưa vào áp dụng với nhu cầu của bạn thì có thể không kiểm soát được kết quả.
Bạn ới, trong code của tôi đã có Optional SrcRng As Range rồi còn gì
Mà Range thì đương nhiên có bao gồm tên sheet, thậm chí là cả tên workbook ---> Muốn lấy tại vị trí nào mà chẳng được (trong file đính kèm, tôi có công thức xác định LastRow ở sheet khác đấy thôi)
 
Upvote 0
Đã là UDF thì phải mang tính tổng quát... Lý nào trong code lại chỉ định chính xác A2:N10 như thế chứ (còn gì là tính tổng quát của 1 UDF)
Nếu là tôi thì sẽ sửa code này theo dạng này:
PHP:
Function xlLastRow(Optional SrcRng As Range) As Long
On Error Resume Next
Application.Volatile
If SrcRng Is Nothing Then Set SrcRng = ActiveSheet.UsedRange
xlLastRow = SrcRng.Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row
End Function
Vậy tại cell B1 bạn sẽ gõ công thức:
=xlLastRow(A1:N100)
nếu muốn chỉ định chính xác vùng tìm kiếm là A1:N100
hoặc:
=xlLastRow() ---> sẽ ngầm hiểu là tìm trên UsedRange của ActiveSheet
Anh Ndu ơi, em test đoạn code trên, khi sử dụng công thức trong Excell thì nó hiểu và cho ra kết quả. Nhưng khi em đưa vào code của VBA thì bị báo lỗi. Không biết em đưa vào VBA như thế này đúng không.
Dim strLastRow As Integer
strLastRow = xlLastRow(NKPS!A:AT)
With Nhapchungtu
Sheets("NKPS").Cells(strLastRow + 1, 1).FillDown
Sheets("NKPS").Cells(strLastRow + 1, 2).FillDown
....
VBA báo lỗi ở dòng: strLastRow = xlLastRow(NKPS!A:AT)
Anh có thể cho em biết sai chỗ nào không?
 
Upvote 0
Anh Ndu ơi, em test đoạn code trên, khi sử dụng công thức trong Excell thì nó hiểu và cho ra kết quả. Nhưng khi em đưa vào code của VBA thì bị báo lỗi. Không biết em đưa vào VBA như thế này đúng không.
Dim strLastRow As Integer
strLastRow = xlLastRow(NKPS!A:AT)
With Nhapchungtu
Sheets("NKPS").Cells(strLastRow + 1, 1).FillDown
Sheets("NKPS").Cells(strLastRow + 1, 2).FillDown
....
VBA báo lỗi ở dòng: strLastRow = xlLastRow(NKPS!A:AT)
Anh có thể cho em biết sai chỗ nào không?
Vì bạn viết sai cú pháp thôi
Bạn viết:
strLastRow = xlLastRow(NKPS!A:AT)
Mà lý ra phải là:
strLastRow = xlLastRow(Sheets("NKPS").Range("A:AT"))
Hoặc:
strLastRow =
xlLastRow([NKPS!A:AT])
Lưu ý: Thể hiện 1 range theo kiểu NKPS!A:AT chỉ chấp nhận được khi bạn gõ công thức trên sheet... trong VBA mà viết vậy là sai hoàn toàn
 
Lần chỉnh sửa cuối:
Upvote 0
Sao không được bạn ơi, báo lỗi #Value!. Bạn xem lại file kèm theo giúp nhé.
Bạn có để ý dòng này không?

Function xlLastRow(Optional WorksheetName As String) As Long

Bạn khai báo tham số đưa vào là dạng chuỗi thì bạn phải nhập đúng chuỗi mới được. Đưa trực tiếp tên Sheet vào hàm thì phải đạt tên trong "". Cụ thể:

=xlLastRow("A")
 
Upvote 0
Bạn thử code này xem

Tìm trong toàn bộ bảng tính
PHP:
Function Dcuoi()
    On Error Resume Next
    Dcuoi = Cells.Find("*", , , , 1, 2).Row
End Function
Tìm trong vùng A1:N10
PHP:
Function Dcuoi2()
    On Error Resume Next
    Dcuoi2 = [a1:n10].Find("*", , , , 1, 2).Row
End Function
 

File đính kèm

Upvote 0
Bạn thử code này xem

Tìm trong toàn bộ bảng tính
PHP:
Function Dcuoi()
    On Error Resume Next
    Dcuoi = Cells.Find("*", , , , 1, 2).Row
End Function
Tìm trong vùng A1:N10
PHP:
Function Dcuoi2()
    On Error Resume Next
    Dcuoi2 = [a1:n10].Find("*", , , , 1, 2).Row
End Function
Code này cũng y chang code bài 8 thôi mà anh!
(mà code bài 8 còn tổng quát hơn nữa đấy)
 
Upvote 0
Đúng đấy, mình thấy code bài 8 của anh Ndu là hay nhất, có thể dùng bất kỳ yêu cầu gì và tìm dòng cuối cùng.
 
Upvote 0
Có thể dùng hàm để xác định dòng cuối cùng của cột, không cần dùng VBA
 
Upvote 0
code này cũng y chang code bài 8 thôi mà anh!
(mà code bài 8 còn tổng quát hơn nữa đấy)
ai chà... Cái vụ application.caller này hơi bị ngon à nha ... Cảm ơn nhiều lần...
Nhưng mà chưa được hiểu mấy (dù đã f1)
tôi để ý thấy rằng: Sau khi cho application.caller vào thì có thể bỏ luôn application.volatile nó vẫn cập nhật tốt
bạn có thể "diển nôm" sơ sơ về cái caller này tí được không?

@ ndu: mình chưa hiểu tác dụng của câu lệnh Application.Volatile trong code ? và cho mình hỏi luôn tác dụng của application.caller ?
Cho xin một file ví dụ (nếu spam thì chuyển qua topic khác). Mình đã xem một số bài của bạn có sử dụng hàm này nhưng chưa hiểu nó có tác dụng gì ?
 
Upvote 0
1. Application.Volatile
Appilcation.Volatile True hoặc Application.Volatile (mặc định True) để trên đầu function, thì hễ tham chiếu của hàm thay đổi, hàm sẽ tính lại
Application.Volatile False, ngược lại, không tính ngay, phải nhấn F9 hoặc phải dùng câu lệnh calculate mới tính

2. Appication.Caller: Xem thêm topic mới toanh này, hiểu ngay: http://www.giaiphapexcel.com/forum/...hấn-để-link-đến-các-sheet&p=245462#post245462
 
Upvote 0
Web KT

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

Back
Top Bottom