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

Blue Softs 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,891
Được thích
5,233
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,522

khacbao72

Thành viên mới
Tham gia
23/6/08
Bài viết
27
Được thích
18
Kính thưa thầy và các bạn ,

Em cũng theo cú pháp trên làm nhưng không hiểu sau kết quả hoàn toàn khac trong 02 file .

Mục tiêu : dò tìm xem liệu các giá trị có trong cột A /sheet "Hours x SLP" có tồn tại trong cột B sheet "forecast" hay không ? nếu không có thì mark vàng giá trị đó ở cột A/Sheet "HoursxSLP"

Em chuẩn bị code nhu sau:

Sub Bookertrack()
Dim kq, code, dky As Range
Dim codekt As String
'tim illegal booker
Set code = [spentcode]
Set dky = [dangky]
'chon codekt
Sheets("forecast").Select

For i = 2 To code.Rows.Count
codekt = code(i, 1).Value
Set kq = [dangky].Find(codekt) ', LookIn:=xlValues, LookAt:=xlWhole)
'Kiem tra
If kq Is Nothing Then
code(i, 1).Interior.Color = 65535
End If
Next i
End Sub

Tuy nhiên khi chạy
File test1 : giá trị ở cột B là kết quả phép tính(formula), kết quả không đúng như yêu cầu;
File test2 : Kết quả như yêu cầu , khi em chuyển các giá trị trong cột B thành value (copy và paste value )

Nhờ thày và các anh chị chỉ giúp nguyên nhân và cách khắc phục với ạ.
 

File đính kèm

  • test1.xlsm
    53.8 KB · Đọc: 6
  • test2.xlsm
    55.5 KB · Đọc: 7
Upvote 0

guitarnguyen1989

Thành viên chính thức
Tham gia
31/7/16
Bài viết
59
Được thích
7
Mã:
Sub TrichLocSocai()
    Dim Rng As Range, LastCell As Range
    Dim FirstAddress As String, R As Long, SaveRow As Long
    Application.ScreenUpdating = False
    With Range("B2:C11")
        Set LastCell = .Cells(.Cells.Count)
        Set Rng = .Find("111*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
        FirstAddress = Rng.Address
        If Not Rng Is Nothing Then
            R = 2
            Do
                SaveRow = Rng.Row
                Select Case Rng.Column
                Case 2
                    Cells(R, 6) = Rng.Offset(, -1)
                    Cells(R, 7) = Rng.Offset(, 1)
                    Cells(R, 8) = Rng.Offset(, 2)
                Case 3
                    Cells(R, 6) = Rng.Offset(, -2)
                    Cells(R, 7) = Rng.Offset(, -1)
                    Cells(R, 9) = Rng.Offset(, 1)
                End Select
                R = R + 1
                Set Rng = .FindNext(Rng)
            Loop While FirstAddress <> Rng.Address And SaveRow <> Rng.Row
        End If
    End With
    Set LastCell = Nothing: Set Rng = Nothing
    Application.ScreenUpdating = True
End Sub


Ai có thể giải thích dùm em "case 2 , case 3" trong code tren có nghĩa là gì hok???? thanks
 
Upvote 0

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
12,694
Được thích
19,353
Ai có thể giải thích dùm em "case 2 , case 3" trong code tren có nghĩa là gì hok???? Cảm ơn
Câu lệnh
Set Rng = .Find("111*", After:=LastCell, LookIn:=xlValues, LookAt:=xlWhole)
sẽ tiến hành công việc tìm kiếm trong vùng Range("B2:C11")
Mà vùng này có 2 cột
Vậy khi tiến hành tìm ra kết quả thì đối chiếu với cột của ô tìm thấy ta xử tiếp

Vì không có file giả lập nên mọi người ngại trả lời, bạn thông cảm nha!
 
Upvote 0

Duongvulg

Thành viên mới
Tham gia
1/6/19
Bài viết
4
Được thích
0
dear các anh
em có issue thế này :

222723

em viết code như sau :

Sub test()
Dim i As Variant
For i = 2 To 4
Cells(i, 4) = Range(Cells(2, 2), Cells(4, 2)).Find(Cells(i, 3))
Next i
End Sub

khi chạy sẽ báo lỗi

e sử dung cột B là range để find
cột C là các data cần find
D là nơi trả về data find được

khi gặp giá trị "d" thì code sẽ báo lỗi

222724

các anh có thể gỡ rối cho em đc ko ạ

thank các anh.
 
Upvote 0

leonguyenz

Thành viên mới
Thành viên BQT
Moderator
Tham gia
2/8/10
Bài viết
5,047
Được thích
8,657
Giới tính
Nam
dear các anh
em có issue thế này :

View attachment 222723

em viết code như sau :

Sub test()
Dim i As Variant
For i = 2 To 4
Cells(i, 4) = Range(Cells(2, 2), Cells(4, 2)).Find(Cells(i, 3))
Next i
End Sub

khi chạy sẽ báo lỗi

e sử dung cột B là range để find
cột C là các data cần find
D là nơi trả về data find được

khi gặp giá trị "d" thì code sẽ báo lỗi

các anh có thể gỡ rối cho em đc ko ạ

thank các anh.
Không tìm thấy giá trị "d" trong vùng tìm kiếm (B2:B4), bạn phải bỏ qua bước bước này, ví dụ:
If not Vùng tìm kiếm.Find( .. ) is nothing then
'Lệnh thực thi
end if
 
Upvote 0

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,186
Được thích
103
Cho em hỏi phương thức tìm kiếm find có tác dụng với việc tìm kiếm màu đổ trong ô không? Ví dụ em muốn tìm màu mã 255 trong vùng từ B5:B5000 thì phải làm thế nào?
 
Upvote 0

Duongvulg

Thành viên mới
Tham gia
1/6/19
Bài viết
4
Được thích
0
Không tìm thấy giá trị "d" trong vùng tìm kiếm (B2:B4), bạn phải bỏ qua bước bước này, ví dụ:
If not Vùng tìm kiếm.Find( .. ) is nothing then
'Lệnh thực thi
end if
Rất cảm ơn anh LeonguyenZ.

E có them 1 issue nữa
hiện e đang làm code dungf Find để ktra.
đề bài có 15,969 ea số.
Hiện đang có 7,584 ea số. cần kiểm tra xem 7,584 số này có nằm trong 15,969 hay ko.
e dung lenh Find thì mất 5 phút,
Liệu có cách nào rút ngắn thời gian ko ạ.

222743
 
Upvote 0

leonguyenz

Thành viên mới
Thành viên BQT
Moderator
Tham gia
2/8/10
Bài viết
5,047
Được thích
8,657
Giới tính
Nam
Rất cảm ơn anh LeonguyenZ.

E có them 1 issue nữa
hiện e đang làm code dungf Find để ktra.
đề bài có 15,969 ea số.
Hiện đang có 7,584 ea số. cần kiểm tra xem 7,584 số này có nằm trong 15,969 hay ko.
e dung lenh Find thì mất 5 phút,
Liệu có cách nào rút ngắn thời gian ko ạ.

View attachment 222743
Thời gian ghi lên bảng tính khá lâu, còn phương thức Find thì không ảnh hưởng nhiều tốc độ thực thi code.
Vậy nếu tìm được, nên đưa vào mảng, rồi gán xuống bảng tính.
Có thể bạn phải nghiên cứu thêm về mảng.
 
Upvote 0

tueyennhi

Thành viên tích cực
Tham gia
18/10/10
Bài viết
1,186
Được thích
103
Cho em hỏi phương thức tìm kiếm find có tác dụng với việc tìm kiếm màu đổ trong ô không? Ví dụ em muốn tìm màu mã 255 trong vùng từ B5:B5000 thì phải làm thế nào?
Em làm được rồi nhé.

PHP:
Public Sub Tim_o_co_mau()
Application.FindFormat.Interior.Color = 255
Cells.Find(What:="", SearchFormat:=True).Activate
End Sub
 
Upvote 0

tieubavuong1986

Thành viên mới
Tham gia
28/11/14
Bài viết
2
Được thích
0
Kính chào các anh chị !. Em là người không chuyên, chỉ biết vài công thức exel, biết chạy đoạn macro copy về. Em có bài toán này kính mong các anh chị giúp đỡ ạ.
Em có mảng dữ liệu tại Cột B, trong đó gồm nhiều chuỗi ở mỗi cell. Các chuỗi có thể chứa chuỗi dữ liệu tại cột C từ C1:C3 chẳng hạn. Bây giờ em muốn tìm xem dữ liệu ô C1, C2, C3 có nằm chứa trong cột A hay không (nghĩ đến hàm Find). Nếu có thì lấy dữ liệu tương ứng ở cột A. Em có đính file kèm theo. Em nghĩ đến hàm Find nhưng hàm này chỉ giới hạn tìm kiếm trong một Cell. Em thực sự không hiểu nhiều về chuyên môn này, kính mong được giúp đỡ ạ. Trân trọng cảm ơn các anh chị!
 

File đính kèm

  • tìm chuỗi ký tự trong mảng nhiều chuỗi.xlsx
    9.1 KB · Đọc: 4
Upvote 0

Ldh1984

Thành viên mới
Tham gia
18/7/21
Bài viết
29
Được thích
5
Mình có file bên dưới và có đoạn code viết như thế này để tách lấy chuỗi ký tự trong vùng dữ liệu, mình đã áp dụng và làm ok :) "nhưng bất cập ở chổ tính toán của đoạn code này nếu dòng dữ liệu lên đến 1000 dòng thì mức độ tính toán của code này khá lâu làm mất rất nhiều thời gian. kính mong các cao nhân trợ giúp đoạn code để giảm bớt thời gian trong vấn đề lấy dữ liệu, xin cảm ơn!
Code VBA 1: lấy đoạn mã 7 ký tự gồm chữ và số
Function HE_FIND7(A As Range, B As Range) As Variant
Dim ai As Range
Dim bi As Range
Dim i As Integer
For Each bi In B
For Each ai In A
'For Each ci In C
For i = 1 To Len(bi.Value)
If Mid(bi.Value, i, 7) = ai.Value Then
HE_FIND7 = ai.Value
' MsgBox "hh"
Exit Function
End If
Next i
'next ci
Next ai
Next bi

End Function

Code VBA 2: lấy đoạn mã 10 ký tự gồm chữ và số
Function HE_FIND10(A As Range, B As Range) As Variant
Dim ai As Range
Dim bi As Range
Dim i As Integer
For Each bi In B
For Each ai In A
'For Each ci In C
For i = 1 To Len(bi.Value)
If Mid(bi.Value, i, 10) = ai.Value Then
HE_FIND10 = ai.Value
' MsgBox "hh"
Exit Function
End If
Next i
'next ci
Next ai
Next bi

End Function
 

File đính kèm

  • Book1.xlsm
    16.1 KB · Đọc: 1
Upvote 0

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
12,694
Được thích
19,353
Có khi bạn không cần đến VBA đâu, mà vầy:

=MID(D4,FIND(B4,D4),LEN(B4))​
 
Lần chỉnh sửa cuối:
Upvote 0
Top Bottom