Tìm đến dòng cuối cột D trong bảng tính (vừa chứa dữ liệu nhập tay vừa chứa dữ liệu là kết quả của công thức)

Liên hệ QC

Nguyễn Hồng Quang

Thành viên GPE Hà Nội
Tham gia
8/6/07
Bài viết
1,203
Được thích
876
Giới tính
Nam
Nghề nghiệp
Kế toán
Em muốn tìm đến dòng cuối của cột D trong bảng tính của sheet SQ; bảng tính vừa có dữ liệu nhập tay vừa có dữ liệu là kết quá của công thức.
Nếu dùng phương thức thông thường là
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
thì sẽ không ra
Tạm thời em đang làm bằng đặt công thức ở cột phụ và dựa vào đó để tìm nhưng hơi chậm và cũng dễ nhầm lẫn
Em muốn hỏi có cách nào không dùng đến cột phụ mà vẫn đi đến được dòng cuối có dữ liệu ở cột D sheet SQ không ạ
 

File đính kèm

  • Tim den hang cuoi cua cot-vr2.xlsm
    164.9 KB · Đọc: 17
PHP:
Function LastCell(StWs As String, Optional Opt As Byte = 0) As Variant
Dim LastRowCell As Long, LastColCell As Long
On Error Resume Next
With Sheets(StWs)
LastRowCell = .Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
LastColCell = .Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Column
Select Case Opt
    Case 0: LastCell = StWs & "!" & .Cells(LastRowCell, LastColCell).Address
    Case 1: LastCell = LastRowCell
    Case 2: LastCell = LastColCell
End Select
End With
End Function
 
Upvote 0
PHP:
Function LastCell(StWs As String, Optional Opt As Byte = 0) As Variant
Dim LastRowCell As Long, LastColCell As Long
On Error Resume Next
With Sheets(StWs)
LastRowCell = .Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
LastColCell = .Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Column
Select Case Opt
    Case 0: LastCell = StWs & "!" & .Cells(LastRowCell, LastColCell).Address
    Case 1: LastCell = LastRowCell
    Case 2: LastCell = LastColCell
End Select
End With
End Function
Chưa được anh SA_DQ ơi!. Em chạy hàm của anh
Mã:
Cells(LastCell("SQ", 1), 4).Select
nó cho ra kết quả là dòng D260 anh à
Em muốn nó dừng ở D30 thôi
Anh xem file em gửi kèm nhé
 

File đính kèm

  • Tim den hang cuoi cua cot-vr2.xlsm
    155.8 KB · Đọc: 7
Upvote 0
[Tên trang tính sao có cái dài đến thế!]
Tại trang 'SQ' của bạn có công thức đến dòng 260, nên hàm trả về chỉ số 261 là đúng rồi còn gì
Nếu bạn muốn nó trả về 31 (Là dòng trống đầu tiên thuộc cột 'D' có dữ liệu trống thì phải tìm gián tiếp ngay tại cột 'A' của trang kia
Nội dung hàm có thể ngắn gọn lại như sau:
PHP:
Function DlCells(ShName As String, Optional Col As String = "D") As Long
 Dim Rng As Range, sRng As Range
 With Sheets(ShName)
    Set Rng = .Cells(Rows.Count, Col).End(xlUp)
    If Not Rng Is Nothing Then DlCells = Rng.Row + 1
 End With
End Function
Lúc đó cú pháp hàm sẽ phải là
?dlcells("tong hop PT PC","A") (trong cửa sổ Immediate)
Còn muốn nó trả về 31 thì bạn cộng thêm sự chênh lệnh công thức giữa các dòng của cột 'D' của trang 'SQ' & cột 'A' của trang kia!
 
Upvote 0
Em muốn tìm đến dòng cuối của cột D trong bảng tính của sheet SQ; bảng tính vừa có dữ liệu nhập tay vừa có dữ liệu là kết quá của công thức.
Nếu dùng phương thức thông thường là
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
thì sẽ không ra
Tạm thời em đang làm bằng đặt công thức ở cột phụ và dựa vào đó để tìm nhưng hơi chậm và cũng dễ nhầm lẫn
Em muốn hỏi có cách nào không dùng đến cột phụ mà vẫn đi đến được dòng cuối có dữ liệu ở cột D sheet SQ không ạ
Cách 1 làm tương tự cột phụ, cách 2 ổn hơn một chút
Mã:
Sub ABC1()
  Dim LastRow As Long
  With Sheets("SQ")
    LastRow = .Range("D" & .Rows.Count).End(xlUp).Row
    For i = 32 To 1 Step -1
      If TypeName(Range("D" & i).Value) = "String" Then
        LastRow = i + 1: Exit For
      End If
    Next i
  End With
  MsgBox (LastRow)
End Sub

Sub ABC2()
  Dim LastRow As Long
  With Sheets("SQ")
    LastRow = .Range("D" & .Rows.Count).End(xlUp).Row
    For i = LastRow To 1 Step -1
      If Range("D" & i).Value <> 0 And Len(Range("D" & i).Value) > 0 Then
        LastRow = i + 1: Exit For
      End If
    Next i
  End With
  MsgBox (LastRow)
End Sub
 
Upvote 0
Cách 1 làm tương tự cột phụ, cách 2 ổn hơn một chút
Mã:
Sub ABC1()
  Dim LastRow As Long
  With Sheets("SQ")
    LastRow = .Range("D" & .Rows.Count).End(xlUp).Row
    For i = 32 To 1 Step -1
      If TypeName(Range("D" & i).Value) = "String" Then
        LastRow = i + 1: Exit For
      End If
    Next i
  End With
  MsgBox (LastRow)
End Sub

Sub ABC2()
  Dim LastRow As Long
  With Sheets("SQ")
    LastRow = .Range("D" & .Rows.Count).End(xlUp).Row
    For i = LastRow To 1 Step -1
      If Range("D" & i).Value <> 0 And Len(Range("D" & i).Value) > 0 Then
        LastRow = i + 1: Exit For
      End If
    Next i
  End With
  MsgBox (LastRow)
End Sub
Cảm ơn anh cả hai đoạn code của anh đều ra đúng rồi ạ. Riêng cái dòng 5 của sub ABC1(), em chưa hiểu ý của anh đang để là For i = 32 to 1 step -1 nếu đổi thành For i = LastRow to 1 step -1 thì nó bao quát hơn phải không anh
Bài đã được tự động gộp:

[Tên trang tính sao có cái dài đến thế!]
Tại trang 'SQ' của bạn có công thức đến dòng 260, nên hàm trả về chỉ số 261 là đúng rồi còn gì
Nếu bạn muốn nó trả về 31 (Là dòng trống đầu tiên thuộc cột 'D' có dữ liệu trống thì phải tìm gián tiếp ngay tại cột 'A' của trang kia
Nội dung hàm có thể ngắn gọn lại như sau:
PHP:
Function DlCells(ShName As String, Optional Col As String = "D") As Long
Dim Rng As Range, sRng As Range
With Sheets(ShName)
    Set Rng = .Cells(Rows.Count, Col).End(xlUp)
    If Not Rng Is Nothing Then DlCells = Rng.Row + 1
End With
End Function
Lúc đó cú pháp hàm sẽ phải là
?dlcells("tong hop PT PC","A") (trong cửa sổ Immediate)
Còn muốn nó trả về 31 thì bạn cộng thêm sự chênh lệnh công thức giữa các dòng của cột 'D' của trang 'SQ' & cột 'A' của trang kia!
Cảm ơn góp ý của anh
 
Upvote 0
Cảm ơn anh cả hai đoạn code của anh đều ra đúng rồi ạ. Riêng cái dòng 5 của sub ABC1(), em chưa hiểu ý của anh đang để là For i = 32 to 1 step -1 nếu đổi thành For i = LastRow to 1 step -1 thì nó bao quát hơn phải không anh
Bài đã được tự động gộp:


Cảm ơn góp ý của anh
Mình test thử rồi quên chỉnh code lại: For i = LastRow to 1 step -1
 
Upvote 0
Web KT
Back
Top Bottom