Khắc phục sửa đoạn code Find next (1 người xem)

Liên hệ QC

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

congnguyen88

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
22/7/14
Bài viết
355
Được thích
31
Hôm qua em có hỏi 1 đoạn code FInd Next ở bài này
.

Code của bạn
phamvanphuc86
Viết gần đúng rồi. Tức là giống như anh
batman1 nói
Bạn nhập E4 = a, rồi nhấn "Find Next". Sẽ có lúc bạn thấy E4 được chọn. Tức không đúng yêu cầu.
Bây giờ bạn tưởng tượng là trong tập tin thực ngoài cột C và E4 ra có 100 ô trên trang tính cũng có giá trị "a". Khi nhấn nút thì sẽ có lúc bạn phải nhấn 100 lần để ô được chọn trở về cột C .


Hôm qua em test mà em vội quá chưa xem kỷ . giờ em mới thấy khi em nhập chử "A" thì nó quét hết trang tính luôn chứ không theo cột C. Mong mọi người sửa giúp code để cho hoàn thiện. Em xin cảm ơn các anh chị diễn đàn


Mã:
Sub timkiem()
Dim i As Long, j As Long, Tmp As String

  ReDim Mang(1 To 5003)
    For i = 4 To 5003
        Tmp = Range("C" & i).Value
        If UCase(Tmp) = UCase(Range("E4").Value) Then
            j = j + 1
            Mang(j) = i
        End If
    Next i
If Mang(1) = "" Then
    MsgBox "Khong tim thay"
Else
  
   Cells.Find(What:=Range("e4").Value, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole).Activate
End If
End Sub

1585025248621.png
 
Tìm & thay dòng lệnh trên thành dòng lệnh dưới xem thế nào.
Mã:
'Cells.Find(What:=Range("e4").Value, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole).Activate
 Sheet1.Range("C4:C5003").Find(What:=Range("e4").Value, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole).Activate
 
Tìm & thay dòng lệnh trên thành dòng lệnh dưới xem thế nào.
Mã:
'Cells.Find(What:=Range("e4").Value, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole).Activate
Sheet1.Range("C4:C5003").Find(What:=Range("e4").Value, After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole).Activate
cảm ơn bạn. Nhưng sao nó lại báo lỗi bạn ơi
1585030612725.png
 
Dưới đây là phương thức Find Next của Excel được vận dụng trong VBA, chứ không phải phương thức tương tự.

-------------------------
PHP:
Sub FindNextXL()
  On Error Resume Next
  Static Area As Range, F As Range
  If F Is Nothing Then
    ''Tìm tất cả ô
    ''Set Area = Cells
    ''Tìm ở cột [C4:C100]
    Set Area = [C4:C100]
    Set F = Area.Find([E4].Value, , xlFormulas, xlWhole)
  Else
    Set F = Area.FindNext(F)
  End If
  F.Select
  On Error GoTo 0
End Sub
 
dạ em có đọc nội quy rồi. Nhưng bên Đề tài đó không còn ai trả lời nữa thầy ạ
Trên cơ sở nào bạn nói là không ai trả lời nữa? Bạn viết bài và bạn muốn có ai đó trả lời ngay?
Rõ ràng là vi phạm nội qui.
Tôi đã trả lời ở "bên kia". Theo đúng yêu cầu là mỗi lần nhấn "Find Next" là chọn 1 ô (tiếp theo)

 
Dưới đây là phương thức Find Next của Excel được vận dụng trong VBA, chứ không phải phương thức tương tự.

-------------------------
PHP:
Sub FindNextXL()
  On Error Resume Next
  Static Area As Range, F As Range
  If F Is Nothing Then
    ''Tìm tất cả ô
    ''Set Area = Cells
    ''Tìm ở cột [C4:C100]
    Set Area = [C4:C100]
    Set F = Area.Find([E4].Value, , xlFormulas, xlWhole)
  Else
    Set F = Area.FindNext(F)
  End If
  F.Select
  On Error GoTo 0
End Sub
Sao code chỉ đi timg dòng cuối hở anh?
 
Sao code chỉ đi timg dòng cuối hở anh?
-------------------------------


Trước khi bạn hỏi điều gì thì phải cho tôi biết bạn đã thử code như thế nào ở đâu, dữ liệu ra sao.

Bạn không nên hỏi tắc ngang như vậy. Vì bài viết này là của một người khác.
 
-------------------------------


Trước khi bạn hỏi điều gì thì phải cho tôi biết bạn đã thử code như thế nào ở đâu, dữ liệu ra sao.

Bạn không nên hỏi tắc ngang như vậy. Vì bài viết này là của một người khác.
Hi hi... em nhầm
Em xin lỗi anh nhé
 
-------------------------------


Trước khi bạn hỏi điều gì thì phải cho tôi biết bạn đã thử code như thế nào ở đâu, dữ liệu ra sao.
Theo tôi nếu tôi mở tập tin có E4 = a, và nhất nút lần đầu thì ô tìm thấy phải là ô đầu tiên C4. Code trả về ô C9.
------------
Theo tôi nếu nhấn nút lần đầu thì phải có C4. Nếu sau đó tôi làm việc trên sheet 1 tiếng (nhập dữ liệu, làm những việc khác), ô active thay đổi nhiều, thậm chí có thể không trong cột C, và lại nhấn nút thì lại phải trả về C4. Vì làm sao nhớ được là "trước đó" đang có C4 active và bây giờ phải là C9? Theo cách của tôi thì khi ô hiện hành không thuộc cột C hoặc khi ô hiện hành không = a thì chấp nhận tìm lại từ đầu. Tất nhiên về chuyện này thì cần tự thống nhất cho mình cách tìm.
 
Dưới đây là phương thức Find Next của Excel được vận dụng trong VBA, chứ không phải phương thức tương tự.

-------------------------
PHP:
Sub FindNextXL()
  On Error Resume Next
  Static Area As Range, F As Range
  If F Is Nothing Then
    ''Tìm tất cả ô
    ''Set Area = Cells
    ''Tìm ở cột [C4:C100]
    Set Area = [C4:C100]
    Set F = Area.Find([E4].Value, , xlFormulas, xlWhole)
  Else
    Set F = Area.FindNext(F)
  End If
  F.Select
  On Error GoTo 0
End Sub

dạ em cảm ơn nhiều. em có thử em nhập chử "b" mà trong vùng C4:C30 lại không có chử "b" mà code nó vẩn select chử "a" là sao anh. có khi nào nhầm không a
1585060960598.png
Bài đã được tự động gộp:

Trên cơ sở nào bạn nói là không ai trả lời nữa? Bạn viết bài và bạn muốn có ai đó trả lời ngay?
Rõ ràng là vi phạm nội qui.
Tôi đã trả lời ở "bên kia". Theo đúng yêu cầu là mỗi lần nhấn "Find Next" là chọn 1 ô (tiếp theo)

dạ em xin lổi thầy. lần sau em sẽ không vi phạm nửa. Mong thầy tha cho em lần này . huhu
 
dạ em cảm ơn nhiều. em có thử em nhập chử "b" mà trong vùng C4:C30 lại không có chử "b" mà code nó vẩn select chử "a" là sao anh. có khi nào nhầm không a
Thì code là sai chứ sao nữa.
Nếu khi nhấn "Find Next" lần đầu mà E4 = a thì sau đó có đổi E4 = b thì mãi mãi code chỉ tìm "a" thôi. :D
dạ em xin lổi thầy. lần sau em sẽ không vi phạm nửa. Mong thầy tha cho em lần này . huhu
Thì tôi tha nên mới không xóa bài ở bên kia. Xem giải pháp của tôi ở bên kia.
 
Thì code là sai chứ sao nữa.
Nếu khi nhấn "Find Next" lần đầu mà E4 = a thì sau đó có đổi E4 = b thì mãi mãi code chỉ tìm "a" thôi. :D

Thì tôi tha nên mới không xóa bài ở bên kia. Xem giải pháp của tôi ở bên kia.

Em có trả lời bên đó rồi thầy. Có xào qua xào lại tí nữa mới ổn định. Do em test nhập dấu * (dấu sao ) nó select sai nên em tự Fix được rồi. Cảm ơn thầy
 
dạ em cảm ơn nhiều. em có thử em nhập chử "b" mà trong vùng C4:C30 lại không có chử "b" mà code nó vẩn select chử "a" là sao anh. có khi nào nhầm không a
------------------
Bạn lưu ý Phương thức Find Mặc định sẽ tìm hàng sau hàng đầu tiên của Đối tượng.


Sửa lại như vầy:


------------------
PHP:
Sub FindNextXL()
  On Error Resume Next
  Static Area As Range, F As Range, Vl As Variant
  If F Is Nothing Or [E4].Value <> Vl Then
    Set Area = [C4:C100]
    Set F = Area.Find([E4].Value, , xlFormulas, xlWhole)
    Vl = [E4].Value
  Else
    Set F = Area.FindNext(F)
  End If
  If Not F Is Nothing Then F.Select
  On Error GoTo 0
End Sub
 
Theo tôi nếu tôi mở tập tin có E4 = a, và nhất nút lần đầu thì ô tìm thấy phải là ô đầu tiên C4. Code trả về ô C9.
------------
Theo tôi nếu nhấn nút lần đầu thì phải có C4. Nếu sau đó tôi làm việc trên sheet 1 tiếng (nhập dữ liệu, làm những việc khác), ô active thay đổi nhiều, thậm chí có thể không trong cột C, và lại nhấn nút thì lại phải trả về C4. Vì làm sao nhớ được là "trước đó" đang có C4 active và bây giờ phải là C9? Theo cách của tôi thì khi ô hiện hành không thuộc cột C hoặc khi ô hiện hành không = a thì chấp nhận tìm lại từ đầu. Tất nhiên về chuyện này thì cần tự thống nhất cho mình cách tìm.
------------------------


Vậy Bác batman1 đã Chọn vùng trong Excel C4:C100 và tìm tiếp hay chưa. Lần đầu tiên nó không bao giờ tìm hàng đầu tiên.

Chính vì vậy mà Thủ tục trên giống Form tìm kiếm của Excel.

Cũng dễ hiểu bởi vì nằm ở hàng đầu tiên thì nhìn là thấy rồi.

Trong code trừ khi nhất thiết phải tìm cả hàng đầu tiên thì tìm một cách khác để giải quyết.
 
------------------
Bạn lưu ý Phương thức Find Mặc định sẽ tìm hàng sau hàng đầu tiên của Đối tượng.


Sửa lại như vầy:


------------------
PHP:
Sub FindNextXL()
  On Error Resume Next
  Static Area As Range, F As Range, Vl As Variant
  If F Is Nothing Or [E4].Value <> Vl Then
    Set Area = [C4:C100]
    Set F = Area.Find([E4].Value, , xlFormulas, xlWhole)
    Vl = [E4].Value
  Else
    Set F = Area.FindNext(F)
  End If
  If Not F Is Nothing Then F.Select
  On Error GoTo 0
End Sub
Hi hi... bây giờ mới coi như là gần đúng
 
------------------------


Vậy Bác batman1 đã Chọn vùng trong Excel C4:C100 và tìm tiếp hay chưa. Lần đầu tiên nó không bao giờ tìm hàng đầu tiên.

Chính vì vậy mà Thủ tục trên giống Form tìm kiếm của Excel.

Cũng dễ hiểu bởi vì nằm ở hàng đầu tiên thì nhìn là thấy rồi.

Trong code trừ khi nhất thiết phải tìm cả hàng đầu tiên thì tìm một cách khác để giải quyết.
1. Nếu bạn dùng Find ngoài sheet thì khi nhấn "Find Next" lần đầu tiên thì nó cũng tìm thấy kết quả đầu tiên chứ không phải kết quả thứ 2.

2. Bạn viện lý do là Find dùng mặc định khi không nhập After. Bạn ạ, không ai bắt bạn phải dùng mặc định. Nếu muốn tìm từ kết quả đầu tiên thì chỉ rõ After thôi. Như tôi làm đó. Bạn không chỉ rõ After mà viện lý do mặc định là không thuyết phục. Vì chẳng ai bắt bạn phải dùng mặc định.

3. Bạn nói
Cũng dễ hiểu bởi vì nằm ở hàng đầu tiên thì nhìn là thấy rồi.
???
Người ta có thể có tới 5000 dòng dữ liệu. Nếu người ta muốn tìm "a" mà dòng đầu tiên có "a" là dòng 1234 thì có nhìn bằng trí tưởng tượng cũng không thể biết nó ở đâu. Nhìn bằng mắt cũng không thể biết. Chỉ còn nước cuộn thật chậm xuống dưới và căng mắt mới phát hiện ra. "Chậm" và "căng mắt" là điều kiện cần, vì nhanh và không căng mắt thì có thể bỏ sót, không phát hiện ra.
 

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

Back
Top Bottom