Nhờ các cao thủ giúp hàm dò tìm kết quả trùng nhau với nhiều điều kiện

Liên hệ QC

theblueserenade

Thành viên mới
Tham gia
23/11/09
Bài viết
46
Được thích
3
Mình đang gặp rắc rối với hàm tìm kiếm nhiều điều kiện, trước đây mình cũng chưa tìm kiếm thế này bao giờ. Mình đã tham khảo các hàm tìm kiếm với nhiều đk như là sumproduct hay lookup, index và match và hàm tìm kiếm và trả về những kết quả trùng nhau nhưng chưa thành công nên đưa lên đây mong các cao thủ chỉ giúp.

Các bạn xem trong file nhé, mình đã ghi chú trong đó rồi. Mình xin cảm ơn.
 

File đính kèm

Mình đang gặp rắc rối với hàm tìm kiếm nhiều điều kiện, trước đây mình cũng chưa tìm kiếm thế này bao giờ. Mình đã tham khảo các hàm tìm kiếm với nhiều đk như là sumproduct hay lookup, index và match và hàm tìm kiếm và trả về những kết quả trùng nhau nhưng chưa thành công nên đưa lên đây mong các cao thủ chỉ giúp.

Các bạn xem trong file nhé, mình đã ghi chú trong đó rồi. Mình xin cảm ơn.

thử vậy xem
V7=INDEX($J$7:$J$21,SMALL(IF((($H$7:$H$21=$K$7)+($H$7:$H$21=$L$7))*($I$7:$I$21>$M$7),ROW($1:$15),""),COLUMN(A:A)))----> Ctrl shift enter

kéo qua phải
 
Lần chỉnh sửa cuối:
Hi, được rồi, cảm ơn bạn nhé, mình đã sửa lại công thức của bạn thế này

V7=INDEX($J$7:$J$21,SMALL(IF((($H$7:$H$21=$K7)+($H$7:$H$21=$L7))*($I$7:$I$21>$M7),ROW(INDIRECT("1:"&COUNTA($J$7:$J$21))),""),COLUMN(A:A)))

Bạn có cách nào khác ngoài công thức mảng không, mình sợ file sẽ chạy chậm vì có rất nhiều dòng.
 
Hi, được rồi, cảm ơn bạn nhé, mình đã sửa lại công thức của bạn thế này

V7=INDEX($J$7:$J$21,SMALL(IF((($H$7:$H$21=$K7)+($H$7:$H$21=$L7))*($I$7:$I$21>$M7),ROW(INDIRECT("1:"&COUNTA($J$7:$J$21))),""),COLUMN(A:A)))

Bạn có cách nào khác ngoài công thức mảng không, mình sợ file sẽ chạy chậm vì có rất nhiều dòng.
Bạn kéo thằng điều kiện IF() trong hàm Small() ra làm cột phụ rùi Index() thôi! Sẽ phải chỉnh sửa công thức chút cho phù hợp đó!
 
Cột phụ tức là thêm cột phải không bạn, như vậy thì phải thêm một hay nhiều cột phụ, bạn có thể làm vào file được không, mình còn kém lắm. Thanks!
 

File đính kèm

Bạn ơi nhưng điều kiện tìm kiếm của mình rất nhiều, như vậy tương ứng với một điều kiên tìm kiếm thì phải có một cột phụ. Nếu mình có khoảng 300 giá trị tìm kiếm thì cũng phải tạo 300 cột phụ. Như vậy thì nhiều cột phụ quá
 
Bạn ơi nhưng điều kiện tìm kiếm của mình rất nhiều, như vậy tương ứng với một điều kiên tìm kiếm thì phải có một cột phụ. Nếu mình có khoảng 300 giá trị tìm kiếm thì cũng phải tạo 300 cột phụ. Như vậy thì nhiều cột phụ quá
Vậy công thức coi như phá sản, vì nếu có dùng name động thì tốc độ cũng chẳng được cải thiện là bao nhiu cả, vậy bạn thử cái hàm tự tạo này xem sao nhé!
PHP:
Function Ham(vungDL As Range, DK As Range)
Dim i As Long, k As Long
Dim sArr(), dArr(), vungDK
sArr = vungDL.Value
vungDK = DK.Value
ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr))
For i = 1 To UBound(sArr, 1)
        If (sArr(i, 1) = vungDK(1, 1) Or sArr(i, 1) = vungDK(1, 2)) And sArr(i, 2) > vungDK(1, 3) Then
            k = k + 1
            dArr(k, 1) = sArr(i, 3)
        End If
Next
If k Then
    Ham = WorksheetFunction.Transpose(dArr)
Else
    Ham = ""
End If
End Function
Xem chi tiết trong file đính kèm!
 

File đính kèm

Hi, được rồi, cảm ơn bạn nhé, mình đã sửa lại công thức của bạn thế này

V7=INDEX($J$7:$J$21,SMALL(IF((($H$7:$H$21=$K7)+($H$7:$H$21=$L7))*($I$7:$I$21>$M7),ROW(INDIRECT("1:"&COUNTA($J$7:$J$21))),""),COLUMN(A:A)))

Bạn có cách nào khác ngoài công thức mảng không, mình sợ file sẽ chạy chậm vì có rất nhiều dòng.

cắt phần if đưa vào trong name xem---> tôi nghỉ là nó sẻ cải thiện tốc độ tính toán, tuy nhiên tôi cũng chưa thử với file nào vài ngàn dòng. nếu bạn có thử báo cho tôi biết tốc độ tính ra sao nha
tks
 

File đính kèm

Ok, cảm ơn bạn mattroicoi và nhapmon nhé, tôi sẽ thử và sẽ báo kết quả cho bạn cùng những ai đọc bài này.
 
Mình đã đưa điều kiện vào name nhưng dữ liệu nguồn của mình tới 30,000 đến 40,000 dòng, dữ liệu để tìm kiếm thì có tới khoảng 800 dòng với khoảng hơn chục điều kiện, máy của mình không chạy nổi.

Mình đang làm theo cách của bạn hoamattroi, mình muốn hỏi là có thể tạo được nhiều vùng điều kiện tách biệt nhau không vì file của mình có nhiều vùng điều kiện nằm ở nhiều sheet khác nhau, mình thử thêm vào thì hàm báo Value. Bạn xem code hộ mình nhé.

Mã:
Option Explicit
Function Ham(vungDL As Range, DK1 As Range, DK2 As Range)
Dim i As Long, j As Long, k As Long
Dim sArr(), dArr(), vungDK1, vungDK2
sArr = vungDL.Value
vungDK1 = DK1.Value
vungDK2 = DK2.Value
ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr))
For i = 1 To UBound(sArr, 1)
        If (sArr(i, 1) = Left(vungDK1(1, 1), 1) Or sArr(i, 1) = Left(vungDK1(1, 2), 1)) And sArr(i, 2) > CLng(Mid(vungDK2(1, 1), 2, 1)) Then
            k = k + 1
            dArr(k, 1) = sArr(i, 3)
        End If
Next
If k Then
    Ham = WorksheetFunction.Transpose(dArr)
Else
    Ham = ""
End If
End Function
 

File đính kèm

Mình đã đưa điều kiện vào name nhưng dữ liệu nguồn của mình tới 30,000 đến 40,000 dòng, dữ liệu để tìm kiếm thì có tới khoảng 800 dòng với khoảng hơn chục điều kiện, máy của mình không chạy nổi.

Mình đang làm theo cách của bạn hoamattroi, mình muốn hỏi là có thể tạo được nhiều vùng điều kiện tách biệt nhau không vì file của mình có nhiều vùng điều kiện nằm ở nhiều sheet khác nhau, mình thử thêm vào thì hàm báo Value.

Xem file mà thấy nó kỳ kỳ thế nào ấy! Chẳng hiểu tại sao lại lọc ra kết quả kỳ cục đến vậy?
Không chuẩn tí nào
Bài này dù có làm cũng không biết sẽ ứng dụng vào việc gì sau này
 
Cảm ơn bạn ndu đã nhận xét, vì mình tìm trên diễn đàn chưa có câu hỏi nào giống kiểu tìm kiếm này và tìm cả ở trên mạng nhưng những cách đó rất dài dòng và khó hiểu nên mới phải viết bài mới để hỏi, với lại mình cũng thấy nó có ích đấy chứ, bài toán là tìm kiếm nhiều điều kiện và trả về nhiều giá trị thỏa mãn những điều kiện đó.

Có thể bạn thấy hơi kỳ quặc nhưng đó là công việc của mình nhưng bạn nói không chuẩn tức là thế nào, bạn có thể giải thích rõ hơn được không. Mình còn chưa biết nhiều về VBA, mong các bạn giúp đỡ.
 
Cảm ơn bạn ndu đã nhận xét, vì mình tìm trên diễn đàn chưa có câu hỏi nào giống kiểu tìm kiếm này và tìm cả ở trên mạng nhưng những cách đó rất dài dòng và khó hiểu nên mới phải viết bài mới để hỏi, với lại mình cũng thấy nó có ích đấy chứ, bài toán là tìm kiếm nhiều điều kiện và trả về nhiều giá trị thỏa mãn những điều kiện đó.

Có thể bạn thấy hơi kỳ quặc nhưng đó là công việc của mình nhưng bạn nói không chuẩn tức là thế nào, bạn có thể giải thích rõ hơn được không. Mình còn chưa biết nhiều về VBA, mong các bạn giúp đỡ.

Tìm kiếm nhiều điều kiện thì ai cũng biết rồi
Vấn đề tôi nói kỳ kỳ ở đây là cái kết quả sau khi lọc ấy --> Chẳng hiểu sau lại bố trí kết quả kỳ cục đến vậy? Vùng dữ liệu chứa kết quả là 1 dạng dữ liệu KHÔNG CHUẨN. Cho dù có nó rồi cũng chẳng biết dùng vào việc gì (khó truy xuất và tính toán)
 
Đây là một bước trung gian quan trọng nhất trong bài toán của mình, ví dụ kết quả sau khi lọc có 5 giá trị thì tương ứng với mỗi giá trị đó sẽ là một số lượng cụ thể, sau khi lọc xong kết quả mình sẽ vlookup để tìm kiếm số lượng cụ thể đó.

Về dữ liệu kết quả không chuẩn thì mình chỉ mô hình hóa lên thôi chứ thực ra bài toán của mình không phải như thế, kết quả sau khi lọc ra ở bài toán của mình chắc chắn sẽ dùng để truy xuất được dữ liệu.

Mình đã làm theo cách của hoamattroi được rồi nhưng vùng dữ liệu nguồn của mình nhiều quá nên hàm báo value, mình rút ngắn dữ liệu nguồn thì lại được, bạn có thể cho mình hỏi tại sao không?
 
Đây là một bước trung gian quan trọng nhất trong bài toán của mình, ví dụ kết quả sau khi lọc có 5 giá trị thì tương ứng với mỗi giá trị đó sẽ là một số lượng cụ thể, sau khi lọc xong kết quả mình sẽ vlookup để tìm kiếm số lượng cụ thể đó.

Biết ngay là sẽ có cái gì đó phía sau
Thế sao bạn không đưa luôn CÁI ĐÍCH CUỐI CÙNG lên đây cho mọi người cùng nghiên cứu
Tôi chẳng thích tí nào khi các thành viên cứ muốn hướng người khác lập trình theo cái hướng mà họ cho là đúng (nhiều khi sai bét ngay từ khi đặt vấn đề)
 
Vậy thì lại khiến các bạn đau đầu rồi, bạn xem trong file đính kèm nhé, mình giải thích hơi dài dòng trong đó,mong rằng bạn sẽ hiểu :). Thanks!
 
Lần chỉnh sửa cuối:
Vậy thì lại khiến các bạn đau đầu rồi, bạn xem trong file đính kèm nhé, mình giải thích hơi dài dòng trong đó,mong rằng bạn sẽ hiểu :). Thanks!

Không biết các bạn khác thế nào, chứ tôi xem xong file này thấy nó "mù mờ" thế nào ấy. Tức là hổng có hiểu!
Chắc tại tôi ngu?
Mấy cái thuộc dạng "đố trí tuệ" này phải để anh Cò hay anh Ba Tê vào cuộc thì may ra hiểu được
Ẹc... Ẹc...
 
Cảm ơn các bạn đã quan tâm, có lẽ các điều kiện mình đưa ra ở bài toán hơi khó hiểu, nhưng thực sự thì nó không có gì là cao siêu cả, chỉ đơn giản là mình đang tìm cách để làm cho nó tăng tốc độ tính toán lên thôi.

Mình xin phép được gỡ file xuống vì lý do cá nhân, mình sẽ tìm hiểu thêm để có cách giải nhanh nhất.
 
Web KT

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

Back
Top Bottom