Dùng For Next không cho kết quả đúng

  • Thread starter Thread starter nhatky@
  • Ngày gửi Ngày gửi
Liên hệ QC

nhatky@

Thành viên mới
Tham gia
1/10/11
Bài viết
24
Được thích
0
Em đang tìm hiều về vòng lặp For Next. Nhưng trong ví dụ này không hiểu sao vẫn không cho kết quả đúng. Em đưa bài lên đây nhờ mọi người giúp em nhé!
 

File đính kèm

Em đang tìm hiều về vòng lặp For Next. Nhưng trong ví dụ này không hiểu sao vẫn không cho kết quả đúng. Em đưa bài lên đây nhờ mọi người giúp em nhé!
Cái này lòng vòng quá , không hiểu.
PHP:
Sub Tim()
    Dim Vung As Range, MyR As Range, Gtri As Range
    Dim cll
    Dim eR As Long
    Set Gtri = S1.Range("D1")
    eR = S1.Range("C1000").End(3).Row
    Set Vung = S1.Range(S1.[a2], S1.[a1000].End(3))
    Set MyR = Vung.Find(cll, , xlValues, xlWhole)
    With S1
        .Range("B2:B" & eR).ClearContents
        'Em dang tim hieu ve vong lap nay nho moi nguoi chi ky cho em nhe!
        For Each cll In Vung
            If cll.Value = Gtri.Value Then
                .Cells(eR, 2) = cll.Value
            Else
            'Sao em bay loi the nay van khong on?
                MsgBox "Ma nay khong co. Hay tim lai!", , "GPE"
                Exit Sub
            End If
        Next
    End With
    Set Gtri = Nothing
    Set Vung = Nothing
    Set MyR = Nothing
End Sub
Thử xài cái này xem có chạy đúng ý muốn không
PHP:
Public Sub GPE()
Dim Rngs As Range, Clls As Range
Set Rngs = Range("A2:A" & Range("A1000").End(xlUp).Row)
Rngs.Offset(, 1).ClearContents
If Application.WorksheetFunction.CountIf(Rngs, [D1]) > 0 Then
    For Each Clls In Rngs
        If Clls.Value = [D1].Value Then Clls.Offset(, 1).Value = Clls.Value
    Next
Else
MsgBox "Khong co Ma nay"
End If
Set Rngs = Nothing
End Sub
 
Upvote 0
Một số câu lệnh của bạn còn sai, mình đoán vậy:

PHP:
Option Explicit
Sub Tim()
    Dim Vung As Range, MyR As Range, GTri As Range
    Dim Cll, eR As Long
    
    Set GTri = S1.Range("D1")
2    eR = S1.Range("C1000").End(3).Row
    Set Vung = S1.Range(S1.[a2], S1.[a1000].End(3))
4    Set MyR = Vung.Find(Cll, , xlValues, xlWhole)
    
    With S1
        .Range("B2:B" & eR).ClearContents
        'Em dang tim hieu ve vong lap nay nho moi nguoi chi ky cho em nhe!
        For Each Cll In Vung
            If Cll.Value = GTri.Value Then
                .Cells(eR, 2) = Cll.Value
            Else
            'Sao em bay loi the nay van khong on?
                MsgBox "Ma nay khong co. Hay tim lai!", , "GPE"
                Exit Sub
            End If
        Next
    End With
    Set GTri = Nothing:          Set Vung = Nothing
    Set MyR = Nothing
End Sub

(1) Sau câu lệnh dòng 2 bạn biết eR của bạn mang trị nào không?
Hình như bạn mong nó là số 16, nhưng nó đang là 1;

(2) Câu lệnh mang số 4 cùa bạn chưa đúng, bạn biết biến Cll của bạn đang có trị là gì không?

(3) Bạn nghi6n cứu macro này xem sao:

PHP:
Sub TimTiep()
 Dim GTri, Vung As Range, MyR As Range, Cls As Range
 Dim eR As Long
 
 GTri = S1.Range("D1").Value
 eR = S1.Range("A1000").End(xlUp).Row
 Set Vung = S1.[a2].Resize(eR)
6 Set MyR = Vung.Find(GTri, , xlValues, xlWhole)
 If Not MyR Is Nothing Then 
    S1.Range("B2:B" & eR).ClearContents
    Set Vung = MyR.Resize(eR)
    For Each Cls In Vung
      With S1.Cells(eR, "B").End(xlUp).Offset(1)
         If Cls.Value = GTri Then .Value = GTri
      End With
    Next Cls
  Else
        MsgBox "Nothing"
  End If
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em đang tìm hiều về vòng lặp For Next. Nhưng trong ví dụ này không hiểu sao vẫn không cho kết quả đúng. Em đưa bài lên đây nhờ mọi người giúp em nhé!

Nếu yêu cầu chỉ đơn giản như file của bạn thì code này cũng cho kết quả mong muốn
Mã:
Sub Macro2()
    [b2:b65000].Clear
    For Each cls In Range([a2], [a65000].End(3))
        If cls = [d1] Then [b65000].End(3)(2) = cls
    Next
End Sub
 
Upvote 0
Chưa hẵn đâu Trung Chính À!

Vì tác giả đưa fương thức tìm kiếm vô để thoát ngay vòng lặp khi không tìm thấy trị;

Tuy nhiên tác giả chưa nhuần nhuyễn fương thức này, nên macro chưa theo mong mõi!
 
Upvote 0
Vì tác giả đưa fương thức tìm kiếm vô để thoát ngay vòng lặp khi không tìm thấy trị;

Tuy nhiên tác giả chưa nhuần nhuyễn fương thức này, nên macro chưa theo mong mõi!

1. Em xin lỗi vì ngại không xem code của tác giả nên không hiểu chủ ý
2. Em đã test code của thầy nhưng thấy kết quả vẫn chưa đúng vì trong nguồn có 4 chữ A nhưng kết quả mới chỉ cho 3
 
Upvote 0
Ờ hén, đúng là còn chuyện vùng tìm cần lấy thêm ô trên cùng

Vậy dòng lệnh trước số 6 nên sửa lại là vầy sẽ đúng
PHP:
 Set Vung = S1.[a1].Resize(eR)

Cảm ơn Trung Chính nhiều nha!
 
Upvote 0
Cái này ta viết code dựa trên cơ sở Advanced Filter là sướng nhất, khỏi For.. Next gì cả
- Đầu tiên copy A1 đến D1 (tạo tiêu đề)
- Gõ gì đó vào D2 và chạy code này
PHP:
Sub Tim()
  Range("B:B").ClearContents
  Range("A:A").AdvancedFilter 2, Range("D1:D2"), Range("B1")
End Sub
Có thể viết code dựa trên sự kiện Change để code tự chạy (khỏi bấm nút)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vậy dòng lệnh trước số 6 nên sửa lại là vầy sẽ đúng

Cho em hỏi ngoài lề một chút nha bác ChanhTQ@, đánh số thứ tự trong code để làm gì, đánh số như vậy có ảnh hưởng code hay không? Nó có phải là một label hay không?
 
Upvote 0
Đánh số chỉ ảnh hưởng đến code khi

(*) Số trong 1 module trùng lặp;

(*) Số với từ đầu của câu lệnh dính liền nhau


Đánh số để ta có thể Goto đến số đó; Tuy nhiên mình ít khi xài; Mà chỉ để hướng dẫn cho bản thân sau này đọc lại đỡ tốn thời gian hay có thể dùng để hướng dẫn người khác mà không bị VBA cự nự, như ta đã gặp bên trên.

Kết hợp việc đánh số với bẫy lỗi sẽ cho ta biết dòng nào đang bị lỗi ngay tấp lự ( Nhờ Erl)
Tham khảo #3 tại http://www.giaiphapexcel.com/forum/showthread.php?9753-Quản-lý-tệp-tin-trong-cùng-thư-mục.&
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom