Code xác định cell cuối cùng có dử liệu (1 người xem)

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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,975
Ví dụ trong cột A có dử liệu tùy ý và được bố trí không theo 1 quy luật nào:
- Có thể có 1 vài cell chứa giá trị (chưa biêt trước được kiểu dử liệu)
- Có thể có 1 vài cell chứa công thức (chưa biêt trước được kiểu dử liệu)

Xin hỏi ta sẽ dùng code gì để xác định chính xác vị trí của cell cuối cùng có dử liệu?
Tôi thấy chúng ta thường hay dùng:
Range(Cell cuối cùng).End(xlUp)
Nhưng trong trường hợp cell cuối cùng (là cell A65536 đối với Excel 2003 và là cell A1048576 đối với Excel2007) có dử liệu thì code này sai
Vậy giãi pháp nào là đúng trong mọi trường hợp của dử liệu và mọi Version của Excel?
 
Vậy thì dùng Worksheet_Change để lưu lại vị trí cuối cùng đã thao tác là được chứ gì? Bác xem file này có đúng ko? Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ví dụ trong cột A có dử liệu tùy ý và được bố trí không theo 1 quy luật nào:
- Có thể có 1 vài cell chứa giá trị (chưa biêt trước được kiểu dử liệu)
- Có thể có 1 vài cell chứa công thức (chưa biêt trước được kiểu dử liệu)

Xin hỏi ta sẽ dùng code gì để xác định chính xác vị trí của cell cuối cùng có dử liệu?
Tôi thấy chúng ta thường hay dùng:
Nhưng trong trường hợp cell cuối cùng (là cell A65536 đối với Excel 2003 và là cell A1048576 đối với Excel2007) có dử liệu thì code này sai
Vậy giãi pháp nào là đúng trong mọi trường hợp của dử liệu và mọi Version của Excel?

Nếu worksheet chỉ có dữ liệu ở cột A, ta có thể dùng:
Range("A1").SpecialCells(xlLastCell).Select

Nếu dữ liệu nằm ở nhiều cột, nhưng cột A sẽ phải là cột chuẩn chứa dữ liệu thì ta có thể dùng kết hợp cách trên và hàm offset để xác định ô có dữ liệu cuối cùng ở cột A.
 
Upvote 0
Vậy thì dùng Worksheet_Change để lưu lại vị trí cuối cùng đã thao tác là được chứ gì?
Bác xem file này có đúng ko?
Thân.
Lở vị trí cuối cùng ta thao tác không phải là dòng cuối cùng thì sao? Ví dụ:
- Tôi nhập vào A5
- Nhập tiếp vào A7
- Nhập cuối cùng vào A1
???
-------------------
Nếu worksheet chỉ có dữ liệu ở cột A, ta có thể dùng:


Nếu dữ liệu nằm ở nhiều cột, nhưng cột A sẽ phải là cột chuẩn chứa dữ liệu thì ta có thể dùng kết hợp cách trên và hàm offset để xác định ô có dữ liệu cuối cùng ở cột A.
Cái này là tìm LastCell đã dùng ---> Trong trường hợp tôi gõ vào A65536 1 giá trị, sau đó tôi xóa đi thì từ thời điểm này LastCell luôn nằm ở dòng 65536 đấy
Cái tôi cần: Tìm cell cuối cùng có dử liệu chỉ trong cột A
 
Upvote 0
Lở vị trí cuối cùng ta thao tác không phải là dòng cuối cùng thì sao? Ví dụ: - Tôi nhập vào A5 - Nhập tiếp vào A7 - Nhập cuối cùng vào A1 ???
Thi bác nhập thử xem, phải là RngCuoiCung báo là địa chỉ ở A1 là cuối cùng đó sau? Nếu muốn giới hạn chỉ có cột A mới lưu vị tri cuối cùng thôi thì viết thêm 1 lệnh IF nữa là được.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then ActiveWorkbook.Names.Add Name:="RngCuoiCung", RefersToR1C1:=Target.Address(0, 0) End If End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Thi bác nhập thử xem, phải là RngCuoiCung báo là địa chỉ ở A1 là cuối cùng đó sau?
Nếu muốn giới hạn chỉ có cột A mới lưu vị tri cuối cùng thôi thì viết thêm 1 lệnh IF nữa là được.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
ActiveWorkbook.Names.Add Name:="RngCuoiCung", RefersToR1C1:=Target.Address(0, 0)
End If
End Sub
Thân.
Ah... ha... vậy là người nói 1 đàng, kẽ hiểu 1 nẻo rồi
CUỐI CÙNG ở đây là đang nói về KHÔNG GIAN chứ không phải THỜI GIAN
ví dụ:
- Tôi nhập vào A7
- Nhập tiếp vào A15
- Rồi nhập tiếp vào A1
vậy vị trí tôi cần tìm là cell A15 (tức cell nằm dưới cùng chứ không phải nhập lần cuối )

From Po_Pikachu :
Trời!
Vậy thì dùng lệnh này cũng được rồi, cần gì hỏi chi cho mệt vậy bác?

PHP:
 k = Range("A60000").End(xlUp).Address(0,0)

Thân.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Trời!
Vậy thì dùng lệnh này cũng được rồi, cần gì hỏi chi cho mệt vậy bác?
PHP:
k = Range("A60000").End(xlUp).Address(0,0)
Thân.
Anh ndu muốn xài công thức đúng cho cả excel 2003 và Excel 2007 luôn cơ! Với lại nếu dữ liệu tại ô A65536 thì k = Range("A60000").End(xlUp).Address(0,0)không cỏn đúng nữa.

@ ndu:
Vậy anh thêm If vào được không, đại khái như sau:
PHP:
Function FindLastRng() As String
Application.Volatile
Dim RngTarget As Range
''Mượn tạm cột B:
Set RngTarget = Sheets("Sheet1").[B1].End(xlDown).Offset(, -1)
If RngTarget <> "" Then
    FindLastRng = RngTarget.Address
Else
    FindLastRng = RngTarget.End(xlUp).Address
End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Lở vị trí cuối cùng ta thao tác không phải là dòng cuối cùng thì sao? Ví dụ:
- Tôi nhập vào A5
- Nhập tiếp vào A7
- Nhập cuối cùng vào A1
???
-------------------

Cái này là tìm LastCell đã dùng ---> Trong trường hợp tôi gõ vào A65536 1 giá trị, sau đó tôi xóa đi thì từ thời điểm này LastCell luôn nằm ở dòng 65536 đấy
Cái tôi cần: Tìm cell cuối cùng có dử liệu chỉ trong cột A

Dùng phương thức Find thôi bác ạ:
Tìm trong cột A:

PHP:
Function LastCell() As String
    On Error Resume Next
    LastCell = ActiveSheet.Columns("A:A").Find(What:="*", _
                  SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Address
End Function
Nếu muốn mở rộng thì có thể tham khảo UDF của hoangdanh.

Chúc vui.
 
Upvote 0
Không biết kết hợp dòng cuối để quét lên không biết dùng được không nhỉ?
PHP:
Sub thu() k = Range("A" & Range("A1").SpecialCells(xlLastCell).Row + 1).End(xlUp).Address(0, 0) MsgBox (k) End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Xem ra cũng nhiều cách nhỉ.
Thêm 1 củ chuối, anh ndu tham khảo :
PHP:
    Columns("A:A").Select
    with Selection
           .AutoFilter
           .AutoFilter Field:=1, Criteria1:="<>"
           .End(xlDown).Select
    end with
TDN
 
Upvote 0
Dùng phương thức Find thôi bác ạ:
Tìm trong cột A:

PHP:
Function LastCell() As String
    On Error Resume Next
    LastCell = ActiveSheet.Columns("A:A").Find(What:="*", _
                  SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Address
End Function
Nếu muốn mở rộng thì có thể tham khảo UDF của hoangdanh.

Chúc vui.

Lệnh Hồ đại ca xuất chiêu có khác! Đa tạ Lệnh Hồ đại ca đã nhắc nhở tiểu đệ vể phương thức Find này (đệ cũng đang mày mò). Be Be.
 
Upvote 0
Với cách của Ca_dafi thì:
-Lở như tại dòng cuối A65536 tôi có công thức:
thì sao ta?
???
Cách của Po_picachu :
- Lở tại cell cuối cùng cũng đang có dử liệu thì sao ----> SpecialCells(xlLastCell).Row + 1 sẽ trật lất

Xem ra cũng nhiều cách nhỉ.
Thêm 1 củ chuối, anh ndu thao khảo :
PHP:
    Columns("A:A").Select
    with Selection
           .AutoFilter
           .AutoFilter Field:=1, Criteria1:="<>"
           .End(xlDown).Select
    end with
TDN
Cách này cũng sai luôn trong trường hợp:
 
Upvote 0
Với cách của Ca_dafiLệnh Hồ Xung thì:
-Lở như tại dòng cuối A65536 tôi có công thức:
A65536 =IF(B65536="","",1)
thì sao ta?
Không biết còn "lở" chỗ nào nữa không? --=0

PHP:
Function FindLastRng() As String
Application.Volatile
Dim RngTarget As Range
Set RngTarget = Sheets("Sheet1").[B1].End(xlDown).Offset(, -1)
If RngTarget <> "" Or RngTarget.HasFormula Then   ''//Kiểm tra thêm ô cuối có công thức hôn?
    FindLastRng = RngTarget.Address
Else
    FindLastRng = RngTarget.End(xlUp).Address
End If
End Function
 
Upvote 0
Không biết còn "lở" chỗ nào nữa không? --=0

PHP:
Function FindLastRng() As String
Application.Volatile
Dim RngTarget As Range
Set RngTarget = Sheets("Sheet1").[B1].End(xlDown).Offset(, -1)
If RngTarget <> "" Or RngTarget.HasFormula Then   ''//Kiểm tra thêm ô cuối có công thức hôn?
    FindLastRng = RngTarget.Address
Else
    FindLastRng = RngTarget.End(xlUp).Address
End If
End Function
Vẩn còn... "lở"
Lở như công thức tại cell cuối trả về là #NAME? thì sao?
Ẹc... Ẹc...
Tạm thời đến thời điểm này thì cách của Lệnh Hồ Xung đại hiệp đúng nhất
(hồi này tôi test nhầm---> Sorry)
 
Upvote 0
Tôi có xào lại cái code này của
'David Chazin -- September 1999.
'Returns the Address (e.g. "$AW$235") of the cell at the
' bottom-right corner of the used area of the currently
' selected worksheet. Returns "" if the worksheet is empty.
' Thanks to Dave Braden for the idea of trapping for an
' empty worksheet. (This is not the way he would implement
' it, but the idea itself is his).
Code như sau:
Cú pháp: LastRow(Tên cột kiểu text): LastRow("X")...
PHP:
Function LastRow(sCol As String) As String
On Error GoTo LastRow_ErrorHandler
If Range(sCol & "1").SpecialCells(xlLastCell).Value <> "" Then
  LastRow = Range(sCol & "1").SpecialCells(xlLastCell).Row
Else
  LastRow = _
  Columns(sCol).Find("*", Range(sCol & "1").SpecialCells(xlLastCell), , , _
    xlByColumns, xlPrevious).Row
End If
Exit Function
LastRow_ErrorHandler:
  If Err.Number = 91 Then
    'If the worksheet is empty....'
     LastRow = ""
  Else
    Call MsgBox("Error #" & Err.Number & " was generated by " & _
     Err.Source & ": " & Err.Description, vbOKOnly + vbExclamation, _
     "LastRow()", Err.HelpFile, Err.HelpContext)
  End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Lục lạo một hồi, em tìm được File LastCell hay quá.
Nguồn từ : Aaron T. Blood (www.XL-Logic.com)

Mời anh xem thử
TDN
 

File đính kèm

Upvote 0
Tôi có xào lại cái code này của
Code như sau:
Cú pháp: LastRow(Tên cột kiểu text): LastRow("X")...
PHP:
Function LastRow(sCol As String) As String
On Error GoTo LastRow_ErrorHandler
If Range(sCol & "1").SpecialCells(xlLastCell).Value <> "" Then
  LastRow = Range(sCol & "1").SpecialCells(xlLastCell).Row
Else
  LastRow = _
  Columns(sCol).Find("*", Range(sCol & "1").SpecialCells(xlLastCell), , , _
    xlByColumns, xlPrevious).Row
End If
Exit Function
LastRow_ErrorHandler:
  If Err.Number = 91 Then
    'If the worksheet is empty....'
     LastRow = ""
  Else
    Call MsgBox("Error #" & Err.Number & " was generated by " & _
     Err.Source & ": " & Err.Description, vbOKOnly + vbExclamation, _
     "LastRow()", Err.HelpFile, Err.HelpContext)
  End If
End Function
ThuNghi có thể đưa file đính kèm lên được không? Tôi test thấy bị sai rất nhiều chổ mà chưa biết nên sửa thế nào!
------------------------
Bây giờ nâng cấp lên 1 chút: Tìm cell cuối cùng có dử liệu, trong đó dử liệu là tùy ý, tính luôn cả Comment
 
Upvote 0
Cách của Po_picachu : - Lở tại cell cuối cùng cũng đang có dử liệu thì sao ----> SpecialCells(xlLastCell).Row + 1 sẽ trật lất
Thì bổ sung lệnh điều kiện vào.
PHP:
Sub thu() On Error Resume Next k = Range("A" & Range("A1").SpecialCells(xlLastCell).Row + 1).End(xlUp).Address(0, 0) If Err.Number  0 Then k = "A" & Range("A1").SpecialCells(xlLastCell).Row End If MsgBox (k) End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cũng có 1 code (dự phòng) nhưng vẩn chưa tính được trường hợp có Comment:
PHP:
Sub LastCell()
 Dim Rng As Range, Cot As Range, k As Boolean
 Set Cot = Application.InputBox(Prompt:="Hay chon 1 cell bat ky", Type:=8)
 Set Rng = Cells(Cells.Rows.Count, Cot.Column)
 k = IsEmpty(Rng)
 Cells(-k * Rng.End(xlUp).Row - (Not (k)) * Rng.Row, Rng.Column).Select
End Sub
Nhờ các bạn Test dùm xem có chổ nào không ổn
 
Upvote 0
Ví dụ trong cột A có dử liệu tùy ý và được bố trí không theo 1 quy luật nào:
- Có thể có 1 vài cell chứa giá trị (chưa biêt trước được kiểu dử liệu)
- Có thể có 1 vài cell chứa công thức (chưa biêt trước được kiểu dử liệu)

Xin hỏi ta sẽ dùng code gì để xác định chính xác vị trí của cell cuối cùng có dử liệu?
Tôi thấy chúng ta thường hay dùng:
Mã:
Range(Cell cuối cùng).End(xlUp)
Nhưng trong trường hợp cell cuối cùng (là cell A65536 đối với Excel 2003 và là cell A1048576 đối với Excel2007) có dử liệu thì code này sai
Vậy giãi pháp nào là đúng trong mọi trường hợp của dử liệu và mọi Version của Excel?
Trong câu này Range(Cell cuối cùng).End(xlUp) không đúng với mọi Version của Excel vì bạn đã nhập 1 số cụ thể. Thay nó bằng Cells.Rows.Count để ra kết quả tổng số dòng có trong sheet.
Cells.Rows.Count =65536 (Excel 2003)
Cells.Rows.Count =1048576 (Excel 2007)

Code chọn ô cuối cùng của cột A (cột 1)
Mã:
Cells(Cells.Rows.Count, 1).End(xlUp).Select
 
Upvote 0
Thì bổ sung lệnh điều kiện vào.
PHP:
Sub thu()
On Error Resume Next
k = Range("A" & Range("A1").SpecialCells(xlLastCell).Row + 1).End(xlUp).Address(0, 0)
If Err.Number <> 0 Then
k = "A" & Range("A1").SpecialCells(xlLastCell).Row
End If
MsgBox (k)
End Sub
Thân.
Trong code mà dùng SpecialCells(xlLastCell) là không ồn đâu. Vì code này tìm cell cuối đã dùng...
Trong trường hợp bạn nhập vào A65536 cái gì đó, xong lại xóa đi thì nó vẩn xem LastCell là A65536

Trong câu này Range(Cell cuối cùng).End(xlUp) không đúng với mọi Version của Excel vì bạn đã nhập 1 số cụ thể. Thay nó bằng Cells.Rows.Count để ra kết quả tổng số dòng có trong sheet.
Cells.Rows.Count =65536 (Excel 2003)
Cells.Rows.Count =1048576 (Excel 2007)

Code chọn ô cuối cùng của cột A (cột 1)
Mã:
Cells(Cells.Rows.Count, 1).End(xlUp).Select
Nhưng code này vẩn không đúng khi cell cuối có dử liệu thầy ơi
 
Upvote 0
Code của thầy PhamDuyLong chạy được đấy chứ! Chỉ có trường hợp cel cuối cùng có dữ liệu cần phải xét lại thôi. Bác dùng thử xem có đúng ý không?
PHP:
Sub thu() If Cells(Cells.Rows.Count, 1).Value  "" Then k = Cells(Cells.Rows.Count, 1).Address(0, 0) Else k = Cells(Cells.Rows.Count, 1).End(xlUp).Address(0, 0) End If MsgBox (k) End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Code của thầy PhamDuyLong chạy được đấy chứ!
Chỉ có trường hợp cel cuối cùng có dữ liệu cần phải xét lại thôi.
Bác dùng thử xem có đúng ý không?
PHP:
Sub thu()
If Cells(Cells.Rows.Count, 1).Value <> "" Then
k = Cells(Cells.Rows.Count, 1).Address(0, 0)
Else
k = Cells(Cells.Rows.Count, 1).End(xlUp).Address(0, 0)
End If
MsgBox (k)
End Sub
Thân.
Vẩn sai ở 2 trường hợp:

A65536 có giá trị lổi

Tôi thấy code dùng UsedRange này rất hay:
PHP:
Sub Test()
  k = Sheet1.UsedRange.Rows.Count
  MsgBox (k)
End Sub
Code này tìm được cả sự tồn tại của Comment... Đáng tiếc UsedRange lại phụ thuộc vào toàn bộ dử liệu trên bảng tính chứ không riêng gì cột A nên trong trường hợp ta có dử liệu ở những cột khác thì code có thể sai
 
Upvote 0
Tại bác đưa ra yêu cầu quá cao nên mới thấy quá khó? Còn UsedRange này sao không chính xác gì hết. Em test dữ liệu có ở A65531:C65534 mà sao nó cứ báo là 6 không là sao? Đây là code thêm vào việc xác định hàm.
PHP:
Sub thu() On Error Resume Next If Cells(Cells.Rows.Count, 1).Value  "" Or  _       Cells(Cells.Rows.Count, 1).HasFormula = True Then      k = Cells(Cells.Rows.Count, 1).Address(0, 0) Else      k = Cells(Cells.Rows.Count, 1).End(xlUp).Address(0, 0) End If MsgBox (k) End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Tại bác đưa ra yêu cầu quá cao nên mới thấy quá khó?
Còn UsedRange này sao không chính xác gì hết. Em test dữ liệu có ở A65531:C65534 mà sao nó cứ báo là 6 không là sao?
Đây là code thêm vào việc xác định hàm.
PHP:
Sub thu()
On Error Resume Next
If Cells(Cells.Rows.Count, 1).Value <> "" Or _
      Cells(Cells.Rows.Count, 1).HasFormula = True Then
      k = Cells(Cells.Rows.Count, 1).Address(0, 0)
Else
      k = Cells(Cells.Rows.Count, 1).End(xlUp).Address(0, 0)
End If
MsgBox (k)
End Sub
Thân.
Code này thì được!
Thật ra với thuật toán trên:
-Xem cell cuối có dử liệu hay không
-Xem cell cuối có công thức hay không?
===> Cả 2 cái này có thể kết hợp thành 1 = IsEmpty(....) là xong
Tuy nhiên vẩn còn 1 vướng mắc như tôi đã nói hồi nãy: Chưa tìm được cell có Comment <--- Khó thật
---------------
Còn cái UsedRange sở dỉ sai là vì tôi gõ code bị nhầm, đúng ra phải là:
PHP:
Sub Test()
  k = Sheet1.UsedRange.Rows.Count + Sheet1.UsedRange.Row - 1
  MsgBox (k)
End Sub
Xem thử, nó biết được sự tồn tại của Comment luôn đấy
 
Lần chỉnh sửa cuối:
Upvote 0
Có vẻ như vẫn chưa được vừa ý nhỉ?
1225607695.jpg
Còn vấn đề Comment xem ra đau đầu đây! Ko biết có cách nào xác định ô đó có comment hay ko nhỉ? Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Có vẻ như vẫn chưa được vừa ý nhỉ?
1225607695.jpg

.
Thì như tôi đã nói ở trên: Dùng UsedRange rất hay, nhưng đáng tiếc là ta không có cách nào cô lập để nó hiểu là ta đang tìm trong 1 cột nào đó... Nếu dử liệu chỉ có 1 cột thì OK
Ở đây nó tìm tất tần tật các cột đang có dử liệu, cứ cell nào có dử liệu mà có số dòng lớn nhất thì nó lấy <--- Tiếc là tiếc chổ này đây (nếu không thì code quá gọn rồi)
 
Upvote 0
ThuNghi có thể đưa file đính kèm lên được không? Tôi test thấy bị sai rất nhiều chổ mà chưa biết nên sửa thế nào!
------------------------
Bây giờ nâng cấp lên 1 chút: Tìm cell cuối cùng có dử liệu, trong đó dử liệu là tùy ý, tính luôn cả Comment

Hơi dài dòng một xíu bác ạ :

PHP:
Function LastCell() As String
    On Error Resume Next
    Dim rV As Long, rC As Long, rF As Long
    rV = ActiveSheet.Columns("A:A").Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlComments).Row
    rC = ActiveSheet.Columns("A:A").Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlValue).Row
    rF = ActiveSheet.Columns("A:A").Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlFormulas).Row
    LastCell = "A" & WorksheetFunction.Max(rV, rC, rF)
    
End Function
Chúc vui
 
Upvote 0
Bạn Lệnh Hồ Đại Hiệp ơi, mình test lại thấy có thể bỏ bớt dòng lệnh Value được đó. Bạn thử xem.
PHP:
Function LastCell() As String     On Error Resume Next     Dim rV As Long, rC As Long, rF As Long     rV = ActiveSheet.Columns("A:A").Find(What:="*", SearchDirection:=xlPrevious, _           SearchOrder:=xlByColumns, LookIn:=xlComments).Row              rF = ActiveSheet.Columns("A:A").Find(What:="*", _          SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlFormulas).Row     LastCell = "A" & WorksheetFunction.Max(rV, rF) End Function
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Hơi dài dòng một xíu bác ạ :

PHP:
Function LastCell() As String
    On Error Resume Next
    Dim rV As Long, rC As Long, rF As Long
    rV = ActiveSheet.Columns("A:A").Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlComments).Row
    rC = ActiveSheet.Columns("A:A").Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlValue).Row
    rF = ActiveSheet.Columns("A:A").Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlFormulas).Row
    LastCell = "A" & WorksheetFunction.Max(rV, rC, rF)
    
End Function
Chúc vui
Rất hay!
Sáng nay tôi cũng làm theo cách này nhưng báo lổi khi cột A không chứa Comments... Nó báo lổi tại dòng:
ActiveSheet.Columns("A:A").Find(What:="*", _
SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlComments)
Cũng hợp lý vì hỏng có Comment lấy đâu mà xác định ... thế mà bây giờ copy code này vào bảng tính lại không có vấn đề
Vậy để tùy biến hơn tôi sửa code lại 1 chút:
PHP:
Function LastCell(Vung As Range) As String
    On Error Resume Next
    Application.Volatile
    Dim rV As Long, rC As Long, rF As Long
    rC = Vung.Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlComments).Row
    rV = Vung.Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlValue).Row
    rF = Vung.Find(What:="*", _
           SearchDirection:=xlPrevious, SearchOrder:=xlByColumns, LookIn:=xlFormulas).Row
    LastCell = Cells(WorksheetFunction.Max(rC, rV, rF), Vung.Column).Address   
End Function
Cảm ơn Lệnh Hồ Xung Đại Hiệp rất nhiều vì code xác định LastCell tưởng đơn giãn nhưng xem ra chẳng đơn giãn tí nào
(Chúc Đại Hiệp mau hết.. bệnh và lệnh thành bí kiếp võ công... Ẹc... Ẹc...)
 
Upvote 0
Nếu ta nhập từ khóa 'Last cells' vô ô tìm kiếm, sẽ bớt đi 1 số bài rồi không!
chẳng hạng:
http://www.giaiphapexcel.com/forum/showthread.php?t=1641#10
Sư phụ ơi xem lại bài #1 của em đi... Giãi pháp trong link mà sư phụ cho em có biết, nhưng đâu có giãi quyết được vấn đề em nêu chứ
Em không phải tìm LastCell của cả bảng tính mà tìm LastCell trong 1 cột được chỉ định trước (nếu không thì em dùng UsedRange rồi, cần gì phải rắc rối)
 
Upvote 0
Em nghĩ có thể dùng vòng lặp (for each ... next hoặc for ... next) duyệt qua từng ô trong cột. Trong quá trình lặp, ta có thể xác định được ô chứa dữ liệu bằng cách gán lại địa chỉ ô (Set Diachicuoi = ....), nếu ô đó không chứa thì có thể bỏ qua.
Cuối cùng ta vẫn xác định được địa chỉ ô cuối cùng chứa dữ liệu (Msgbox Diachicuoi.Addess).
 
Upvote 0
Em nghĩ có thể dùng vòng lặp (for each ... next hoặc for ... next) duyệt qua từng ô trong cột. Trong quá trình lặp, ta có thể xác định được ô chứa dữ liệu bằng cách gán lại địa chỉ ô (Set Diachicuoi = ....), nếu ô đó không chứa thì có thể bỏ qua.
Cuối cùng ta vẫn xác định được địa chỉ ô cuối cùng chứa dữ liệu (Msgbox Diachicuoi.Addess).
Cái này đương nhiên, nhưng ở đây tôi muốn tính tới tốc độ xử lý nữa! Với Excel2007 mà duyệt từ A1 đến A... chắc đuối luôn thầy ơi
Giãi pháp thì có rất nhiều, nhưng cái nào hay nhất và nhanh nhất thì ta xài
 
Upvote 0
Nhân chủ đề này tôi cũng chia sẽ cách tìm ô cuối cùng dữ vào SpecialCells như sauL

[GPECODE=vb]
Sub LastCell()
Dim rng As Range
Dim LastRow As Long
With ActiveSheet
Set rng = .UsedRange
LastRow = .Cells.SpecialCells(xlCellTypeLastCell).Row
MsgBox LastRow
End With
End Sub


[/GPECODE]
 
Upvote 0
Em có viết code xác định cell cuối có dữ liệu, nhưng bị báo lỗi
Mã:
Sub thu()

If Cells(Cells.Rows.Count, 1).Resize(, 13).Value = "" Then Cells(Cells.Rows.Count, 1).Resize(, 13) = 0
End Sub
Mục đích của em như sau:
Từ dòng "Cộng", xê dịch đến cột M, cụ thể hiện nay là cell M21
Nếu cell M21 này trống thì điền vào cell M21 giá trị bằng 0 (nếu khác trống thì không điền gì hết)
Nhờ anh/chị sửa code giúp
Xin cảm ơn!
 

File đính kèm

Upvote 0
Em có viết code xác định cell cuối có dữ liệu, nhưng bị báo lỗi
Mã:
Sub thu()

If Cells(Cells.Rows.Count, 1).Resize(, 13).Value = "" Then Cells(Cells.Rows.Count, 1).Resize(, 13) = 0
End Sub
Mục đích của em như sau:
Từ dòng "Cộng", xê dịch đến cột M, cụ thể hiện nay là cell M21
Nếu cell M21 này trống thì điền vào cell M21 giá trị bằng 0 (nếu khác trống thì không điền gì hết)
Nhờ anh/chị sửa code giúp
Xin cảm ơn!
PHP:
Option Explicit

Sub thu()
Dim lRcotA As Long
'Dòng cuối cùng có dữ liệu ở cột A (từ dưới lên):
lRcotA = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
Dim cll As Range
'Ô ở cột M cùng dòng với lRcotA:
Set cll = Sheet1.Range("M" & lRcotA)
If cll = Empty Then cll = 0
End Sub
 
Upvote 0
PHP:
Option Explicit

Sub thu()
Dim lRcotA As Long
'Dòng cuối cùng có dữ liệu ở cột A (từ dưới lên):
lRcotA = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
Dim cll As Range
'Ô ở cột M cùng dòng với lRcotA:
Set cll = Sheet1.Range("M" & lRcotA)
If cll = Empty Then cll = 0
End Sub
Cám ơn bạn,
Có cách nào thay đổi Sheet1 thành cái gì đó không. Vì mình có thể chạy code ở bất kỳ sheet nào
 
Upvote 0
Cám ơn bạn,
Có cách nào thay đổi Sheet1 thành cái gì đó không. Vì mình có thể chạy code ở bất kỳ sheet nào
Chỗ nào là "Sheet1" sửa thành "Activesheet"

Hoặc:
PHP:
Sub thu()
Dim cll As Range
Set cll = Range("M" & Range("A65000").End(xlUp).Row)
If cll = Empty Then cll = 0
End Sub
 
Upvote 0
Em có viết code xác định cell cuối có dữ liệu, nhưng bị báo lỗi
Mã:
Sub thu()
If Cells(Cells.Rows.Count, 1).Resize(, 13).Value = "" Then Cells(Cells.Rows.Count, 1).Resize(, 13) = 0
End Sub
Mục đích như sau:
Từ dòng "Cộng", xê dịch đến cột M, cụ thể hiện nay là cell M21
Nếu cell M21 này trống thì điền vào cell M21 giá trị bằng 0 (nếu khác trống thì không điền gì hết)
Nhờ anh/chị sửa code giúp

Thứ nhất: Bạn không thể xài phương thức Resize được; Thay vì vậy ta chỉ có thể xài Offset( ,13)
Thứ hai: Nếu dịch sang tiếng Việt, câu lệnh trên sẽ là:

Nếu ô cuối thuộc cột [A:A] của trang tính, mở rọng về phía phải 13 ô là rỗng thì các ô này nhận trị là 0

Ở đây bạn có thể gặp 2 bất trắc trong tương lai mà không ngờ.
Điều này bạn có thể làm thực nghiệm để tự chiêm nghiệm;

Thứ ba: Nên xài phương thức FIND() để tìm từ "Cộng" này ở cột [A:A] là chắc như bắp;
Trong trường hợp trong cột [A:A] có thể có nhiều từ hay cụm từ 'Cộng', thì :
A./ Thử ô cuối cột [A:A] có phải là từ này hay không
Nếu đúng thì không còn gì để nói & tiếp sang câu lệnh cuối;
Nếu không thì xài phương thức End(xlUp) để xác đinh dòng (ô) cuối có dữ liệu thuộc cột [A:a] có phải từ này hay không
Nếu phải thì tiếp sang câu lệnh cuối
Nếu chưa phải thì phải xài FIND() để tìm cho ra từ 'Cộng' cuối dòng thuộc cột [A:A]
& Dòng lệnh cuối là gán trị vô ô M dòng cuối là cái gì đó;
 
Upvote 0
Cũng không tới mức độ phải dùng phương thức Find đâu. Mọi người tham khảo video sau xem có khả thi không?
 

File đính kèm

Upvote 0

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

Back
Top Bottom