Khắc phục sửa đoạn code Find next

Liên hệ QC

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
356
Đượ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
 
Web KT
Back
Top Bottom