Giúp code tìm ngược (1 người xem)

Liên hệ QC

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

mickeybh

Thành viên hoạt động
Tham gia
26/9/13
Bài viết
156
Được thích
33
Gửi các anh chị và các bạn trên GPE!

Trước đây mình có sưu tầm được code tìm ngược ở đâu đó trên GPE và của ai đó thì mình cũng không nhớ.
Mã:
Sub timnguoc()
Dim Rng As Range, sRng As Range
 
Set Rng = Range("B2:B65536")
Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
Set sRng = Rng.FindPrevious(sRng)
Else: Exit Sub
End If
Range("A3") = sRng.Offset(, 1).Value
End Sub

Gần đây mình cần dùng nên test lại thì thấy nó cho ra kết quả không được như ý mà nguyên nhân thì cũng chẳng biết từ đâu.
Nói nôm na cho dễ hiểu: trong file mình đính kèm lên, A2 chứa nội dung cần tìm trong cột B, Cột C chứa giá trị mình cần lấy, giá trị sau khi tìm thấy gán vào A3.
Ví dụ tìm: 245 cho ra kết quả 7, 456 cho ra kết quả 4,... nhưng tìm 123 thì nó lại cho ra 1 mà kết quả mong muốn là 10.

Mong các bạn và anh chị giúp đỡ!
 

File đính kèm

Gửi các anh chị và các bạn trên GPE!

Trước đây mình có sưu tầm được code tìm ngược ở đâu đó trên GPE và của ai đó thì mình cũng không nhớ.
Mã:
Sub timnguoc()
Dim Rng As Range, sRng As Range
 
Set Rng = Range("B2:B65536")
Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
Set sRng = Rng.FindPrevious(sRng)
Else: Exit Sub
End If
Range("A3") = sRng.Offset(, 1).Value
End Sub

Gần đây mình cần dùng nên test lại thì thấy nó cho ra kết quả không được như ý mà nguyên nhân thì cũng chẳng biết từ đâu.
Nói nôm na cho dễ hiểu: trong file mình đính kèm lên, A2 chứa nội dung cần tìm trong cột B, Cột C chứa giá trị mình cần lấy, giá trị sau khi tìm thấy gán vào A3.
Ví dụ tìm: 245 cho ra kết quả 7, 456 cho ra kết quả 4,... nhưng tìm 123 thì nó lại cho ra 1 mà kết quả mong muốn là 10.

Mong các bạn và anh chị giúp đỡ!
Theo tôi hiểu thì bạn muốn tìm lấy giá trị lớn nhất trong các mã trùng nhau đúng không?
 
Upvote 0
Ah không, tìm lấy kết quả cuối cùng ứng với giá trị dò tìm chứ không có lớn nhỏ gì ở đây. Cột C mình lười nhập giá trị nên kéo số cho nó nhanh ấy mà.
 
Upvote 0
Gửi các anh chị và các bạn trên GPE!

Trước đây mình có sưu tầm được code tìm ngược ở đâu đó trên GPE và của ai đó thì mình cũng không nhớ.
Mã:
Sub timnguoc()
Dim Rng As Range, sRng As Range
 
Set Rng = Range("B2:B65536")
Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
Set sRng = Rng.FindPrevious(sRng)
Else: Exit Sub
End If
Range("A3") = sRng.Offset(, 1).Value
End Sub

Gần đây mình cần dùng nên test lại thì thấy nó cho ra kết quả không được như ý mà nguyên nhân thì cũng chẳng biết từ đâu.
Nói nôm na cho dễ hiểu: trong file mình đính kèm lên, A2 chứa nội dung cần tìm trong cột B, Cột C chứa giá trị mình cần lấy, giá trị sau khi tìm thấy gán vào A3.
Ví dụ tìm: 245 cho ra kết quả 7, 456 cho ra kết quả 4,... nhưng tìm 123 thì nó lại cho ra 1 mà kết quả mong muốn là 10.

Mong các bạn và anh chị giúp đỡ!
Mình kém nên chuyên chọn cách dễ mà thôi
PHP:
Sub timnguoc()
Dim nguon(), i, dk
dk = [A2]
nguon = Range([B2], [C65536].End(3)).Value
For i = UBound(nguon) To 1 Step -1
    If nguon(i, 1) = dk Then
        [A3] = nguon(i, 2)
        Exit Sub
    End If
Next
End Sub
 
Upvote 0
Cảm ơn quanghai1969! Code cho ra kết quả như mình mong muốn nhưng đây là dữ liệu test nên cột chứa giá trị dò và cột kết quả mình để gần nhau. Còn thực tế nó cách nhau gần 60 cột, thế thì "nguon" sẽ "rộng" hơn và thời gian cho kết quả sẽ lâu hơn? (Theo suy nghĩ cá nhân của mình, nếu không đúng mong được bạn và mọi người giải đáp). Code mình đưa ra bên trên tìm trong 1 cột và mình sẽ dịch chuyển qua gần 60 cột để lấy kết quả.
 
Upvote 0
Cảm ơn quanghai1969! Code cho ra kết quả như mình mong muốn nhưng đây là dữ liệu test nên cột chứa giá trị dò và cột kết quả mình để gần nhau. Còn thực tế nó cách nhau gần 60 cột, thế thì "nguon" sẽ "rộng" hơn và thời gian cho kết quả sẽ lâu hơn? (Theo suy nghĩ cá nhân của mình, nếu không đúng mong được bạn và mọi người giải đáp). Code mình đưa ra bên trên tìm trong 1 cột và mình sẽ dịch chuyển qua gần 60 cột để lấy kết quả.
Thì khai báo nguồn lấy hết 60 cột, rồi gán kết quả xuống dùng cột 60. Thử thay vào đi rồi tính.
Chẳng hạn thế này [A3]=nguon(i,60)
 
Upvote 0
Thì mình thử như vậy nên mới có nhận xét trên, dữ liệu ít quá nên chưa thể phán xét nhanh chậm được.
 
Upvote 0
Thì mình thử như vậy nên mới có nhận xét trên, dữ liệu ít quá nên chưa thể phán xét nhanh chậm được.
Bạn đã test thử code của anh Quanghai chưa mà đã đưa ra nhận xét như vậy?
Cách của anh Quanghai rất dễ hiểu đặc biệt với những người mới học VBA như tôi. Và tôi nghĩ dùng mảng tốc độ cũng sẽ nhanh thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Hình như bạn không đọc bài #5. Dữ liệu mình chưa nhiều nên không thể đưa ra kết luận nhưng theo suy nghĩ cá nhân của mình so sánh tìm 1 cột với nhiều cột mà thôi.
 
Upvote 0
Bạn chưa dùng mảng bao giờ à? Ở đây nó có duyệt qua từng cột đâu mà nhiều cột thì chậm còn ít cột thì nhanh. Bạn cứ thử dùng code của anh QuangHai thử đi đã nếu cần thì thêm dòng code để so sánh thời gian giữa 2 đoạn code là biết ngay thôi mà.
Bạn đưa File thật nên đi mọi người test hộ cho.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chưa dùng mảng bao giờ à? Ở đây nó có duyệt qua từng cột đâu mà nhiều cột thì chậm còn ít cột thì nhanh. Bạn cứ thử dùng code của anh QuangHai thử đi đã nếu cần thì thêm dong code để so sánh thời gian giữa 2 đoạn code là biết ngay thôi mà.
Bạn đưa File thật nên đi mọi người test hộ cho.

Dùng thí tất nhiên là dùng rồi nhưng để đưa ra kết luận nó nhanh hơn tìm kiếm theo phương thức FIND thì mình không dám kết luận như bạn. Trên cơ bản mình nhờ các bạn và anh chị thử code trên và khắc phục cho ra kết quả như mình mong muốn và đã nhận thêm 1 code mới của quanghai1969, mình có đánh giá sơ qua theo cá nhân của mình và tác giả của code chưa có ý kiến gì mà bạn thì cứ nhảy vào phán xét. Xem như là bạn đúng đi nữa thì cũng nên dừng ở đây để tránh loãng topic.
Có gì không phải mong các bạn bỏ qua.
 
Upvote 0
Dùng thí tất nhiên là dùng rồi nhưng để đưa ra kết luận nó nhanh hơn tìm kiếm theo phương thức FIND thì mình không dám kết luận như bạn. Trên cơ bản mình nhờ các bạn và anh chị thử code trên và khắc phục cho ra kết quả như mình mong muốn và đã nhận thêm 1 code mới của quanghai1969, mình có đánh giá sơ qua theo cá nhân của mình và tác giả của code chưa có ý kiến gì mà bạn thì cứ nhảy vào phán xét. Xem như là bạn đúng đi nữa thì cũng nên dừng ở đây để tránh loãng topic.
Có gì không phải mong các bạn bỏ qua.
Thật ra phương thức Find nhanh hơn nhiều. Nhưng do đặc điểm dữ liệu thì dùng Find có thể vất vả. Tuy nhiên mảng cũng rất nhanh, tốc độ chẳng đáng bao nhiêu vì bạn chỉ tìm có 1 điều kiện.
Khi dùng Find thì phải am hiểu FindNext hoặc FindPrevious, rồi kèm theo Do Loop... mệt lắm
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng thí tất nhiên là dùng rồi nhưng để đưa ra kết luận nó nhanh hơn tìm kiếm theo phương thức FIND thì mình không dám kết luận như bạn. Trên cơ bản mình nhờ các bạn và anh chị thử code trên và khắc phục cho ra kết quả như mình mong muốn và đã nhận thêm 1 code mới của quanghai1969, mình có đánh giá sơ qua theo cá nhân của mình và tác giả của code chưa có ý kiến gì mà bạn thì cứ nhảy vào phán xét. Xem như là bạn đúng đi nữa thì cũng nên dừng ở đây để tránh loãng topic.
Có gì không phải mong các bạn bỏ qua.
Tôi chẳng phán xét gì cả. Tôi chỉ góp ý với bạn thôi. Tôi không biết phương thức Find của bạn nhanh đến mức độ nào nhưng khi bạn dùng cách này thì có ra kết quả như bạn mong muốn đâu? Tôi ví dụ, xe máy nhanh hơn xe đạp nhưng xe máy bị hỏng thì bạn sẽ dùng xe máy hay xe đạp đây???(Tất nhiên bạn chỉ có 1 xe máy(Find) và 1 xe đạp(code anh QuangHai))
 
Upvote 0
Cảm ơn quanghai1969 nhiều.
Mong các bạn giúp mình sửa giúp code mình sưu tầm và gửi ở đầu bài để cho ra kết quả như mong muốn.
 
Upvote 0
Cảm ơn quanghai1969 nhiều.
Mong các bạn giúp mình sửa giúp code mình sưu tầm và gửi ở đầu bài để cho ra kết quả như mong muốn.
Bạn thử xem đã được chưa nhé!
Sub timnguoc()
Dim Rng As Range, sRng As Range
Set Rng = Range("B1:B65536")
Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
Set sRng = Rng.FindPrevious(sRng)
Else: Exit Sub
End If
Range("A3") = sRng.Offset(, 1).Value
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
To Mickeybh:
Bạn đã test thử chưa vậy? Kết quả thế nào?
 
Lần chỉnh sửa cuối:
Upvote 0
Được rồi nhưng mình không hiểu vì sao phải từ B1 mà không phải từ B2? Hay bắt buột phải có dòng đầu là dòng tiêu đề?
Mình thấy giá trị tìm kiếm nếu nằm ở dòng đầu vùng tìm kiếm thì nó chỉ cho ra kết quả tương ứng với dòng đầu.
 
Upvote 0
Được rồi nhưng mình không hiểu vì sao phải từ B1 mà không phải từ B2? Hay bắt buột phải có dòng đầu là dòng tiêu đề?
Mình thấy giá trị tìm kiếm nếu nằm ở dòng đầu vùng tìm kiếm thì nó chỉ cho ra kết quả tương ứng với dòng đầu.
Bản chất của FindPrvious là dò ngược. Code sẽ bắt đầu từ ô B1 sau đó thì tiếp tục dò từ B65536 tìm lên
 
Upvote 0
Gửi các anh chị và các bạn trên GPE!

Trước đây mình có sưu tầm được code tìm ngược ở đâu đó trên GPE và của ai đó thì mình cũng không nhớ.
Mã:
Sub timnguoc()
Dim Rng As Range, sRng As Range
 
Set Rng = Range("B2:B65536")
Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
Set sRng = Rng.FindPrevious(sRng)
Else: Exit Sub
End If
Range("A3") = sRng.Offset(, 1).Value
End Sub

Gần đây mình cần dùng nên test lại thì thấy nó cho ra kết quả không được như ý mà nguyên nhân thì cũng chẳng biết từ đâu.
Nói nôm na cho dễ hiểu: trong file mình đính kèm lên, A2 chứa nội dung cần tìm trong cột B, Cột C chứa giá trị mình cần lấy, giá trị sau khi tìm thấy gán vào A3.
Ví dụ tìm: 245 cho ra kết quả 7, 456 cho ra kết quả 4,... nhưng tìm 123 thì nó lại cho ra 1 mà kết quả mong muốn là 10.

Mong các bạn và anh chị giúp đỡ!
Thử vầy xem:
Mã:
Sub timnguoc()
  Dim Rng As Range, sRng As Range
  Set Rng = Range("B2:B65536")
  Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole, , [COLOR=#ff0000]xlPrevious[/COLOR])
  If Not sRng Is Nothing Then Range("A3") = sRng.Offset(, 1).Value
End Sub
 
Upvote 0
Sub timnguoc()
Dim Rng As Range, sRng As Range
Set Rng = Range("B2:B65536")
Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole, , xlPrevious)
If Not sRng Is Nothing Then Range("A3") = sRng.Offset(, 1).Value
End Sub

Tôi nghĩ là cần thêm phần Else, bởi vì nếu chạy 2 lần và nếu giá trị thứ 2 không tìm được, nó sẽ giữ giá trị thứ nhất.
(chỉ nghĩ vậy, chưa thử)
 
Upvote 0
Sub timnguoc()
Dim Rng As Range, sRng As Range
Set Rng = Range("B2:B65536")
Set sRng = Rng.Find(Range("A2"), , xlFormulas, xlWhole, , xlPrevious)
If Not sRng Is Nothing Then Range("A3") = sRng.Offset(, 1).Value
End Sub

Tôi nghĩ là cần thêm phần Else, bởi vì nếu chạy 2 lần và nếu giá trị thứ 2 không tìm được, nó sẽ giữ giá trị thứ nhất.
(chỉ nghĩ vậy, chưa thử)
Mình nghĩ trước khi tìm thì xóa nội dung ô A3 là được, nếu không xóa thì giá trị tìm không có nó sẽ giữ nguyên kết quả trước đó.
 
Upvote 0

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

Back
Top Bottom