Hỏi về thuộc tính End()

Liên hệ QC

minhsondaklak

Thành viên mới
Tham gia
21/11/07
Bài viết
29
Được thích
41
Nhờ các Huynh chỉ giúp thuộc tính End() của Range cho ta cái gì vậy?
 
Tôi nghĩ bạn có thể xem help. Trong khi chờ đợi sách phần 2 của bác phantuhuong, bác nào có thể trả lời giúp minhsondaklak, tôi không rành tiếng Anh nhiều nên không dám dịch từ help.
 
Upvote 0
???

Mình không rành English Chibi à,
Cũng đã đọc qua ví dụ mẫu (của Digita thì phải) rồi mà chưa hiểu .End() nó làm gì, thế mới khổ,
Hay nhờ Digita giúp hộ tui đi, tui cám ơn!
 
Upvote 0
Theo mình hiểu nôm na là End() trả về vùng cuối cùng có dữ liệu tính từ range (Theo hướng nào thì phụ thuộc vào tham số của End)
 
Upvote 0
Đúng rồi Range(<...>).End(<...>) sẽ dịch chuyển đến vị trí cuối cùng theo hướng :
+ xuống dưới nếu tham số <...> là xldown
+ lên trên nếu tham số <...> là xlup
+ trái nếu tham số <...> là xltoleft
+ phải nếu tham số <...> là xltoright


Sau đây là 1 số ví dụ minh họa đơn giản sau:

'Find the last used cell, before a blank in a Column:
'Tìm ô cuối có giá trị, - là ô trước ngay gặp ô trắng (ô kế dưới) của cột

Sub LastCellBeforeBlankInColumn()
Range("A1").End(xldown).Select
End Sub


'Find the very last used cell in a Column:'Tìm ô cuối có giá trị của cột
Sub LastCellInColumn()
Range("A65536").End(xlup).Select
End Sub

'Find the last cell, before a blank in a Row:
'Tìm ô cuối có giá trị, trước khi gặp ô trắng (ô kế dưới) của hàng
Sub LastCellBeforeBlankInRow()
Range("A1").End(xlToRight).Select
End Sub

'Find the very last used cell in a Row:
'Tìm ô cuối có giá trị của Hàng
Sub LastCellInRow()
Range("IV1").End(xlToLeft).Select
End Sub



'Đây là ví dụ mở rộng tìm ô cuối có giá trị của sheet

'Find the very last used cell on a Worksheet:
'Tìm ô cuối có giá trị của Sheet
Sub Demo()
Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Select
End Sub

'
sưu tầm code từ Internet _ giải thích vietnamese là viết thêm bởi tigertiger
 
Lần chỉnh sửa cuối:
Upvote 0
Lời cám ơn !

Xin cám ơn các Huynh !
Theo chỉ dẫn của các Huynh, mình đã thử lại và ghi nhận như sau:
Giã sử trên Sheet có nhập 3 vùng dữ liệu rời rạc, gồm: A5:A10 , A15:A16 và C20:C21

'Ô dưới cùng - có dữ liệu, thuộc vùng (liên tục) có chứa ô "A8":
MsgBox Range("A8").End(xlDown).Address 'Trả về $A$10

'Ô trên cùng - có dữ liệu, thuộc vùng (liên tục) có chứa ô "A8":
MsgBox Range("A8").End(xlUp).Address 'Trả về $A$5

'Ô trên cùng - có dữ liệu, vùng (liên tục) có chứa ô A65536:
MsgBox Range("A65536").End(xlUp).Address 'Trả về $A$16 (nếu A65536 rỗng)
'(Nếu ô A65536 và ô kế cận A65535 có dữ liệu thì trả về $A$655535, rơi về trường hợp ô A8 nêu trên)

'Ô cuối trong Sheet có chứa dữ liệu:
MsgBox Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Address 'Trả về $C$21

Nhờ Huynh Tigertiger xem lại giúp: mình ghi nhận như trên có gì sai, Huynh chỉ thêm.
 
Lần chỉnh sửa cuối:
Upvote 0
Ô dưới cùng ở cột A - có dữ liệu từ A8: A9,A...A100
MsgBox Range("A8").End(xlDown).Address

Ô trên cùng ở cột A - có dữ liệu từ A8: A7,...A1
MsgBox Range("A8").End(xlUp).Address

Ô trên cùng ở cột A - có dữ liệu từ A65536: A65535,A65534,...A1
MsgBox Range("A65536").End(xlUp).Address

'Ô cuối trong Sheet có chứa dữ liệu : OK
MsgBox Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Address
 
Upvote 0
minhsondaklak đã viết:
Xin cám ơn các Huynh !
Theo chỉ dẫn của các Huynh, mình đã thử lại và ghi nhận như sau:
Giã sử trên Sheet có nhập 3 vùng dữ liệu rời rạc, gồm: A5:A10 , A15:A16 và C20:C21

'Ô dưới cùng - có dữ liệu, thuộc vùng (liên tục) có chứa ô "A8":
MsgBox Range("A8").End(xlDown).Address 'Trả về $A$10

'Ô trên cùng - có dữ liệu, thuộc vùng (liên tục) có chứa ô "A8":
MsgBox Range("A8").End(xlUp).Address 'Trả về $A$5

'Ô trên cùng - có dữ liệu, thuộc vùng (liên tục) có chứa ô A65536:
MsgBox Range("A65536").End(xlUp).Address 'Trả về $A$16

'Ô cuối trong Sheet có chứa dữ liệu:
MsgBox Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Address 'Trả về $C$21

Nhờ Huynh Tigertiger xem lại giúp: mình ghi nhận như trên có gì sai, Huynh chỉ thêm.
oh, đúng rui, bạn nắm nhanh về đề wa, tigertiger đã thử lệnh của bạn vào lun rui thấy kết quả chính xác lun (xem trong file gửi kèm)
Tuy vậy chúng ta phải lưu ý đằng sau "End(<...>)." có nhiều thuộc tính (property), thủ tục (method) hay nữa - ko chỉ Address hay select ... đó là cái cần ứng dụng ...
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
!!!

Cám ơn các huynh Tigertiger, ThuNghi !
Như thế cũng tạm ổn rồi.
Có điều, theo cách hiểu của ThuNghi mình còn chưa rõ, ví dụ:

Giã sử trên Sheet có nhập 2 vùng dữ liệu rời rạc, gồm: A5:A10 và A15:A16
Khi đó dòng code:

MsgBox Range("A8").End(xlDown).Address

Sẽ trả về $A$10 chứ không trả về $A$16, trong khi A16 mới là Ô dưới cùng ở cột A - có dữ liệu từ A8.

Mình thấy End() có liên quan đến "vùng dữ liệu liên tục",
ThuNghi xem lại xem.
 
Lần chỉnh sửa cuối:
Upvote 0
minhsondaklak đã viết:
Mình thấy End() có liên quan đến "vùng dữ liệu liên tục",ThuNghi xem lại xem.
End(xlDown), End(xlUp), End(xlToRight), End(xlToLeft) giúp chúng ta xác định được ô cuối cùng hoặc đầu tiên có dữ liệu trong một cột hoặc 1 dòng. Nếu không kiểm soát được nó, ta không thể vận dụng được vào thực tế được.
Tôi không giải thích được một cách tổng quát cách dời con trỏ của 4 câu lệnh dưới đây:
Range("diachi").End(xlUp).Select
Range("diachi").End(xlToRight).Select
Range("diachi").End(xlToLeft).Select

Range("diachi").End(xlDown).Select
Nên chỉ giải thích câu lệnh:
Range("diachi").End(xlDown).Select
3 câu lệnh còn lại các bạn viết code chạy thử để rút ra kết luận.


Câu lệnh Range("diachi").End(xlDown).Select dời con trỏ xuống 1 ô bên dưới ô diachi (cùng cột), có 3 trường hợp xãy ra:

1. Ô kế tiếp dưới ô diachi có dữ liệu: con trỏ nhảy đến ô cuối cùng có dữ liệu liên tục tính từ ô diachi.

2. Ô kế tiếp dưới ô địa chỉ không có dử liệu: con trỏ nhảy đến ô đầu tiên có dữ liệu dưới ô diachi.

3. Phía dưới ô địa chỉ không còn dữ liệu: con trỏ nhảy đến ô cuối cùng dòng 65.536.

Ví dụ 1: các ô A1, A2, A5, A6, A7 có dữ liệu. 4 lệnh dưới đây dời con trỏ:
Range("A1").End(xlDown).Select > A2
Range("A2").End(xlDown).Select > A5
Range("A5").End(xlDown).Select > A7
Range("A7").End(xlDown).Select > A65536
Range("A10").End(xlDown).Select > A65536

Ví dụ 2: Vận dụng vào thực tế, để xác định dòng cuối cùng của dữ liệu ta viết:
dongcuoi=Range("A1").End(xlDown).Row cho kết quả dongcuoi=102, kết quả này chỉ đúng khi dữ liệu nhập trong cột A liên tục.

Ví dụ 3: Một bảng tính mới tạo các tên trường ở dòng 1
dongcuoi=Range("A1").End(xlDown).Row cho kết quả dongcuoi=65536, không có nghĩa là đã nhập 65536 dòng dữ liệu mà chưa nhập dữ liệu nào (A2:A65536 rổng)
 
Lần chỉnh sửa cuối:
Upvote 0
phamduylong đã viết:
Ví dụ 1: các ô A1, A2, A5, A6, A7 có dữ liệu. 4 lệnh dưới đây dời con trỏ:
Range("A1").End(xlup).Select > A2
Range("A2").End(xlup).Select > A5
Range("A5").End(xlup).Select > A7
Range("A7").End(xlup).Select > A65536
Range("A10").End(xlup).Select > A65536

Ví dụ 2: Vận dụng vào thực tế, để xác định dòng cuối cùng của dữ liệu ta viết:
dongcuoi=Range("A1").End(xlup).Row cho kết quả dongcuoi=102, kết quả này chỉ đúng khi dữ liệu nhập trong cột A liên tục.

Ví dụ 3: Một bảng tính mới tạo các tên trường ở dòng 1
dongcuoi=Range("A1").End(xlup).Row cho kết quả dongcuoi=65536, không có nghĩa là đã nhập 65536 dòng dữ liệu mà chưa nhập dữ liệu nào (A2:A65536 rổng)
Thầy ơi, trong ví dụ trên hình như là xlDown thay vì xlUp

TDN
 
Upvote 0
tedaynui đã viết:
Thầy ơi, trong ví dụ trên hình như là xlDown thay vì xlUp
Đúng là xlDown thay vì xlUp như tedaynui đã phát hiện. Tôi đã chỉnh lại trong bài 11. Cám ơn tedaynui.
 
Upvote 0
Đang ngâm cứu về CurrentRegion, thấy cái này hay hay

Mời các bạn xem qua về cách lọc AdvancedFilter trong VBA
PHP:
Sub AdvFilter()
    Dim RngFilter As Range
    Dim RngCriteria As Range
    Dim lRow As Long, lCol As Integer
     
    With Sheets("S3")
        Range("b2000").Value = "Td"
        Range("b2001").Value = "K*"
' Tạo Sheet mới để lưu dữ liệu kết quả lọc sau này:'         
        Sheets.Add
        On Error Resume Next
        Application.ActiveSheet.Name = "Filter"
        Sheets("s3").Activate
         
        lRow = Worksheets("S3").Range("A65536").End(xlUp).Row
        lCol = Worksheets("S3").Range("A1").End(xlToRight).Column
         
        With Worksheets("S3")
            Set RngFilter = .Range(.Cells(1, 1), .Cells(lRow, lCol))
            Set RngCriteria = Range("b2000:b2001")
        End With
  '"      Debug.Print RngFilter.Address"
        RngFilter.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=RngCriteria, _
        CopyToRange:=ActiveWorkbook.Sheets("Filter").Range("A1"), unique:=False
                  
    End With
     
End Sub
 
Upvote 0
Giành cho những người thích điên cái đầu

Để tìm hiểu về dữ liệu liên tục & không liên tục mình có ví dụ sau:
Giả sử mình có trang tính Sheet1, dữ liệu trong nó đang có ở 3 vùng như sau:
A1:B9 ; E2:F9 & I14:J15.
Và một macro (Mc) có nội dung như sau:

PHP:
Sub DetermineTable()
    Dim rTable As Range
    Set rTable = Sheet1.Range("G1").CurrentRegion
    MsgBox rTable.Address, , "A"
     With Sheet1
        Set rTable = .Range(.Range("G2"), _
               .Cells(65536, .Range("IV1").End(xlToLeft).Column).End(xlUp))
    End With
    MsgBox rTable.Address, , "B"
End Sub
Khi chạy Mc ta thu được hai hộp thoại có nội dung chủ yếu như sau
A: $E$1:$G$9
B : $B$2:$G$9

Nếu tôi thay G1 bằng I12 & G2 bằng I13 trong Mc nêu trên, nội dung chủ yếu của 2 hộp thoại sẽ như sau:
A: $i$12
B: $B$9:$I$13
Từ những kết quả như vậy, chúng ta suy ngược lại để tìm hiểu sâu hơn về câu lệnh trước câu
Mã:
 MsgBox rTable.Address, , "B"

Nếu quá đau đầu (như tôi lúc ngân cứu) thì đừng trách nhau nha!

+-+-+-+
 
Upvote 0
!!!

UsedRange cũng đã hoa cả mắt, nay thêm End() đúng là 'đau cái điền'. Chẳng hay sư Huynh SA_DQ thỉnh kinh VBE nào vậy ?
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom