Tổng hợp về phương thức tìm kiếm FIND (Find Method)

Liên hệ QC

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,900
Được thích
5,276
Nghề nghiệp
Kinh doanh các mặt hàng văn phòng phẩm
Find Method

Phương thức Find tìm kiếm thông tin trong một vùng nào đó, kết quả trả về là ô đầu tiên chứa đựng thông tin được tìm thấy. Nếu không tìm thấy thông tin trong vùng tìm kiếm thì phương thức Find sẽ trả về Nothing.

Cú pháp phương thức như sau :

Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

Expression : Vùng tìm kiếm. Biểu thức Expression phải được khai báo và nó trả về một đối tượng Range.

What : Dữ liệu hay thông tin cần tìm kiếm. Đây là một đòi hỏi bắt buộc phải khai báo. Dữ liệu tìm kiếm có thể là một chuỗi ký tự hay một dạng dữ liệu nào đó có trong Excel và được khai báo dưới dạng Variant.

After : Ô được chọn để xác định vị trí tìm kiếm, là tùy chọn, được khai báo dưới dạng Variant, có thể bỏ qua. Việc tìm kiếm sẽ bắt đầu từ ô này. Ô này tương ứng với vị trí của ô hiện hành sau khi việc tìm kiếm hoàn tất. Ô xác định vị trí tìm kiếm này sẽ không được đưa vào quá trình tìm kiếm trừ khi vùng tìm kiếm bao gồm cả ô này. Nếu đối số này không được khai báo thì việc tìm kiếm sẽ bắt đầu sau ô trên cùng bên trái của vùng cần tìm kiếm.

LookIn : Không bắt buộc, khai báo dạng Variant. Đây là một dạng thông tin và thường có giá trị là xlValues.

LookAt : Cách thức tìm kiếm. Là đối số tùy chọn, không bắt buộc, khai báo dưới dạng Variant. LookAt có 2 giá trị : xlWhole (Tìm toàn bộ) hoặc xlPart (tìm một phần).

SearchOrder : Xác định dạng thứ tự tìm kiếm, là tùy chọn không bắt buộc, khai báo dưới dạng Variant. SearchOrder có 2 dạng ứng với 2 hàng số : xlByRows (theo thứ tự dòng) hoặc xlByColumns (theo thứ tự cột)

SearchDirection : Hướng tìm kiếm, là tùy chọn. SearchDirection có 2 dạng ứng với 2 hằng số : xlNext (Tìm kế tiếp, là giá trị mặc định), xlPrevious (Tìm trước đó)

MatchCase : Là tùy chọn để xác định kiểu tìm kiếm có phân biệt chữ Hoa với chữ thường, khai báo dưới dạng Variant. Khai báo là True nếu ta muốn tìm kiếm chính xác. Giá trị mặc định là False.( Không phân biệt chữ in Hoa với chữ thường)

MatchByte : Không bắt buộc, khai báo dạng Variant. Chỉ sử dụng khi ta đã chọn hoặc cài đặt bộ hỗ trợ ngôn ngữ ký tự byte kép. Là True nếu ứng với bộ ký tự byte kép, False nếu ứng với bộ ký tự byte đơn.

SearchFormat : Tìm kiếm theo định dạng. Là tham số tùy chọn, khai báo dưới dạng Variant.

Lưu ý :

- Các thiết lập cho các đối số LookIn, LookAt, SearchOrder MatchByte sẽ được lưu mỗi lần ta sử dụng phương thức này (phương thức Find). Nếu ta không khai báo giá trị cho các đối số vào lần sử dụng phương thức Find tiếp theo, các giá trị thiết lập đã lưu trước đó sẽ được sử dụng. Việc thiết lập các đối số này làm thay đổi các tùy chọn thiết lập trong hộp thoại Find, và việc thay đổi các thiết lập trong hộp thoại Find sẽ làm thay đổi các giá trị đã lưu – là những giá trị được sử dụng nếu ta bỏ qua các đối số này. Để tránh xảy ra việc này, ta nên khai báo các đối số một cách rõ ràng mỗi lần sử dụng phương thức Find này.

- Ta có thể dùng phương thức FindNextFindPrevious để lặp lại việc tìm kiếm. Khi đến vị trí cuối của vùng tìm kiếm được xác định trước đó, excel sẽ bao phủ từ vị trí này đến vị trí đầu tiên của vùng tìm kiếm. Để ngưng việc tìm kiếm ngay khi động tác bao phủ này xảy ra, hãy lưu lại địa chỉ của ô đầu tiên tìm được, sau đó thử so sánh lần lượt mỗi địa chỉ ô được tìm thấy kế tiếp với địa chỉ ô vừa được lưu này.

============================@@@===========================​

Bài viết này tham khảo dựa trên bài dịch nguyên bản của anh Ca_dafi
(Còn tiếp)
 

File đính kèm

  • General about Find Method.rar
    53.4 KB · Đọc: 2,644
- RngTV là vùng từ A4 đến ô cuối cùng cột A chứa dữ liệu, ví dụ A4:A10;
- RngTV.offset(,2) là C4:C10
- RngTV.resize(1,1) là A4, RngTV.resize(1,1).offset(RngTV.rows.count-1,2) là ô C10. Tham số after ở đây là ô C10, vì sau C10 là C11 nằm ngoài phạm vi nên FIND sẽ bắt đầu tìm từ C4.
Nếu không có tham số after thì FIND sẽ bắt đầu tìm theo thứ tự C5---->C10->C4
Dùng after:=[c10] để ép FIND tìm theo thứ tự C4---->C10
 
Upvote 0
cảm ơn bạn! còn các thông số sau nhờ bạn giải thích hết đoạn code được không !
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin chỉ bạn cách lần ra những con số vô tri giác đó nè:

PHP:
RngTV.Resize(1, 1).Offset(RngTV.Rows.Count - 1, 2), , 1, , 1)

After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

Đối chiếu với cú fáp của fương thức FIND() mà ta trích 1 fần bên trên thì

Thành tố RngTV.Resize(1, 1).Offset(RngTV.Rows.Count - 1, 2) ứng với After


Tiếp đến ta xét LookIn

Nó có thể chỉ là xlValues hay xlFormulas

Trong mã lệnh, tác giả đã bỏ qua tham biến này; Nhưng chúng ta & bạn cần thì khảo sát như sau:

Mở CS (cửa sổ) Immediate lên & nhập vô nớ dòng lệnh:
Mã:
? xlFormulas
Để xem nó trả về là số gì.

[thongbao]
LookIn : Không bắt buộc, khai báo dạng Variant. Đây là một dạng thông tin và thường có giá trị là xlValues. [/thongbao]
Cũng tương tự như vậy để bạn biết tham biến còn lại.


& cứ như vậy bạn tự tìm hiểu mới nhớ để bạn xài & chỉ có vậy bạn mới nhớ được!

[thongbao]
LookAt : Cách thức tìm kiếm. Là đối số tùy chọn, không bắt buộc, khai báo dưới dạng Variant. LookAt có 2 giá trị : xlWhole (Tìm toàn bộ) hoặc xlPart (tìm một phần).

SearchOrder : Xác định dạng thứ tự tìm kiếm, là tùy chọn không bắt buộc, khai báo dưới dạng Variant. SearchOrder có 2 dạng ứng với 2 hàng số : xlByRows (theo thứ tự dòng) hoặc xlByColumns (theo thứ tự cột)

SearchDirection : Hướng tìm kiếm, là tùy chọn. SearchDirection có 2 dạng ứng với 2 hằng số : xlNext (Tìm kế tiếp, là giá trị mặc định), xlPrevious (Tìm trước đó)

MatchCase : Là tùy chọn để xác định kiểu tìm kiếm có phân biệt chữ Hoa với chữ thường, khai báo dưới dạng Variant. Khai báo là True nếu ta muốn tìm kiếm chính xác. Giá trị mặc định là False.( Không phân biệt chữ in Hoa với chữ thường)

MatchByte : Không bắt buộc, khai báo dạng Variant. Chỉ sử dụng khi ta đã chọn hoặc cài đặt bộ hỗ trợ ngôn ngữ ký tự byte kép. Là True nếu ứng với bộ ký tự byte kép, False nếu ứng với bộ ký tự byte đơn.

SearchFormat : Tìm kiếm theo định dạng. Là tham số tùy chọn, khai báo dưới dạng Variant.
[/thongbao]

Nhưng là mình thì mình không bao giờ xài nhưng con số vô tri giác đó cho mệt óc!
 
Upvote 0
thanks sư phụ.
Nhờ sư phụ cho 2 cuốn sách mà cũng biết record macro sau đó sửa code Để sài--=0--=0
home nào sư phụ ghé biên hòa sẽ tiếp chiêu " Gà đi dép" nhé--=0--=0
 
Upvote 0
Tìm tên trong 1 danh sách lớn & báo kết quả

Giả sử tôi có danh sách dài họ tên những người cùng cơ quan được trích dưới đây:

TTHọTên
1Ngô ThịHoàng
2Nguyễn ViếtHóa
3Phạm Hùng
4Nguyễn DũngLa
5Ngô KhiếtTường
6Trịnh ThanhDũng
7Lê HoàiLiên
8Trần MinhHòa
9HồĐắc
10Dũng
11Trương
12Tạ QuốcKiệt
13Từ CôngTốn

Nhiệm vụ đề ra là tìm xem trong danh sách đó có 04 người có tên này không; Nếu có thì báo số dòng mà người đó đang có hay ngược lại báo là 'Không có'
TìmDòng
HoaKhông có
Hùng 4,
Dũng 11, 7,
KhiếtKhông có

Macro có nội dung như sau:

PHP:
Option Explicit
Const MyErr = 1 + vbObjectError + 512
Sub TimKiem()
 Dim Cls As Range, sRng As Range, Rng As Range
 Dim MyAdd As String
 On Error GoTo LoiCT
 
 Set Rng = Columns("c:C")
 For Each Cls In Range([G2], [G2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Err.Raise Number:=MyErr
    Else
        MyAdd = sRng.Address
        Do
            Cls.Offset(, 1).Value = Str(sRng.Row) & "," & Cls.Offset(, 1).Value
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
 Next Cls
Err_:                   Exit Sub
LoiCT:
    If Err = MyErr Then
        Cls.Offset(, 1).Value = "Không có"
        Resume Next
    Else
        Resume Err_
    End If
End Sub
 
Upvote 0
Tìm ngày (mm/dd/yyyy) trong trường/cột số liệu kiểu [MM/dd/yyyy/hh:mm:cc]

Ta có 1 dữ liệu được trích ra như sau:
NgàyThành tiền
1/3/2017 0:004.95
1/3/2017 1:125.10
1/3/2017 2:245.25
1/3/2017 3:365.40
1/3/2017 4:485.55
1/4/2017 6:005.70
1/4/2017 7:125.85
1/4/2017 8:246.00
1/4/2017 9:366.15
1/4/2017 10:486.30
1/4/2017 12:006.45
1/4/2017 13:126.60
1/4/2017 14:246.75
1/4/2017 15:366.90
1/5/2017 16:487.05
1/5/2017 18:007.20
1/5/2017 19:127.35
1/5/2017 20:247.50
1/5/2017 21:367.65

Nhiệm vụ đề ra là thống kê tổng số đạt được của các ngày trong 1 danh sách như dưới đây:

NgàyTổng tiền
3/3/20171,377.06
3/4/20171,413.06
3/5/20171,205.05
3/9/20171,341.80
3/10/201721.60
3/11/20171,381.20
3/13/20171,719.06
Nhiệm vụ này sẽ được hoàn thành bỡi macro sau:

PHP:
Option Explicit
Sub FIND_()
 Dim Rng As Range, sRng As Range, Arr()
 Dim Rws As Long, J As Long, Tmr As Double, Tmp As Double
 Dim MyAdd As String
 
 Tmr = Timer()
 Rws = [c4].CurrentRegion.Rows.Count
 Set Rng = [c4].Resize(Rws)
 Arr() = Range([f4], [f4].End(xlDown)).Value
 ReDim dArr(1 To UBound(Arr()), 1 To 1)
 For J = 1 To UBound(Arr())
    Set sRng = Rng.Find(Arr(J, 1), , xlValues, xlPart)  '**'
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            dArr(J, 1) = sRng.Offset(, 1).Value + dArr(J, 1)
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
 Next J
 [g4].Resize(J - 1).Value = dArr()
 [m5].Value = Timer() - Tmr
End Sub
 
Upvote 0
Thanks đã share bài viết, rất bổ ích với mình :)
 
Upvote 0
Chào các bác, em muốn nhờ các bác viết dùm em Code để đưa dữ liệu vào các bảng tính tổng hợp từ 1 bảng tính. Cụ thể như sau:
Trong file em có Sheet "DL" là để nhập dữ liệu từ ô B1 đến ô B9
các Sheet còn lại là bảng tổng hợp cho dữ liệu được đưa vào từ Sheet "DL" ; Trong các bảng tính tổng hợp này thì 2 cột A và B là cố định không được phép thay đổi theo thứ tự đã có.

Việc em muốn là dữ liệu từ các ô B3 đến ô B9 đưa vào các dòng tương ứng với điều kiện trong các Sheet tổng hợp từ cột C đến cột I
Điều kiện để đưa dữ liệu vào như sau:
Tại Sheet "DL" ô B1 và ô B2 là điều kiện để copy dữ liệu vào Sheet tổng hợp : Với ô B1 là mã số thuế đối chiếu với cột A của Sheet tổng hợp để đưa dữ liệu từ ô B3 đến ô B9 vào dòng có mã số thuế tương ứng ; Với ô B2 là điều kiện để đối chiếu đưa vào Sheet tổng hợp nào.

Ví dụ cụ thể:
Với điều kiện là mã số thuế nhập tại ô B1 là 2901728621 và điều kiện kỳ kê khai tại ô B2 là 01/2017 thì các dữ liệu tại ô B3 đến ô B9 sẽ đưa vào Sheet " Thang 1" tương ứng với dòng 12 là từ ô C12 đến I12. (Tương tự với các mã số thuế khác)
Tương tự với mã số thuế nhập tại Sheet "DL" là 2901862001 và kỳ kê khai là 02/2017 thì các dữ liệu tại ô B3 đến ô B9 sẽ đưa vào Sheet " Thang 2" tương ứng với dòng 8 là từ ô C8 đến I8. (Tương tự với các mã số thuế khác)

Nếu như mã số thuế tại ô B1 của Sheet "DL" không có trong các Sheet tổng hợp thì sẽ hiện thông báo là "Ma So Thue Khong Co Trong Bang Tong Hop"
Và sau khi đưa dữ liệu vào Sheet tổng hợp xong thì dữ liệu được nhập tại ô B1 đến ô B9 sẽ được làm trống để nhập dữ liệu khác.

Rất mong các bác giúp đỡ. :D
 

File đính kèm

  • DL tu Doc thanh Ngang.xls
    67.5 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Bạn vận hành thử file này & cho biết í kiến xem sao

(Xin các bạn xem file tại bài tiếp theo & xin cáo lỗi về chuyện bất tiện này!)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn vận hành thử file này & cho biết í kiến

Hay quá, nhưng bác cho em hỏi thêm.
Đoạn code này thì khi đặt Button tại Sheet "DL" thì mới thực hiện được và Code không báo lỗi.
Còn nếu đặt ở bất kỳ một Sheet nào khác thì không thực hiện được mà Code sẽ báo lỗi ngay
Vậy có cách nào để khắc phục để có thể tùy ý đặt Button ở bất cứ Sheet nào cũng đc được không bác?

Dòng Code báo lỗi:
Mã:
 Set Sh = ThisWorkbook.Worksheets("Q" & Right("0" & CStr(Month([b2].Value)), 2))
 
Upvote 0
Chuyện "Button tại Sheet 'DL'" đang là hiễn nhiên, do
(1) Bạn đã gắn vố đó, mà không/chưa nêu vấn đề là nó có thể ở trang tính khác;
(2) Dữ liệu vừa nhập đang ở trang đó; Sao lại phải di chuyển đến trang khác làm chi vậy?
Cứ nhấn nút để nó nhập hay báo cho ta biết là không nhập được vô đó, & có thể nhập vô trang tính khác;
Công việc của bạn cùng lắm sẽ là lấy viết ra ghi lại các trang tính có thể nhập mà thôi;

Còn vấn đề đứng ở các trang khác mà nhấn nút & macro vẫn chạy đúng không phải là không làm được; Nhưng bạn phải cho biết lí do & nó là chính đáng không đã!

Chúc vui & thành công.
 
Upvote 0
Em xin trích câu hỏi của bác để diễn giải cho dễ nhé.

Chuyện "Button tại Sheet 'DL'" đang là hiễn nhiên, do
(1) Bạn đã gắn vố đó, mà không/chưa nêu vấn đề là nó có thể ở trang tính khác;
Cái này là do em quên, cứ nghĩ gắn ở đâu cũng đc nên để vào đó cho tiện :D


(2) Dữ liệu vừa nhập đang ở trang đó; Sao lại phải di chuyển đến trang khác làm chi vậy?
Cứ nhấn nút để nó nhập hay báo cho ta biết là không nhập được vô đó, & có thể nhập vô trang tính khác;
Công việc của bạn cùng lắm sẽ là lấy viết ra ghi lại các trang tính có thể nhập mà thôi;
Thực tế thì file làm việc ấy của em nhiều Sheet hơn, nhiều dòng và cột hơn thế nhiều ấy ạ.
Em đã học làm đc 1 số Form nhập liệu đặt ở tất cả 16 Sheet trong file Excel, với cái Form nhập liệu để ghi vào ô B1 đến ô B9. Vì khi kiểm tra, đối chiếu số liệu của Doanh nghiệp còn cần phải đứng ở Sheet tương ứng với thời kỳ kiểm tra. Cái Forrm nhập liệu ấy em vừa nhập được và cũng có thể gọi lại số liệu từ ô B1:B9 trong Sheet "DL" vào lại form để có thể sửa và ghi lại khi đứng ở bất kỳ Sheet nào, đồng thời sau khi đối chiếu xong thì mới ghi dữ liệu vào các Sheet tổng hợp nên em muốn cái nút ghi dữ liệu vào các Sheet mà bác tạo Code giúp em cũng nằm được trên bất kỳ Sheet nào để tiện sử dụng ấy ạ.

Còn vấn đề đứng ở các trang khác mà nhấn nút & macro vẫn chạy đúng không phải là không làm được; Nhưng bạn phải cho biết lí do & nó là chính đáng không đã!
Không biết là với lý do trên bác có thể điều chỉnh lại Code giúp em với được không ạ?

Thêm nữa là nếu được thì nhờ bác ghi chú ở các dòng Code là có tác dụng gì? Lý do là em cũng đang tự học VBA và rất muốn học hỏi từ các Code của các tiền bối.
 
Upvote 0
Bạn thao tác trước đi; Chuyện khác tính sau.

(Ở các trang tính khác, nhưng muốn macro cho kết quả thì nhấn tổ hợp phím {CTRL}+{SHIFT}+R)
 

File đính kèm

  • gpeFind.rar
    21.6 KB · Đọc: 38
Upvote 0
em có file thvt nhờ các anh viết cho em 1 đoạn code để tổng hợp vật tư từ sheet ptvt cùng file
nội dung em có comment trong từng cột
 

File đính kèm

  • THVT.xls
    1.3 MB · Đọc: 12
Upvote 0
em có file thvt nhờ các anh viết cho em 1 đoạn code để tổng hợp vật tư từ sheet ptvt cùng file
nội dung em có comment trong từng cột
Bạn nên mơ môtj
em có file thvt nhờ các anh viết cho em 1 đoạn code để tổng hợp vật tư từ sheet ptvt cùng file
nội dung em có comment trong từng cột
Bạn nên mở một topic mới để hỏi. Lý do:
- bài toán của bạn ko thể dùng phương thức Find
- đây là một topic để truyển tải những kiến thức về phương thức Find. Những câu hỏi các bạn nên đưa vào topic khác, như thế sẽ có nhiều người hỗ trợ hơn.
Tôi sẽ cơ cấu lại Topic này cho phù hợp.
Xin cảm ơn !!!
 
Upvote 0
Cho em hỏi nếu em muốn tìm một giá trị lớn hơn 1 thì viết như nào. Em thử như này thì không được: Find(">1")
 
Upvote 0
Tìm trong 1 vùng nào đó:

Dùng hàm MAX() & MIN() trong Excel để tìm cực trị của vùng đó;
Sau đó thiết lập vòng lặp từ 2 trở lên (hay từ giá trị Min tìm được) đến trị cực đại

Chúc bạn thành công với số nguyên dương; Số thập phân thì khó à nha!
 
Upvote 0
Các ví dụ minh họa về Find Method


Áp dụng : Để hiểu rõ hơn về phương thức tìm kiếm Find, ta xét một vài ví dụ minh họa sau :

1.> Ta có dữ liệu như sau :

Hinh1.jpg


Ta sẽ dùng phương thức Find để tìm ra trong vùng A1:A10 những ô nào có ký tự 1
Ta dùng chuột bôi đen vùng A1:A10 và cho chạy Macro sau :

PHP:
Sub Test1()
    Dim Rng As Range
    Set Rng = Selection.Find("1*", LookIn:=xlValues, LookAt:=xlWhole)
    If Not Rng Is Nothing Then
        Do
            MsgBox Rng.Address
            Set Rng = Selection.FindNext(Rng)
        Loop
    End If
End Sub

Lần lượt các kết quả của việc chạy Macro như sau :
hinh2.jpg

Diễn giải về trình tự hoạt động của Macro như sau :

- Tìm trong vùng từ ô A2 đến ô A10 xem ô nào có chứa ký tự 1. Kết quả là ô A3 được tìm thấy đầu tiên và sẽ gán biến Rng bằng ô A3. Các bạn sẽ hỏi là tại sao không tìm bắt đầu từ ô A1 và tại sao không trả về ô A1 đầu tiên mà lại là ô A3. Các bạn xem trong cấu trúc của phương thức Find thì sẽ thấy có một đối số tùy chọn, đó là After. Đây là tham số dùng để xác định vị trí bắt đầu của việc tìm kiếm, việc tìm kiếm sẽ bắt đầu tại vị trí sau ô này. Nếu không khai báo thì việc tìm kiếm sẽ bắt đầu ngay sau ô đầu tiên bên trái của vùng tìm kiếm. Như VD trên thì vùng tìm kiếm Selection (A1:A10), do không khai báo nên việc tìm kiếm sẽ bắt đầu từ ô A2 và ô A3 được tìm thấy đầu tiên.


- Tham số What trong phương thức Find ở VD trên sử dụng thêm ký tự “*” để tìm gần đúng (chuỗi bắt đầu bởi số 1). Bỏ dầu “*” ta sẽ tìm chính xác.

- Nếu như không tìm thấy ô nào trong vùng Selection có chứa số 1 (Biến Rng = Nothing) thì sẽ thoát khỏi thủ tục. Ngược lại, sẽ bắt đầu vào vòng lặp tìm kiếm Do Loop.

- Sau khi tìm thấy và gán biến Rng cho ô A3 thì hiện hộp thoại thông báo về địa chỉ của ô vừa được tìm thấy ( biến Rng). Khi đó tham số After sẽ là ô A3 và việc tìm kiếm sẽ bắt đầu sau ô này.

- Tiếp theo ta sẽ dùng phương thức FindNext(Rng) để tìm đến ô chứa số 1 tiếp theo và ô A5 được tìm thấy, biến Rng sẽ là ô A5 . Quá trình cứ tiếp tục như thế cho đến ô A10.

- Khi dò tìm đến ô A10 thì quá trình dò tìm sẽ được lặp lại như lúc ban đầu, tức là sẽ tìm kiếm lặp lại từ ô A1 đến ô A10. Nhưng khi đó tham số After sẽ là ô A10 và lúc này ô A1 sẽ được tìm thấy. Và tiếp đến là ô A3, A5…sẽ tìm kiếm mãi mãi.

- Khi gán biến Rng bằng ô A5 thì đến từ khóa Loop. Khi gặp từ khóa này thì quá trình tiềm kiếm sẽ được tiếp tục, đến từ khóa Do, hiện hộp thông báo và lại gán biến Rng bằng ô A6….



Đoạn Code trên còn 2 vấn đề cần khắc phục, đó là làm sao để tìm thấy được ô A1 đầu tiên và sẽ kết thúc quá trình tìm kiếm khi dò tìm đến ô A10.

Đoạn Code sau sẽ khắc phục điều này :

PHP:
Sub Test2()
    Dim Rng As Range, LastCell As Range, FirstAddress As String
    Set LastCell = Selection.Cells(Selection.Cells.Count)
    Set Rng = Selection.Find("1*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
    FirstAddress = Rng.Address
    If Not Rng Is Nothing Then
        Do
            MsgBox Rng.Address
            Set Rng = Selection.FindNext(Rng)
        Loop While FirstAddress <> Rng.Address
    End If
End Sub

- Đầu tiên ta sẽ gán biến LastCell ứng với ô cuối cùng của vùng cần tìm kiếm : LastCell = [A10]

- Trong phương thức Find ta sẽ thấy có xuất hiện thêm tham số After có giá trị là LastCell. Điều này có nghĩa là việc tìm kiếm sẽ bắt đầu sau ô [A10]. Và như thế là ô [A1] sẽ được tìm thấy đầu tiên. Sau đó gán biến Rng bằng ô [A1].

- FirstAddress là chuỗi text ứng với địa chỉ của ô được tìm thấy đầu tiên trong vùng, ta gán biến FirstAddress = ”$A$1”.

- Nếu Rng khác Nothing thì đi đến vòng lặp Do Loop, nếu là Nothing thì thoát khỏi thủ tục.

- Vào vòng lặp Do loop thì quá trình tương tự như đoạn Sub Test1. Tuy nhiên trong đoạn Code này còn có thêm một biểu thức điều kiện : FirstAddress <> Rng.Address.

- Loop While FirstAddress <> Rng.Address : đoạn này có ý nghĩa như sau : quá trình tìm kiếm sẽ được lặp lại nếu như địa chỉ của biến Rng hiện tại khác với địa chỉ của ô đầu tiên được tìm thấy trong vùng vùng ( ô A1). Ngược lại, nếu trùng thì có nghĩa rằng ô này đã được tìm thấy trước đó, sẽ hủy bỏ kết quả này và thoát khỏi thủ tục.
Nhờ bài viết của bạn, tôi hiểu rõ hơn về phương thức FIND. Cám ơn!
 
Upvote 0
Web KT
Back
Top Bottom