Nhờ lập hàm Tìm kiếm với nhiều điều kiện (1 người xem)

Liên hệ QC

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

vnlinhtinh

Thành viên mới
Tham gia
11/4/13
Bài viết
27
Được thích
6
Điều kiện nằm ở trên các cell khác nhau trên 1 Row.
Mục tiêu gồm các cell trên ghép lại từ trái qua phải. Như ví dụ kèm theo là 4 trường hợp.
Mong mọi người lập hàm giúp.
Cảm ơn!
 

File đính kèm

File đính kèm

Chưa đúng Bác!
Bác lấy 04 cái ô điều kiện đó để tìm sao móc được đúng cái ô vàng vàng ở cột và điền vào cái ô có dấu ???(cũng vàng vàng)
Và lấy luôn vị trí của nó nữa (để vào đâu dó cũng được)
 
Xài thử đoạn mã này:
PHP:
Sub TimKienTheoNhieuDieuKien()
 Dim Rng As Range, sRng As Range, Cls As Range, Arr()
 Dim J As Long, W As Integer
 Dim MyAdd As String, MyTxt As String
 
 Set Rng = Range([G7], [G65500].End(xlUp))
 ReDim Arr(1 To Rng.Rows.Count, 1 To 3)
 [P8].Resize(Rng.Rows.Count, 3).Value = Arr()
 Arr(1, 1) = "STT":                             Arr(1, 2) = "Kêt Qua Tìm Ra:"
 Arr(1, 3) = "Dòng":                            W = 1
 For Each Cls In Range([I26], [I26].End(xlToRight))
    MyTxt = MyTxt & " " & Cls.Value
    Set sRng = Rng.Find(Trim(MyTxt), , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            W = W + 1:                               Arr(W, 1) = W - 1
            Arr(W, 2) = MyTxt:                  Arr(W, 3) = sRng.Row
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
 Next Cls
 If W Then
    [P8].Resize(W, 3).Value = Arr()
 End If
End Sub
 
Ặc! ! ! ! o_O:spiteful:
Em mù về VBA, lắp code cũng chả biết chạy nó kiểu gì.
Bác tả giúp cách vận hành nó với!
Với lại Em muốn nó là hàm Excel vì cái yêu cầu này nó nằm trong một chuỗi các hàm logic khác.
Dùng mấy cái món: =if(vloockup(...);"";if(vloockup(.....) cũng tìm được nhưng công thức nó dài khủng khiếp. Kết hợp với một số hàm khác có khi đơ cả máy.
Nhưng cái code của bác chắc chắn là hữu dụng. Em sẽ ứng dụng được vào trường hợp khác. Bác tả cho em cách sử dụng nó.
Còn mục tiêu chính nhờ vả là xin các bác một cái hàm excel đáp ứng được đề nhu cầu!
Cảm ơn nhiều!
 
Lần chỉnh sửa cuối:
Bạn tham khảo file tại #14

(File cũ đã gỡ bỏ, thu hồi tài nguyên)
 
Lần chỉnh sửa cuối:
Hổng biết có đúng ý gia chủ chưa nữa !?
Ặc! ! ! ! o_O:spiteful:
Em mù về VBA, lắp code cũng chả biết chạy nó kiểu gì.
Bác tả giúp cách vận hành nó với!
Với lại Em muốn nó là hàm Excel vì cái yêu cầu này nó nằm trong một chuỗi các hàm logic khác.
Dùng mấy cái món: =if(vloockup(...);"";if(vloockup(.....) cũng tìm được nhưng công thức nó dài khủng khiếp. Kết hợp với một số hàm khác có khi đơ cả máy.
Cuối cùng cũng chưa biết yêu cầu như thế nào luôn.
Chắc lỗi do mình chậm hiểu sao ấy ?
 
Xin nói là: Iêu cầu của tác gia bài đăng không dễ làm bằng công thức
 
Chết thật! Khả năng trình bày của Em kém quá, mấy bác toàn hiểu sai cả :wounded1:
Tài liệu bác SA_DQ gửi còn vượt quá yêu cầu nữa!!! Em chỉ cần lấy một kết quả duy nhất, bỏ vào một chỗ duy nhất thôi
File của bác SA_DQ rất hữu ích cho nhiều nhu cầu của Em. Bác chỉnh lại giúp dùm. Cảm ơn nhiều!!!
Yêu cầu gấp bây giờ là giải quết cái đó bằng hàm excel. Các bác lập giúp Em với!!!!

Cám ơn mọi người nhiệt tình giúp đỡ!
 

File đính kèm

Xin nói là: Iêu cầu của tác gia bài đăng không dễ làm bằng công thức
Tại bác hiểu nhầm ý Em! ''''''''''''''''''
Yêu cầu đơn giản hơn bác đã gửi file nhiều! em cần lấy một giá trị duy nhất thôi!
Em đã lấy từng chữ trong ô rồi dùng index; math để tìm trong cột bằng cách các hàm if lồng nhau kiểu như:
=IF(INDEX(G8:G30;MATCH(I26;G8:G30;0))<>0;I26;IF(INDEX(G8:G30;MATCH(I26&" "&J26;G8:G30;0))<>0;I26&" "&J26);IF………......
Nhưng tìm nhiều ký tự thì công thức dài khủng khiếp. Cùng với rất nhiều công thức khác liên quan máy chạy ì ạch quá, có lúc treo luôn.
Vậy nên cần các bác chuyên gia ở đây làm cho cái công thức nhỏ gọn, tối ưu!
Bài đã được tự động gộp:

Hổng biết có đúng ý gia chủ chưa nữa !?

Cuối cùng cũng chưa biết yêu cầu như thế nào luôn.
Chắc lỗi do mình chậm hiểu sao ấy ?
Chắc tại Em truyền đạt không tốt --=0
Nhưng cái file bác gửi có kiểu nhặt chữ quá tuyệt! Em đã lãnh hội đc tuyệt chiêu này của bác :spiteful: .
Giờ có yêu cầu tương tự như thế nhưng nhặt chữ khác đi như thế này Bác xử lý giùm trong 1 công thức:
Có dòng chữ: "Kiểu nhặt chữ quá tuyệt"
Giừ bác nhặt sao cho ra 5 ô như sau:
|Kiểu|Kiểu nhặt|Kiểu nhặt chữ|Kiểu nhặt chữ quá|Kiểu nhặt chữ quá tuyệt|
 
Lần chỉnh sửa cuối:
Điều kiện nằm ở trên các cell khác nhau trên 1 Row.
Mục tiêu gồm các cell trên ghép lại từ trái qua phải. Như ví dụ kèm theo là 4 trường hợp.
Mong mọi người lập hàm giúp.
Cảm ơn!
Nếu excel chưa có hàm Textjoin thì nối tay các ô điều kiện, thử với công thức này lấy số dòng:
Mã:
=LOOKUP(1000,MATCH(MID(I26&" "&J26&" "&K26&" "&L26&" ",1,FIND("|",SUBSTITUTE(I26&" "&J26&" "&K26&" "&L26&" "," ","|",ROW($1:$4)))-1),$G$1:$G$1000,))

Có thể đặt name=I26&" "&J26&" "&K26&" "&L26&" ", công thức sẽ gọn lại phù hợp nếu có nhiều ô điều kiện công thức sẽ không bị dãn ra. Công thức như sau:
Mã:
=LOOKUP(1000,MATCH(MID(name,1,FIND("|",SUBSTITUTE(name," ","|",ROW($1:$4)))-1),$G$1:$G$1000,))
Chỗ ROW($1:$4) tương ứng với 4 ô điều kiện, muốn 5 hay 6 điều kiện hay nhiều hơn ... thì chỉnh lại ROW($1:$5) hoặc ROW($1:$6) hoặc ROW($1:$....
Nếu muốn lấy giá trị thì thêm Indirect : =Indirect("G"&LOOKUP(...))
 

File đính kèm

Lần chỉnh sửa cuối:
Thêm hàm mảng người dùng, cho những bạn cần thì tham khảo:
 

File đính kèm

Điều kiện nằm ở trên các cell khác nhau trên 1 Row.
Mục tiêu gồm các cell trên ghép lại từ trái qua phải. Như ví dụ kèm theo là 4 trường hợp.
Mong mọi người lập hàm giúp.
Cảm ơn!
Công thức
Mã:
=LOOKUP(10^6,MATCH(LEFT(I26&" "&J26&" "&K26&" "&L26,MMULT(LEN(I26:L26),--(COLUMN(A1:D4)>=ROW(A1:D4)))+COLUMN($A:$D)-1),$G$1:$G$100,))
Lưu ý:
1. Khi tăng giảm số cột thì sửa công thức tương ứng. Vd. dữ liệu tới M26 (5 cột) thì
- sửa I26&" "&J26&" "&K26&" "&L26 thành I26&" "&J26&" "&K26&" "&L26&" "&M26
- sửa I26:L26 thành I26:M26
- sửa A1:D4 thành A1:E5 (5 hàng 5 cột)
- sửa $A:$D thành $A:$E (5 cột)

2. Nếu Excel có hàm TEXTJOIN thì dùng nó thay cho nối chuỗi.

3. Nếu dữ liệu nhiều dòng thì sửa thích hợp. Vd. nếu dữ liệu có thể tới dòng 50 hoặc 1000 nhưng không bao giờ vượt quá 50 hoặc 1000 thì sửa thành $G$1:$G$50 hoặc $G$1:$G$1000
 
Rất cảm ơn mọi người đã nhiệt tình giúp đỡ.
Công thức của các bác excel_lv1.5 batman1 hay code của bác SA_DQ đều đã đáp ứng tốt yêu cầu!
Tuy nhiên Em lại làm phiền mọi người lần nữa:
-Phần cột là dữ liệu nhập, có thể nhập bị thừa khoảng trắng (Bình thường thôi, Người chứ chả phải Thánh :dirol:) và như thế công thức sẽ báo lỗi #N/A còn bên code của bác SA_DQ thì ...trắng toát. Em cần xử lý cái này (Tức là kệ nó, bao nhiêu khoảng trắng cũng được, miễn là đúng chữ, giống giống như TRIM á!)
- Nối chuỗi thủ công và đặt tên cho nó thì công thức báo lỗi #N/A.
P/s: Bác batman1 mới cho Em công thức lấy vị trí, còn công thức nhặt nguyên con chưa có. Bác cho xin nốt nhé!
 
-Phần cột là dữ liệu nhập, có thể nhập bị thừa khoảng trắng (Bình thường thôi, Người chứ chả phải Thánh :dirol:) và như thế công thức sẽ báo lỗi #N/A còn bên code của bác @SA_DQ thì ...trắng toát. Em cần xử lý cái này
Người mà không biết sửa lỗi của mình, thì là thánh chứ không fải 'Người'!
Không có kiểu vận hành CSDL vô chính fủ như vậy được?
Hoại chăng là nhập dòng trên (hay dưới) nó; Sau đó xài công thức TRIM() gì đó của bạn & chuyện này là chuyện của bạn.
 
Người mà không biết sửa lỗi của mình, thì là thánh chứ không fải 'Người'!
Không có kiểu vận hành CSDL vô chính fủ như vậy được?
Hoại chăng là nhập dòng trên (hay dưới) nó; Sau đó xài công thức TRIM() gì đó của bạn & chuyện này là chuyện của bạn.
He he! Việc bắt/sửa lỗi nhập liệu trong một chương trình là bình thường mà Bác:pardon:Em nghĩ với các Bác nó cũng dễ dàng như .... viết Code vậy! :blum:. Sự hiện diện của các ô trên cột G là cụ thể hóa và trực quan bài toán này thôi, thực tế nó lại là kết quả của nhiều quá trình khác và ... khác nữa. Và cái kết quả mong muốn kia Em lấy làm biến cho công thức khác chứ không phải hiển thị trong sheet .............. Lằng nhằng quá phải không? :stretcher:
Em muốn hỏi bác SA_DQ một chút:
- Code của bác có tác dụng ở tất cả các sheet trong file? (tại em thấy nó là module)
- Như vậy nếu muốn dùng ở nơi khác trong file thì em phải sửa những chỗ nào trong code để cập nhật các vùng điều kiện và vùng tìm kiếm để rồi gõ bất cứ chỗ nào cái =tkGPE(G8:G30;I26:L26) cung lấy được kết quả.
Em đã thử sửa lung tung nhưng đều ra kết quả như hình ở dưới đây:
Capture.PNG
 
Nếu đã có chỉ số rồi thì INDEX thôi.
Mã:
=INDEX($G$1:$G$100;LOOKUP(...);)
Vầng Em hiểu! Hy vọng là Bác có công thức lấy kết quả "nguyên con" đỉnh cao hơn nên ... hóng.''''''''''''''''''
Còn cái đặt tên cho nối chuỗi kia sao ạ?; Không có TEXTJOIN; Em copy cái I26&" "&J26&" "&K26&" "&L26&" " vào trong tham chiếu của tên, đến khi soi lại nó lại ra thế này: ="I26&"" ""&J26&"" ""&K26&"" ""&L26&"" """. Vậy phải thế nào cho công thức nó hiểu được nhỉ?
 
Lần chỉnh sửa cuối:
Tuy nhiên Em lại làm phiền mọi người lần nữa:
-Phần cột là dữ liệu nhập, có thể nhập bị thừa khoảng trắng (Bình thường thôi, Người chứ chả phải Thánh :dirol:) và như thế công thức sẽ báo lỗi #N/A còn bên code của bác SA_DQ thì ...trắng toát.
Có nhiều cách đối phó nhưng tôi không cho là cách của bạn là tốt.
Dữ liệu phải chuẩn. Khi có dữ liệu mà muốn chắc ăn thì phải đưa nó về chuẩn. Sau đó tha hồ viết công thức, code.
Không thể có chuyện cứ mỗi lần viết 1 công thức lại phải TRIM gì đó để đề phòng. Không thể mỗi lần viết code lại phải convert ngày tháng về ngày tháng để đề phòng người ta nhập ngày tháng ở dạng text. Muốn TRIM, convert để đề phòng thì làm với dữ liệu gốc. Sau đó dùng nó khi viết 1000 công thức không còn phải bận tâm nữa. Đấy mới là cách tôi cho là tốt nhất.
Bài đã được tự động gộp:

Vầng Em hiểu! Hy vọng là Bác có công thức lấy kết quả "nguyên con" đỉnh cao hơn nên ... hóng.''''''''''''''''''
Nếu bạn muốn lấy cả hai và công thức tính chỉ số ở vd. A1 thì nguyên con
Mã:
=INDEX($G$1:$G$100;A1;)
Nhưng cái này thì bạn biết rồi :D
 
File của mình có 1 macro & 1 hàm mảng tự tạo;

Macro sẽ hiển thị kết quả lên vùng [P8:R30] gì đó có thể
Còn hàm mảng đang hiện tại vùng [I13:K21]
Vì là hàm mảng nên muốn thay hày xóa thì tiến hành toàn vùng này (đã được ấn định)
Hàm hay macro bạn có thể đem bất cứ đâu trong file để xài, nhưng cần cung cấp cho chúng các tham biến iêu cầu 1 cách tường minh
Ví dụ hàm mảng, bạn muốn kết quả thể hiện ở trang tính khác, thì 2 tham biến cần cho hàm nhất thiết fải nêu chúng đang ở trang tính nào;
Còn macro thì đang cho kết quả trên trang tính hiện đang kích hoạt; Khi bạn muốn kết quả hiển thị ở địa chỉ khác trong trang tính thì xem & thay dòng lệnh (gần cuối) của macro
Nếu muốn hiển thị ở trang tích khác thì đưa tên trang tính vô dòng lệnh này.
 
Lần chỉnh sửa cuối:
File của mình có 1 macro & 1 hàm mảng tự tạo;

Macro sẽ hiển thị kết quả lên vùng [P8:R30] gì đó có thể
Còn hàm mảng đang hiện tại vùng [I13:K21]
Vì là hàm mảng nên muốn thay hày xóa thì tiến hành toàn vùng này (đã được ấn định)
Hàm hay macro bạn có thể đem bất cứ đâu để xài, nhưng cần cung cấp cho chúng các tham biến iêu cầu 1 cách tường minh
Ví dụ hàm mảng, bạn muốn kết quả thể hiện ở trang tính khác, thì 2 tham biến cần cho hàm nhất thiết fải nêu chúng đang ở trang tính nào;
Còn macro thì đang cho kết quả trên trang tính hiện đang kích hoạt; Khi bạn muốn kết quả hiển thị ở địa chỉ khác trong trang tính thì xem & thay dòng lệnh (gần cuối) của macro
Nếu muốn hiển thị ở trang tích khác thì đưa tên trang tính vô dòng lệnh này.
Cám ơn bác rất nhiều!!!

Bác batman1 giúp cho Em cái đặt tên nối chuỗi nhé (coi lại ở Post #20)
 
Điều kiện nằm ở trên các cell khác nhau trên 1 Row.
Mục tiêu gồm các cell trên ghép lại từ trái qua phải. Như ví dụ kèm theo là 4 trường hợp.
Mong mọi người lập hàm giúp.
Cảm ơn!
Góp vui với bạn thêm cách dùng "hàng phụ" và tạo name như bài #13 đề cập, nhờ đó mà công thức nhìn sẽ gọn gàng hơn:
Mã:
I25=SUMPRODUCT(LEN(TRIM($I$26:I26)))+COLUMN(A$1)-1 (fill qua phải)
N25=LOOKUP(1000,MATCH(MID(name,1,I25:L25),$G$1:$G$1000,))
Chỉ Enter.

Thân
 

File đính kèm

Cám ơn bác rất nhiều!!!

Bác batman1 giúp cho Em cái đặt tên nối chuỗi nhé (coi lại ở Post #20)
Tôi có bắt bạn đặt name đâu mà bạn hỏi tôi?
Khi yêu cầu đặt name thì nên hướng dẫn cụ thể.

Thôi thì tôi hướng dẫn bạn.

Chọn ô sẽ nhập công thức -> copy I26&" "&J26&" "&K26&" "&L26&" " -> trong Refers to xóa toàn bộ những gì đang có -> gõ = -> Ctrl+V

Lưu ý:
- bạn phải làm vì tham chiếu là tương đối với cả hàng và cột, vd. I26
- nếu sau đó dùng công thức ở chỗ khác thì kết quả sai hoặc lỗi vì lúc đó name sẽ tham chiếu tới vùng khác vì tham chiếu là tương đối.
- trong Refers to bạn không gõ = (hoặc xóa những gì đang có nhưng chừa lại =) trước khi Ctrl+V vì thế bạn có chuỗi "I26&"" ""&J26&"" ""&K26&"" ""&L26&"" """ (= là do Excel tự thêm vào)

Nếu vùng dũ liệu luôn là I26:L26 mà bạn thêm vào name với
Mã:
=$I$26&" "&$J$26&" "&$K$26&" "&$L$26&" "
thì sau đó công thức có thể đặt ở bất cứ ô nào vì tham chiếu là tuyệt đối - luôn tới vùng cố định.
 
Tôi có bắt bạn đặt name đâu mà bạn hỏi tôi?
Khi yêu cầu đặt name thì nên hướng dẫn cụ thể.
- nếu sau đó dùng công thức ở chỗ khác thì kết quả sai hoặc lỗi vì lúc đó name sẽ tham chiếu tới vùng khác ...
Ha ha !!!!!!!!
Từ chỗ Bác phân tích Em đã nhận được ra cái ấu trĩ của mình. Cái đó lẽ ra không thể quên được chứ
Hóa ra lúc trước Em đã làm được rồi.
Em đã thử để trong Refers to cả có dấu = lẫn không có dấu = , cả hai trường hợp đều #N/A.
Hóa ra là tại cái $: Em đặt chuột ở một ô khác và gõ/copy rồi paste vào Refers to mà chả cố định chiều nào cả. Đến khi lắp tên vào công thức thì nó tham chiếu đi đâu đâu á -0-0-0-
Nhấn F9 mà cũng không nhận thấy sự khác biệt đó ... tệ thật.
 

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

Back
Top Bottom