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

Liên hệ QC

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

hoangdanh282vn

Nguyễn Cảnh Hoàng Danh
Thành viên danh dự
Tham gia
21/12/07
Bài viết
1,902
Được thích
5,306
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

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

Upvote 0
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
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
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
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
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
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
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
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
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

Upvote 0
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

Upvote 0
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
Bác nào hỗ trợ tìm kiếm đoạn mã của tệp bên dưới cho em với
muốn tìm kiếm từ sheet2 cho các giá trị ở sheet1 và trả kết quả ở sheét2em
 

File đính kèm

Upvote 0
PHP:
Sub Tim1FanCuaChuoi()
 Dim Rng As Range, sRng As Range, Cls As Range
 
 Set Rng = Sheet1.UsedRange
 Sheet2.Select
 For Each Cls In Range([A2], [A2].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlPart)
    If sRng Is Nothing Then
        Cls.Offset(, 1).Value = "Nothing"
    Else
        Cls.Offset(, 1).Value = sRng.Value
    End If
 Next Cls
End Sub
& chúc vui!
 
Upvote 0
Xin nhờ mọi người giúp code ạ
Mình có 1 file Excel, nhiều cột và nhiều dòng, dữ liệu lần lượt trong mỗi cột là từ 0001 đến 5.000, nhưng thay nhau xuất hiện kéo dài tới hơn 50.000 hàng.
(gần tương tự như cột Số thứ tự, chỉ là cùng xuất hiện trên nhiều cột và có lạp lại ở 5-10 hàng trong 1 cột)
Bình thường mình vẫn sử dụng Auto filllter, nhưng do nó dài quá tìm bấm đc cái số muốn lọc Filter cũng mỏi tay luôn, nên muốn hỏi xem có code nào có thể Cho gõ số vào 1 ô bấm cho nó tự chạy ra chuỗi kết quả như dùng Fillter ko?
Nếu có xin chỉ giúp mình code đó với, để tìm kiếm nhanh gọn hơn, xin cảm ơn.
Mình có gửi kèm ảnh file dữ liệu của mình, ko biết post bài ở đây có đúng quy định ko, vì thấy là mục về Find, xin làm phiền mọi người.
 

File đính kèm

  • Untitled.png
    Untitled.png
    497.3 KB · Đọc: 12
Upvote 0
. . . . .Mình có 1 file Excel, nhiều cột và nhiều dòng, dữ liệu lần lượt trong mỗi cột là từ 0001 đến 5.000, nhưng thay nhau xuất hiện kéo dài tới hơn 50.000 hàng.
(gần tương tự như cột Số thứ tự, chỉ là cùng xuất hiện trên nhiều cột và có lạp lại ở 5-10 hàng trong 1 cột)
. . . .
@Chủ bài đăng: Nhiều dòng thì bạn đã cụ thể là cỡ 5 vạn
Còn nhiều cột bạn chưa cho biết & đừng nói là cũng 5 vạn đó nha

Bạn nào muốn tự giả lập trang tính để có nguồn giúp bạn ý thì cho chạy macro này trên trang tính trống

PHP:
Sub TaoDuLieuTrangTinh()
 Const Dg As Long = 50000:              Const Cot As Integer = 99
 Dim Col As Integer, Rws As Long
 ReDim Arr(1 To Dg, 1 To Cot) As Long
 
 Randomize
 For Col = 1 To Cot
    For Rws = 1 To Dg
        Arr(Rws, Col) = 1 + 50000 * Rnd \ 1
    Next Rws
 Next Col
 Sheets("Find").[A1].Resize(Dg, Cot).Value = Arr()
End Sub

Thời gian tiêu tốn do năng lục máy mỗi người
& chúc các bạn vui nhân những ngày cuối tuần!
 
Upvote 0
Xin nhờ mọi người giúp code ạ
Mình có 1 file Excel, nhiều cột và nhiều dòng, dữ liệu lần lượt trong mỗi cột là từ 0001 đến 5.000, nhưng thay nhau xuất hiện kéo dài tới hơn 50.000 hàng.
(gần tương tự như cột Số thứ tự, chỉ là cùng xuất hiện trên nhiều cột và có lạp lại ở 5-10 hàng trong 1 cột)
Bình thường mình vẫn sử dụng Auto filllter, nhưng do nó dài quá tìm bấm đc cái số muốn lọc Filter cũng mỏi tay luôn, nên muốn hỏi xem có code nào có thể Cho gõ số vào 1 ô bấm cho nó tự chạy ra chuỗi kết quả như dùng Fillter ko?
Nếu có xin chỉ giúp mình code đó với, để tìm kiếm nhanh gọn hơn, xin cảm ơn.
Mình có gửi kèm ảnh file dữ liệu của mình, ko biết post bài ở đây có đúng quy định ko, vì thấy là mục về Find, xin làm phiền mọi người.
Gỏ trực tiếp trong màn hình fillter đơn giản hơn thao tác code VBA
 
Upvote 0
Gỏ trực tiếp trong màn hình fillter đơn giản hơn thao tác code VBA
Mình tìm trực tiếp Fillter thì thấy nó hơi lâu, nếu gõ đc trực tiếp luôn thì sẽ nhanh hơn,

--
@SA_DQ Không nó chỉ chục cột như hình ảnh kèm theo thôi, chủ yếu do nó quá nhiều hàng, nên thấy tìm fillter khá bất tiện (có lẽ mình cũng hơi kém exvel).

mình gửi file kèm theo, chỉ cắt bớt hàng, vì số liệu ở các hàng cũng chỉ có vậy nhưng trùng lặp nhiều nên dài.
Mong tìm đc cách nhanh gọn hơn sài Fillter, cảm ơn mọi người,
 

File đính kèm

Upvote 0
O→→→→→→→→→→→→→→→→→→→→→→→O
Bạn trãi nghiệm với file này cho vui, đi! . .
O←←←←←←←←←←←←←←←←←←←←←←←O
 

File đính kèm

Upvote 0
Mình có đặt công thức cho vùng để trả về kết quả NG. Sau đó listbox sẽ hiển thị các tham chiếu của kết quả NG đó.
Tuy nhiên của mình nó không tìm theo giá trị trả về NG mà lại tìm theo công thức, bạn nào sửa giúp mình với.
Set sRng = rng.Find("NG", , xlFormulas, xlPart)

Xin cảm ơn
 
Upvote 0
Mình có đặt công thức cho vùng để trả về kết quả NG. Sau đó listbox sẽ hiển thị các tham chiếu của kết quả NG đó.
Tuy nhiên của mình nó không tìm theo giá trị trả về NG mà lại tìm theo công thức, bạn nào sửa giúp mình với.
Set sRng = rng.Find("NG", , xlFormulas, xlPart)

Xin cảm ơn
Học chay thì may ra, chứ xài món chay mà giúp được cũng khá mệt!
 
Upvote 0
Mình có đặt công thức cho vùng để trả về kết quả NG. Sau đó listbox sẽ hiển thị các tham chiếu của kết quả NG đó.
Tuy nhiên của mình nó không tìm theo giá trị trả về NG mà lại tìm theo công thức, bạn nào sửa giúp mình với.
Set sRng = rng.Find("NG", , xlFormulas, xlPart)

Xin cảm ơn
rng.Find("NG", , xlFormulas, xlPart) chỉ trả về 1 cell.

Bạn muốn dùng 1 cell đó làm nguồn cho listbox thiệt à?
 
Upvote 0
rng.Find("NG", , xlFormulas, xlPart) chỉ trả về 1 cell.
Bạn muốn dùng 1 cell đó làm nguồn cho listbox thiệt à?
Biết đâu ở dưới câu đó có câu lệnh Find Next thì sao? Rồi mỗi lần find có kết quả là 1 lần add vào list?
Bạn ấy chỉ hỏi vụ formula, thế thì trả lời là đừng lấy formula mà lấy value, xong.
 
Upvote 0
Biết đâu ở dưới câu đó có câu lệnh Find Next thì sao? Rồi mỗi lần find có kết quả là 1 lần add vào list?
Bạn ấy chỉ hỏi vụ formula, thế thì trả lời là đừng lấy formula mà lấy value, xong.
Câu lệnh của mình đây, mình sửa thành xlvalues mà nó không ra kết quả nên mình mới hỏi, trong khi mình sửa tay chữ NG thì lại ra :(

Dim s As Long
Dim rng As Range, sRng As Range
Dim MyAdd As String
Dim Rws As Long, W As Integer
s = ComboBox1.Value
If s = 1 Then
With Sheet1
Rws = .[BA4].CurrentRegion.Rows.Count
ReDim Arr(1 To Rws, 1 To 2)
Set rng = .[BA4].Resize(Rws)
Set sRng = rng.Find("NG", , xlFormulas, xlWhole)
If sRng Is Nothing Then
Arr(2, 2) = "Khong co canh bao Rank D": W = 2
Else

MyAdd = sRng.Address
Do
W = W + 1:
Arr(W, 1) = sRng.Offset(, -50).Value
Arr(W, 2) = sRng.Offset(, -49).Value
Set sRng = rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
ListBox1.List = Arr()

End If
End With
 
Upvote 0
Upvote 0
Em xin hỏi cách vận dụng Find này vào tìm kiếm ở 2 mảng. Trong đó mảng 1 là mã dò tìm, mảng 2 là Mảng cần tìm và ghi kết quả ạ
 
Upvote 0
. . . . cách vận dụng Find này vào tìm kiếm ở 2 mảng. Trong đó mảng 1 là mã dò tìm, mảng 2 là Mảng cần tìm và ghi kết quả ạ
Cả 2 mảng này thả vô nước sẽ nổi hay chìm?
& sau đó ghi kết quả vô vách đá hay lên cát?
 
Upvote 0
Cả 2 mảng này thả vô nước sẽ nổi hay chìm?
& sau đó ghi kết quả vô vách đá hay lên cát?

Chào chú Sa và các anh.

Cháu/em có đoạn này, nó hơi cùi, cháu chấp nhận nó chạy lâu 1 chút. Nhưng khi chạy cứ báo lỗi
Compile error:
Next without For

Mặc dù cháu/em có For rồi.
Mong chú và các anh giúp đỡ lỗi này ạ.
Cháu/em cảm ơn!


Mã:
Sub Tim Kiem()

'Tim kiem tu khoa va thay the

Dim WkS1 As Worksheet

Dim WkS2 As Worksheet

Dim Match As Range

Dim ArrKey()

Dim i As Long

'Dim iLastrow As Long

Dim Type1 As String

Dim Type2 As String



Set WkS1 = ThisWorkbook.Sheets("Keys")

Set WkS2 = ThisWorkbook.Sheets("Data")

Type1 = ThisWorkbook.Sheets("Guide").Range("C3").Value

Type2 = ThisWorkbook.Sheets("Guide").Range("C4").Value



'iLastrow = WkS2.Range("B" & Rows.Count).End(xlUp).Row

ArrKey = ThisWorkbook.Sheets("Keys").Range("A1", [J5000].End(3)).Value



WkS2.Activate

ActiveSheet.Range("B2").Activate

On Error Resume Next

Do While ActiveCell.Value <> ""

   For i = 1 To UBound(ArrKey)

       If ActiveCell.Value = ArrKey(i, 3) Then

           If ArrKey(i, 4) = Type1 Then

               Set Match = ActiveCell.Find(What:=ArrKey(i, 5),
LookIn:=xlValues, _

                           LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _

                           MatchCase:=False, SearchFormat:=False)

               If Not Match Is Nothing Then

                   FirstAddress = Match.Address

                   ActiveCell.Offset(0, 4).Value = ArrKey(i, 6)

               End If

           Else

               Set Match = Left(ActiveCell, Len(ArrKey(i,
5))).Find(What:=ArrKey(i, 5), LookIn:=xlValues, _

                           LookAt:=xlWhole, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _

                           MatchCase:=False, SearchFormat:=False)

               If Not Match Is Nothing Then

                   FirstAddress = Match.Address

                   ActiveCell.Offset(0, 4).Value = ArrKey(i, 6)

           End If

       End If

   Next i



   ActiveCell.Offset(1, 0).Activate

Loop



End Sub
Bài đã được tự động gộp:

À, do cháu thiếu 1 End If.
Chú Sa và các anh có giải pháp nào nhanh hơn không ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Chào chú Sa và các anh.

Cháu/em có đoạn này, nó hơi cùi, cháu chấp nhận nó chạy lâu 1 chút. Nhưng khi chạy cứ báo lỗi
Chú Sa và các anh có giải pháp nào nhanh hơn không ạ?
Bạn đang tìm kiếm gì đó, và sau mỗi lần tìm kiếm thì lại điền giá trị nào đó vô ô nào đó và di chuyển đến ô nào đó.
Với hàng ngàn ô thì du lịch thế này rất là tốn xăng.
Giải pháp: Dùng mảng array để xử lý nhé.
Cụ thể thì bạn phải đính kèm file lên. Ghi rõ kết quả muốn có.
 
Upvote 0
Bạn đang tìm kiếm gì đó, và sau mỗi lần tìm kiếm thì lại điền giá trị nào đó vô ô nào đó và di chuyển đến ô nào đó.
Với hàng ngàn ô thì du lịch thế này rất là tốn xăng.
Giải pháp: Dùng mảng array để xử lý nhé.
Cụ thể thì bạn phải đính kèm file lên. Ghi rõ kết quả muốn có.
Vâng, đúng anh ạ. Em thấy tập tin chạy rất lâu. Em cũng nghĩ đến phương án đưa vào Mảng, nhưng Mảng lại không dùng được Find. Do em có tìm theo 2 trường hợp, 1 là bắt đầu bằng từ khoá nào đó, 2 là có chứa từ khoá nào đó.
Về nhà em sẽ đính kèm tệp tin lên nhờ các anh xem giúp ạ.
 
Upvote 0
Vâng, đúng anh ạ. Em thấy tập tin chạy rất lâu. Em cũng nghĩ đến phương án đưa vào Mảng, nhưng Mảng lại không dùng được Find. Do em có tìm theo 2 trường hợp, 1 là bắt đầu bằng từ khoá nào đó, 2 là có chứa từ khoá nào đó.
Về nhà em sẽ đính kèm tệp tin lên nhờ các anh xem giúp ạ.
Bạn vẫn dùng Find trên sheet, nhưng kết quả sẽ lưu vào array.
Lưu ý kết hợp với FindNext, nếu muốn tìm nhiều lần, và không muốn select ô nhiều lần.
 
Upvote 0
Chào chú Sa và các anh.

Cháu/em có đoạn này, nó hơi cùi, cháu chấp nhận nó chạy lâu 1 chút. Nhưng khi chạy cứ báo lỗi
Compile error:
Next without For

Mặc dù cháu/em có For rồi.
Mong chú và các anh giúp đỡ lỗi này ạ.
Cháu/em cảm ơn!


Mã:
Sub Tim Kiem()

'Tim kiem tu khoa va thay the

Dim WkS1 As Worksheet

Dim WkS2 As Worksheet

Dim Match As Range

Dim ArrKey()

Dim i As Long

'Dim iLastrow As Long

Dim Type1 As String

Dim Type2 As String



Set WkS1 = ThisWorkbook.Sheets("Keys")

Set WkS2 = ThisWorkbook.Sheets("Data")

Type1 = ThisWorkbook.Sheets("Guide").Range("C3").Value

Type2 = ThisWorkbook.Sheets("Guide").Range("C4").Value



'iLastrow = WkS2.Range("B" & Rows.Count).End(xlUp).Row

ArrKey = ThisWorkbook.Sheets("Keys").Range("A1", [J5000].End(3)).Value



WkS2.Activate

ActiveSheet.Range("B2").Activate

On Error Resume Next

Do While ActiveCell.Value <> ""

   For i = 1 To UBound(ArrKey)

       If ActiveCell.Value = ArrKey(i, 3) Then

           If ArrKey(i, 4) = Type1 Then

               Set Match = ActiveCell.Find(What:=ArrKey(i, 5),
LookIn:=xlValues, _

                           LookAt:=xlPart, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _

                           MatchCase:=False, SearchFormat:=False)

               If Not Match Is Nothing Then

                   FirstAddress = Match.Address

                   ActiveCell.Offset(0, 4).Value = ArrKey(i, 6)

               End If

           Else

               Set Match = Left(ActiveCell, Len(ArrKey(i,
5))).Find(What:=ArrKey(i, 5), LookIn:=xlValues, _

                           LookAt:=xlWhole, SearchOrder:=xlByRows,
SearchDirection:=xlNext, _

                           MatchCase:=False, SearchFormat:=False)

               If Not Match Is Nothing Then

                   FirstAddress = Match.Address

                   ActiveCell.Offset(0, 4).Value = ArrKey(i, 6)

           End If

       End If

   Next i



   ActiveCell.Offset(1, 0).Activate

Loop



End Sub
Bài đã được tự động gộp:

À, do cháu thiếu 1 End If.
Chú Sa và các anh có giải pháp nào nhanh hơn không ạ?
Nó báo như thế nhưng thực ra là thiếu 1 cái End If (VBA hơi cùi chuyện này)
3 cái End If mới tới Next i
 
Upvote 0
Vâng, đúng anh ạ. Em thấy tập tin chạy rất lâu. Em cũng nghĩ đến phương án đưa vào Mảng, nhưng Mảng lại không dùng được Find. Do em có tìm theo 2 trường hợp, 1 là bắt đầu bằng từ khoá nào đó, 2 là có chứa từ khoá nào đó.
Về nhà em sẽ đính kèm tệp tin lên nhờ các anh xem giúp ạ.
Sao mảng lại không dùng được Find? được hết chứ bạn, quan trọng là bạn gửi File lên và kết quả mong muốn thế nào?
 
Upvote 0
Sao mảng lại không dùng được Find? được hết chứ bạn, quan trọng là bạn gửi File lên và kết quả mong muốn thế nào?
Range.Find
Find chỉ làm việc với vùng trên sheet, không dùng cho array nhé bạn.
Ví dụ: "Find" thế này sẽ báo lỗi:
Mã:
Sub test()
Dim rng, f
rng = Range("A1:C10").Value
Set f = rng.Find("a")
End Sub
Nhưng nếu "Find" 1 range thì OK:
Mã:
Sub test()
Dim rng As Range, f
Set rng = Range("A1:C10")
Set f = rng.Find("a")
Debug.Print f.Address
End Sub
 
Upvote 0
Vâng anh
Range.Find
Find chỉ làm việc với vùng trên sheet, không dùng cho array nhé bạn.
Ví dụ: "Find" thế này sẽ báo lỗi:
Mã:
Sub test()
Dim rng, f
rng = Range("A1:C10").Value
Set f = rng.Find("a")
End Sub
Nhưng nếu "Find" 1 range thì OK:
Mã:
Sub test()
Dim rng As Range, f
Set rng = Range("A1:C10")
Set f = rng.Find("a")
Debug.Print f.Address
End Sub
Vâng anh ạ,
Ý em ở đây chỉ là đưa kết quả vào mảng rồi đưa xuống Sheet thôi, còn Find thì tìm trên Range rồi ạ.
 
Upvote 0
Vâng anh

Vâng anh ạ,
Ý em ở đây chỉ là đưa kết quả vào mảng rồi đưa xuống Sheet thôi, còn Find thì tìm trên Range rồi ạ.
Hơn nhau ở chỗ là mình biết linh động. Nếu không thể dùng Find được thì mình nạp dữ liệu vào Dic, rồi dùng phương thức .Exists để tìm. Miễn sao có cái cần là được rồi. Đâu nhất thiết lúc nào cũng phải dùng Find. Dictionary vạn tuế!!!
 
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.

Cho em hỏi khúc này phải để FirstAddress = Rng.Address phía dưới dòng If Not Rng Is Nothing Then đúng không? Vì nếu em chọn một vùng nào đó không có kết quả cần tìm kiếm thì kết quả trả về bị lỗi (Object variable or With block variable not set).
Đ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
 
Lần chỉnh sửa cuối:
Upvote 0
Cho em hỏi khúc này phải để FirstAddress = Rng.Address phía dưới dòng If Not Rng Is Nothing Then đúng không? Vì nếu em chọn một vùng nào đó không có kết quả cần tìm kiếm thì kết quả trả về bị lỗi (Object variable or With block variable not set).
Việc này chỉ cần thử thì biết rõ. Tại sao lại phải hỏi?

Chú thích: thử xong nhớ báo cho người viết code trên là code của y dỏm nhé.
 
Upvote 0
không có kết quả cần tìm kiếm thì kết quả trả về bị lỗi
Là đúng rồi. Tớ đang dùng find để tìm mã trùng trong bài bên cạnh đây. Cái find này chạy xong thì nó đặt within về sheet mới ức chế, thế là không thay đổi hàng loạt được.

Gặp lỗi trên, là phải on error resume next, mặc dù lệnh bỏ qua này nguy hiểm, nhưng với code khoảng 10 dòng thì nó xịn hơn cả thần chú.
 
Upvote 0
Là đúng rồi. Tớ đang dùng find để tìm mã trùng trong bài bên cạnh đây. Cái find này chạy xong thì nó đặt within về sheet mới ức chế, thế là không thay đổi hàng loạt được.

Gặp lỗi trên, là phải on error resume next, mặc dù lệnh bỏ qua này nguy hiểm, nhưng với code khoảng 10 dòng thì nó xịn hơn cả thần chú.
Người hỏi dùng từ "lỗi" lạng quạng mà người trả lời giải thích về phạm vi biến còn lạng quạng hơn.

Hàm Find khi không tìm được thì nó trả vè Nothing.
Lệnh Set gán cái Nothing này vào biến Rng. Gán Nothing thì chính xác là lệnh giải phóng bộ nhớ object (đối tượng).
Lệnh kế đó gọi thuộc tính Address của một đối tượng Rng (Range) chả có thực chất thì đương nhiên là bị lỗi "Object variable not set"
 
Upvote 0
.. . . .
Gặp lỗi trên, là phải on error resume next, mặc dù lệnh bỏ qua này nguy hiểm, nhưng với code khoảng 10 dòng thì nó xịn hơn cả thần chú.
Xài câu lệnh On Error Resume Next là người xài dao 2 lưỡi & rất dễ Đứt tay nha bạn;
Trong hàng trăm, hàng ngàn cái mã lỗi Err chì 1 hay 1 vài cái mà ta đã biết chắc là có thể bỏ qua (& đi tiếp) mà thôi;
Để chắc như bắp trong trường hợp như trường hợp dẫn ra trong bảng dữ liệu dưới đây mình đã viết vầy:
PHP:
Sub TimKiem()
 Dim Rws As Long
 Dim Rng As Range, sRng As Range
 Dim MyAdd As String
 
 Rws = [C2].CurrentRegion.Rows.Count
 Rws = [C2].Parent.UsedRange.Rows.Count
 MsgBox Rws
 Set Rng = [C2].Resize(Rws)
 Set sRng = Rng.Find("nga", , xlFormulas, xlPart)
 If sRng Is Nothing Then
    MsgBox Error()
 Else
    MyAdd = sRng.Address
    Do
        MsgBox sRng.Offset(, 1).Value
        Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
End Sub
STTHọ & TênSố tiền, K
112 cá nhân & cặp đôi9,257
13BLL Hưu trí VCS500
148 cá nhân & cặp đôi4,500
23Trương Đình Phước500
24Nguyễn Vinh500
25Phạm Đức Ninh500
26VC Bùi T. Ẩn1,000
27Chu Thái Bình500
28Hội Hưu trí PQLCL1,000
Cộng:18,257

Ghi thêm: Nếu ai đó muốn thử & bỏ kí tự 'a' trong từ "Nga" của dòng lệnh áp dụng phương thức tìm kiếm thì sẽ thấy rõ vấn đề thêm xíu
 
Upvote 0

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

Back
Top Bottom