Ý nghĩa các tham số trong Find

  • Thread starter Thread starter VRS-PRO
  • Ngày gửi Ngày gửi
Liên hệ QC

VRS-PRO

Thành viên mới
Tham gia
5/7/08
Bài viết
4
Được thích
0
Em đang muốn viết mã để tìm kiếm 1 số dữ liệu cần thiêt, nhưng một số mã em không hiểu, nhờ các anh chị giải thích dùm:
PHP:
sAddr = AllRng.Find(What:=Clls, After:=Clls, LookIn:=xlValues, _
      LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext).Address
Em hiểu sau what là giá trị cần tìm và sau after là dòng bắt đầu tìm, còn những cái còn lại chưa hiểu?. Nếu như muốn tìm vùng bắt từ vị trí sau after đến vị trí có dòng trống thì dừng lại thì phải làm thế nào để khỏi qua vùng tiếp theo ( giữa các vùng phân biệt bằng dòng trống) ?
 
Đầu tiên mình xin giải thích sơ về toàn bộ dòng lệnh theo nghĩa tiếng Việt, như sau:
Tìm giá trị Clls trong vùng AllRng, bắt đầu từ sau Clls (vừa tìm thấy), tìm giá trị trong ô (chứ không tìm công thức), tìm tất tần tật trong phạm vi quy định, . . . .
Tìm thấy ô nào đó thì lấy địa chỉ ô đó gán vô biến dạng chuỗi sAddr đã khai báo.
Thứ đến: Để tìm vùng bị ngăn bỡi dòng trống, theo mình cách tốt nhứt là bạn xử lý chỗ AllRng lại.
Có thể nó như sau:
Set sRng = Shee1.[A2].CurrentRegion.Find(What:=Clls, , LookIn:=xlValues)
Để thấy sự lợi hại của CurrentRegion bạn thử dùng lệnh Goto trong menu Edit với CSDL hiện có của bạn & tự rút ra kết luận.

Chúc vui & hẹn lúc khác được trao đổi nhiều cùng bạn.
 
Upvote 0
Tại sao phương thức Find lại cho kq không chính xác?

Em cũng mới tham khảo các bài viết của GPE về phương thức Find, và làm 1 ví dụ, nhưng có một số vấn đề chưa hiểu hết mong các bạn giúp cho. (File gởi kèm)
PHP:
Sub Find_String() 'Find va xuat Address cua Cells vua tim duoc
  Dim Rng, RngKQ As Range
  Dim FirstAddress, NextAddress, Beam As String
  Range("E2:E12").Clear

  Set Rng = Range("D2:D12")
  Rng.Interior.ColorIndex = 39
  [E1].Value = UCase([E1].Value)
  Beam = [E1].Value
  
  Set RngKQ = Rng.Find(what:=Beam, LookIn:=xlValues)
  If RngKQ Is Nothing Then
    MsgBox "Khong tim thay so lieu"
  Else
    FirstAddress = RngKQ.Address
    RngKQ.Offset(0, 1).Value = FirstAddress
    Do Until NextAddress = FirstAddress
      Set RngKQ = Rng.FindNext(RngKQ)
      NextAddress = RngKQ.Address
      RngKQ.Offset(0, 1).Value = NextAddress
    Loop
  End If
  MsgBox "Find xong"
End Sub
1. Tại sao khi giá trị Beam = B1, mà find lại không tìm ra B1 trước mà lại tìm ra B11 , B12, B13 trước rồi sau đó mới quay trở lại tìm B1?
2. Nó Find như vậy là không đúng yêu cầu của minh, vì mình chỉ muốn nó tìm chính xác B1 thôi. (Không có B11, hay B12 gì cả) thì phải làm thế nào?
3. Ở trong Sub Find_Long() mình Find 1 số, Chẳn hạn số 5, nhưng các số 51, 55, 150 ... nó vẫn cứ Find ra hết. Làm thế nào để Find duy nhất số 5?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1. Tại sao khi giá trị Beam = B1, mà find lại không tìm ra B1 trước mà lại tìm ra B11 , B12, B13 trước rồi sau đó mới quay trở lại tìm B1?
B1 ở Cell D2, do mảng của bạn là từ [D2:D12], mà tham số After bạn lại không có, do đó mặc định nó sẽ lấy ô đầu tiên trong mảng tìm kiếm After:=Range("D2") có nghĩa là tìm bắt đầu từ sau Cell D2, nghĩa là từ D3
Vì thế bạn nên thêm vào
After:=Range("D1")
Set Rng = Range("D1:D12")

2. Nó Find như vậy là không đúng yêu cầu của minh, vì mình chỉ muốn nó tìm chính xác B1 thôi. (Không có B11, hay B12 gì cả) thì phải làm thế nào?
3. Ở trong Sub Find_Long() mình Find 1 số, Chẳn hạn số 5, nhưng các số 51, 55, 150 ... nó vẫn cứ Find ra hết. Làm thế nào để Find duy nhất số 5?
Bạn thêm tham số tìm chính xác toàn bộ Cell :
PHP:
LookAt:=xlWhole
PHP:
Set RngKQ = Range("B1").Find(what:=ValueSearch, LookIn:=xlValues, LookAt:=xlWhole)
Chúc vui.
 
Upvote 0
After:=Range("D1")
Set Rng = Range("D1:D12")
Không thể để After ra riêng với Find được VB sẽ báo lỗi. Mình cho after vao Find như thê này:
PHP:
Set RngKQ = Rng.Find(What:=Beam, After:=Rng(0), LookIn:=xlValues, LookAt:=xlWhole)
cũng bị error vì không thể có Rng(0), mình lại thay bằng Rng(1) nhưng như thế thì Find lại bắt đầu tìm Từ Rng(2) => Cell D2 bị bỏ qua.

Theo mình nghỉ phải chọn After: = Cells cuối cùng trong Rng, Nhưng một cách tổng quát thì làm sao xác định được Cell cuoi cùng của Rng, Mình dùng end(xldown) thì nó Down xuông cuối cùng tất cả dữ liệu chứ không có đến Cell end của Rng? Xin các bạn giúp cho?
 
Lần chỉnh sửa cuối:
Upvote 0
Không thể để After ra riêng với Find được VB sẽ báo lỗi. Mình cho after vao Find như thê này:
Set RngKQ = Rng.Find(What:=Beam, After:=Rng(0), LookIn:=xlValues, LookAt:=xlWhole)
cũng bị error vì không thể có Rng(0), mình lại thay bằng Rng(1) nhưng như thế thì Find lại bắt đầu tìm Từ Rng(2) => Cell D2 bị bỏ qua.

Theo mình nghỉ phải chọn After: = Cells cuối cùng trong Rng, Nhưng một cách tổng quát thì làm sao xác định được Cell cuoi cùng của Rng, Mình dùng end(xldown) thì nó Down xuông cuối cùng tất cả dữ liệu chứ không có đến Cell end của Rng? Xin các bạn giúp cho?

Cell cuối là:
Rng(Rng.count)
Lúc này bạn nên thêm, ie tìm từ dưới lên. Tìm từ cuối nếu not ok quay lại đầu.
SearchDirection:=xlPrevious
Còn không khi chọn rng thì nên chọn luôn tiêu đề.
Ví dụ:
Cells(1,1): tiêu đề
Thì chọn
Set Rng=range(Cells(1,1), Cells(endrow,1))
Set RngKQ=rng(1)

Bạn thử xem, do chưa xem code nên chưa cụ thể.

Bổ sung, Find có thể tìm kiếm theo format, giống như file của bạn, tô màu hồng và bold.
 
Upvote 0
Không thể để After ra riêng với Find được VB sẽ báo lỗi. Mình cho after vao Find như thê này:
PHP:
Set RngKQ = Rng.Find(What:=Beam, After:=Rng(0), LookIn:=xlValues, LookAt:=xlWhole)
cũng bị error vì không thể có Rng(0), mình lại thay bằng Rng(1) nhưng như thế thì Find lại bắt đầu tìm Từ Rng(2) => Cell D2 bị bỏ qua.

Theo mình nghỉ phải chọn After: = Cells cuối cùng trong Rng, Nhưng một cách tổng quát thì làm sao xác định được Cell cuoi cùng của Rng, Mình dùng end(xldown) thì nó Down xuông cuối cùng tất cả dữ liệu chứ không có đến Cell end của Rng? Xin các bạn giúp cho?

Bạn không thể cho là Rng(0) bởi đơn giản Rng(0) không phải là 1 Range. Nó chỉ là 1 giá trị trong mảng Rng thôi (Rng là 1 Range).

PHP:
Set RngKQ = Rng.Find(What:=Beam, After:=Range("D1"), LookIn:=xlValues, LookAt:=xlWhole)
Vì vậy nếu bạn vẫn muốn sự tùy biến thì có thể tạo ra 1 biến tạm :

PHP:
Dim AfterRng as Range
Set AfterRng = Range("D1")
Set RngKQ = Rng.Find(What:=Beam, After:=AfterRng, LookIn:=xlValues, LookAt:=xlWhole)
Chúc vui
 
Upvote 0
Set RngKQ = Rng.Find(What:=Beam, After:=Range("D1"), LookIn:=xlValues, LookAt:=xlWhole)
Hinh như After:= Cell thuộc Rng, chứ không phải là Cell nào cũng được, After:=Range("D1") bị Error: Run time error 13 - Type mismatch
Set AfterRng = Range("D1")
Set RngKQ = Rng.Find(What:=Beam, After:=AfterRng, LookIn:=xlValues, LookAt:=xlWhole) Chúc vui
Nếu theo nguyên tắc này thì AfterRng = D1 vẫn bị Error tương tự. (Mình vừa Test xong)

Lúc post bài, thì mạng chổ mình bị out, vào lại không được, tưởng chưa post được, cố gắng post, bây giờ thấy có 2 bài...Làm sao để xóa bớt bài này đây.GPE có chức năng cho phép Thành viên xóa bài của mình không?
 
Lần chỉnh sửa cuối:
Upvote 0
Set RngKQ = Rng.Find(What:=Beam, After:=Range("D1"), LookIn:=xlValues, LookAt:=xlWhole)
Hinh như After:= Cell thuộc Rng, chứ không phải là Cell nào cũng được, After:=Range("D1") bị Error: Run time error 13 - Type mismatch
Set AfterRng = Range("D1")
Set RngKQ = Rng.Find(What:=Beam, After:=AfterRng, LookIn:=xlValues, LookAt:=xlWhole)
Chúc vui
Nếu theo nguyên tắc này thì AfterRng = D1 vẫn bị Error tương tự. (Mình vừa Test xong)
 
Lần chỉnh sửa cuối:
Upvote 0
Hinh như After:= Cell thuộc Rng, chứ không phải là Cell nào cũng được, After:=Range("D1") bị Error: Run time error 13 - Type mismatch
PHP:
Dim AfterRng as Range

Nếu theo nguyên tắc này thì AfterRng = D1 vẫn bị Error tương tự. (Mình vừa Test xong)[/quote]
Chính xác nếu After:= FoundCell,
if FoundCell không thuộc MyRng thì không được. Bởi vậy nên set như sau
[PHP]Set RngFound = MyRng(1)
With MyRng
    Set RngFound = .Find(SoCT, After:=RngFound, SearchOrder:=xlColumns, LookIn:=xlFormulas, LookAt:=xlPart, SearchDirection:=xlPrevious)
End With
Quan trọng SearchDirection:=xlPrevious


 
Upvote 0
Hinh như After:= Cell thuộc Rng, chứ không phải là Cell nào cũng được, After:=Range("D1") bị Error: Run time error 13 - Type mismatch

Nếu theo nguyên tắc này thì AfterRng = D1 vẫn bị Error tương tự. (Mình vừa Test xong)

Lúc post bài, thì mạng chổ mình bị out, vào lại không được, tưởng chưa post được, cố gắng post, bây giờ thấy có 2 bài...Làm sao để xóa bớt bài này đây.GPE có chức năng cho phép Thành viên xóa bài của mình không?

Bạn xem nhé : Nó sẽ tìm bắt đầu từ hàng thứ 2, mình chỉ sửa lại code của bạn thôi, các đoạn khác thì mình không quan tâm. Để bạn thấy là dùng After:=Range("D1") được

PHP:
Option Explicit
Sub Find_Long()
  Dim Rng, RngKQ As Range
  Dim FirstAddress, NextAddress As String
  Dim ValueSearch As Long
  Range("C2:C12").Clear
  Set Rng = Range("B1:B12")
  Rng.Interior.ColorIndex = 40
  ValueSearch = [C1].Value
  Set RngKQ = Rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlWhole, After:=Range("B1"))
  If RngKQ Is Nothing Then
    MsgBox "Khong tim thay so lieu"
  Else
    FirstAddress = RngKQ.Address
    RngKQ.Offset(0, 1).Value = FirstAddress
    Do Until NextAddress = FirstAddress
      Set RngKQ = Rng.FindNext(RngKQ)
      NextAddress = RngKQ.Address
      RngKQ.Offset(0, 1).Value = NextAddress
    Loop
  End If
  MsgBox "Find xong"
End Sub
PHP:
Sub Find_String()
  Dim Rng, RngKQ As Range
  Dim FirstAddress, NextAddress, Beam As String
  Range("E2:E12").Clear
  Set Rng = Range("D1:D12")
  Rng.Interior.ColorIndex = 39
  [E1].Value = UCase([E1].Value)
  Beam = [E1].Value
  Set RngKQ = Rng.Find(What:=Beam, LookIn:=xlValues, After:=Range("D1"), LookAt:=xlWhole)
  If RngKQ Is Nothing Then
    MsgBox "Khong tim thay so lieu"
  Else
    FirstAddress = RngKQ.Address
    RngKQ.Offset(0, 1).Value = FirstAddress
    Do Until NextAddress = FirstAddress
      Set RngKQ = Rng.FindNext(RngKQ)
      NextAddress = RngKQ.Address
      RngKQ.Offset(0, 1).Value = NextAddress
    Loop
  End If
  MsgBox "Find xong"
End Sub
Chúc vui
 
Upvote 0
1. Rng(Rng.count)
2. Bổ sung, Find có thể tìm kiếm theo format, giống như file của bạn, tô màu hồng và bold.
Thanks ThuNghi nhiều.
Nhờ ý 1. của bạn mình đã sửa chữa lại Code thành... Run ok lắm
PHP:
Set RngKQ = Rng.Find(What:=Beam, After:=Rng(Rng.Count), LookIn:=xlValues, LookAt:=xlWhole)
Rng(Rng.Count) là Cell cuối cùng của Rng, Nếu Rng là vùng gồm 1Column thì OK
Nhưng nếu Rng là 1 vùng nhiểu Column thì nó sẽ là Cell phía dưới bên phải của Rng.
1. Nếu như mình có Rng = B2:D10, mình muốn dùng 1 lệnh để chọn Cell cuối cùng dưới cột B, nghĩa là B10 thì làm sao?
2. Cảm ơn bạn đã nhớ đến file của mình trong topic trước
Find có thể tìm kiếm theo What:="", Format:=true, Tìm theo điều kiện Bold và xuấn ra gia trị 1 ở Cell kế bên, sau đó Sort theo gia tri 1, va Del tat ca nhung hang Trống ở dưới.
Mình nghĩ ra quy trình như thế chưa làm. mình sẽ sớm làm... thanks ThuNghi
Set RngKQ = Rng.Find(What:=Beam, LookIn:=xlValues, After:=Range("D1"), LookAt:=xlWhole)
Set RngKQ = Rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlWhole, After:=Range("B1"))
Cả hai câu lềnh này điều Error 13 bạn ạ. Bạn hãy cho nó vào file rồi Run sẽ thấy kết quả. Thân chào.
 
Lần chỉnh sửa cuối:
Upvote 0
1. Nếu như mình có Rng = B2:D10, mình muốn dùng 1 lệnh để chọn Cell cuối cùng dưới cột B, nghĩa là B10 thì làm sao?
Cách 1/ Set iRng=Rng.Resize(, 2)
Bạn xem link sau để biết về resize
http://www.giaiphapexcel.com/forum/showthread.php?t=13005
Cách 2/ Set Rng=Rng(Rng.Count).Offset(, -1) 'Lưu ý là lấy vì rng có 2 cột.
Cách 3/ Set RngKQ =[B10] ' biết chắc rồi, ct gì cho mệt.
Chúc thành công.
 
Upvote 0
Cách 1/ Set iRng=Rng.Resize(, 2)
Bạn xem link sau để biết về resize
http://www.giaiphapexcel.com/forum/showthread.php?t=13005
Cách 2/ Set Rng=Rng(Rng.Count).Offset(, -1) 'Lưu ý là lấy vì rng có 2 cột.
Cách 3/ Set RngKQ =[B10] ' biết chắc rồi, ct gì cho mệt.
Chúc thành công.
Cách 1 thi chỉ Resize thành 1 iRng có 2 cột (Chưa xác định được B10)
Cách 2, Cách 3 Chỉ áp dụng cho trường hợp cụ thể (Nhiều lúc cần tổng quát thì ko được)
Nhưng từ Cách 1 của bạn mình Viết dc code này -> Xác định đúng Cell B10
PHP:
Sub EndCell()
  Dim Rng, EndRng As Range
  Set Rng = [B2:D10]
  Set EndRng = Rng.Resize(, 1)(Rng.Resize(, 1).Count)
  EndRng.Select
End Sub
Set EndRng = Rng.Resize(, 1)(Rng.Resize(, 1).Count) đã là ngắn gọn và ưu việt chưa? thì mình không biết. Mong cao kiến của các bạn?
 
Upvote 0
Trích:
Nguyên văn bởi Lệnh Hồ Đại Hiệp
Set RngKQ = Rng.Find(What:=Beam, LookIn:=xlValues, After:=Range("D1"), LookAt:=xlWhole)
Set RngKQ = Rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlWhole, After:=Range("B1"))


Cả hai câu lềnh này điều Error 13 bạn ạ. Bạn hãy cho nó vào file rồi Run sẽ thấy kết quả. Thân chào.
Bạn xem File bên dưới nhé :
Hãy để ý việc SET vùng tìm kiếm và tham số After:

PHP:
  Set Rng = Range("B1:B12")

  Set RngKQ = Rng.Find(What:=ValueSearch, LookIn:=xlValues, LookAt:=xlWhole, After:=Range("B1"))
PHP:
  Set Rng = Range("D1:D12")
  Set RngKQ = Rng.Find(What:=Beam, LookIn:=xlValues, After:=Range("D1"), LookAt:=xlWhole)
Ở đây là tìm chính xác nhé, vì vậy nó chỉ tìm được 1 Cell.

Chúc vui.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom