Dò tìm dữ liệu có điều kiện

Liên hệ QC
Tôi đọc bài của bạn từ đầu đến giờ ;góp ý với bạn
Theo mình Bạn nên đưa ra hết các điều kiện theo thực tế bạn cần xử lý, tránh mỗi lần lại són ra 1 điều kiện kiểu ...dắt, làm như vậy tốn thời gian của mọi người.
Em cảm ơn góp ý của anh/chị xin ghi nhận, Thực sự tại một thời điểm em cũng chưa nghĩ ra hết và excel của em cũng hữu hạn ạ, trong ứng dụng em mới thấy phát sinh nhiều vấn đề nên em mới trao đổi. Nên cũng hơi "Xoắn" anh/chị.
Cảm ơn anh/chị đã theo dõi bài viết.
 
Bạn đọc câu điều kiện như thế nào thì lập công thức như thế đó:
  • "Phải chọn 'Giá' từ 'Ngày áp dụng "trở đi".
  • Bạn lập điều kiện với dấu "=" mang ý phải đúng y ngày đó ($J3=BangGia!$J$2:$J$40), thì công thức báo lỗi không tìm ra kết quả là chính xác rồi.
Thân
Em chưa hiểu công thức của anh, nhờ anh giải thích thêm ạ!
Về tổng quát chung em thấy hình như nó là 1 biến thể "lambda" của Lookup (2;1/( mảng các điều kiện 1)/ (mảng điều kiện n); mảng kết quả)
Nhưng khi đi vào chi tiết công thức, em chưa hiểu cái khúc bôi đỏ này
=LOOKUP($K3;IF(MATCH(BangGia!$D$2:$D$32;BangGia!$D$2:$D$32;0)<>ROW($1:$100);BangGia!$H$2:$H$32;1)/..........

* đoạn MATCH(BangGia!$D$2:$D$32;BangGia!$D$2:$D$32;0)<>ROW($1:$100) : có phải là nó sẽ ra {0;0;0;0;0;0;0;0....1;1;1} để làm gì vậy anh?
Rất Mong anh giải thích thêm về công thức này
Cảm ơn anh
 
Lần chỉnh sửa cuối:
Em chưa hiểu công thức của anh, nhờ anh giải thích thêm ạ!
Về tổng quát chung em thấy hình như nó là 1 biến thể "lambda" của Lookup (2;1/( mảng các điều kiện 1)/ (mảng điều kiện n); mảng kết quả)
Nhưng khi đi vào chi tiết công thức, em chưa hiểu cái khúc bôi đỏ này
=LOOKUP($K3;IF(MATCH(BangGia!$D$2:$D$32;BangGia!$D$2:$D$32;0)<>ROW($1:$100);BangGia!$H$2:$H$32;1)/..........

* đoạn MATCH(BangGia!$D$2:$D$32;BangGia!$D$2:$D$32;0)<>ROW($1:$100) : có phải là nó sẽ ra {0;0;0;0;0;0;0;0....1;1;1} để làm gì vậy anh?
Rất Mong anh giải thích thêm về công thức này
Cảm ơn anh
Yêu cầu của chủ thớt là "Truy tìm Giá bán của Mã hàng tùy thuộc theo: Mã Khách hàng, Mức số lượng bán và Ngày áp dụng". Do chủ thớt hỏi rãi rác như bạn đã góp ý bài trên, và tự mình áp dụng các công thức vào bài thực tế cuối cùng, cho nên khi tôi nhìn lại công thức mới thấy chưa chính xác, đúng ra nó phải như dưới đây:
Mã:
O3=LOOKUP($K3,IF(MATCH(BangGia!$J$2:$J$40&BangGia!$D$2:$D$40,IF(($E3=BangGia!$D$2:$D$40)*($C3=BangGia!$B$2:$B$40),BangGia!$J$2:$J$40&BangGia!$D$2:$D$40),)<>ROW($1:$100),BangGia!$H$2:$H$40,1)/($E3=BangGia!$D$2:$D$40)/($C3=BangGia!$B$2:$B$40)/($J3>=BangGia!$J$2:$J$40),BangGia!$I$2:$I$40)
Kết thúc bằng Ctrl+Shift+Enter, fill xuống.

Vậy công thức bạn hỏi phải là:
IF( MATCH( BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, IF(($E3=BangGia!$D$2:$D$40)*($C3=BangGia!$B$2:$B$40), BangGia!$J$2:$J$40&BangGia!$D$2:$D$40) , ) <> ROW($1:$100),BangGia!$H$2:$H$40,1)

Công thức đó thực hiện biến đổi "Mức Số lượng bán - Cột H sheet 'Banggia'", dòng dữ liệu đầu tiên của từng mã hàng về số 1 dù nó đang có giá trị là bao nhiêu:

Tôi lấy ví dụ trong file đính kèm, công thức tại ô O40:
IF( MATCH( BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, IF(($E40=BangGia!$D$2:$D$40)*($C40=BangGia!$B$2:$B$40), BangGia!$J$2:$J$40&BangGia!$D$2:$D$40) , ) <> ROW($1:$100),BangGia!$H$2:$H$40,1)
  • Lẽ ra công thức chỉ đơn giản là so khớp bằng công thức:
    • MATCH(BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, BangGia!$J$2:$J$40&BangGia!$D$2:$D$40 ,0 ): trả về kết quả là số vị trí dòng của từng mã hàng mà nó tìm thấy đầu tiên. Phải ghép 2 cột "Ngày áp dụng" và "Mã SP" vì theo yêu cầu của chủ thớt Mã hàng sẽ áp dụng có nhiều Ngày tương thích.
    • Vd: (Xem công thức cột AA "TM1") mã SP 2 có tại 4 ô (S5, S6, S35, S36) tương ứng với số thứ tự của nó là: 2, 3, 32, 33. Số thứ tự 2 và 3 có chung ngày áp dụng 20/03/2021, nên khi so khớp nó lấy stt: 2 là dòng đầu tiên của SP2 với ngày áp dụng 20/03/2021; Số thứ tự 32 và 33 có chung ngày áp dụng là 01/08/2021, nên khi so khớp nó lấy stt: 32 là dòng đầu tiên của SP2 với ngày áp dụng 01/08/2021.
  • Tuy nhiên Giá bán còn phụ thuộc vào "Khách hàng" và "Mã hàng" dành cho khách đó nên phải đặt thêm điều kiện: ($E40=BangGia!$D$2:$D$40)*($C40=BangGia!$B$2:$B$40), nếu thỏa mới cho thể hiện "Ngày áp dụng" và "Mã SP", nên công thức thành:
    • "CT So khớp"= MATCH( BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, IF( ($E40=BangGia!$D$2:$D$40)*($C40=BangGia!$B$2:$B$40), BangGia!$J$2:$J$40&BangGia!$D$2:$D$40) , 0 )
    • Vd: (Xem công thức cột U "So khớp") bạn chỉ còn thấy nó ra kết quả tại 4 dòng mà thôi.
  • Công thức còn lại là:
    • IF( "CT So khớp" <> ROW($1:$100), BangGia!$H$2:$H$40, 1 )
    • Nếu kết quả thứ tự dòng từ so khớp "khác" với thứ tự dòng liên tục (Xem cột W) : Nếu Đúng thì lấy giá trị cột H, Nếu Sai thì đổi thành 1. (Xem cột X).
Kết quả Giá bán tại ô O40 là 27.000 vì "Ngày đơn hàng" là 02/08/2021 phải theo ngày áp dụng mới từ ngày 01/08/2021.

Thân
 

File đính kèm

  • Kiem gia.xlsx
    47.3 KB · Đọc: 6
Yêu cầu của chủ thớt là "Truy tìm Giá bán của Mã hàng tùy thuộc theo: Mã Khách hàng, Mức số lượng bán và Ngày áp dụng". Do chủ thớt hỏi rãi rác như bạn đã góp ý bài trên, và tự mình áp dụng các công thức vào bài thực tế cuối cùng, cho nên khi tôi nhìn lại công thức mới thấy chưa chính xác, đúng ra nó phải như dưới đây:
Mã:
O3=LOOKUP($K3,IF(MATCH(BangGia!$J$2:$J$40&BangGia!$D$2:$D$40,IF(($E3=BangGia!$D$2:$D$40)*($C3=BangGia!$B$2:$B$40),BangGia!$J$2:$J$40&BangGia!$D$2:$D$40),)<>ROW($1:$100),BangGia!$H$2:$H$40,1)/($E3=BangGia!$D$2:$D$40)/($C3=BangGia!$B$2:$B$40)/($J3>=BangGia!$J$2:$J$40),BangGia!$I$2:$I$40)
Kết thúc bằng Ctrl+Shift+Enter, fill xuống.

Vậy công thức bạn hỏi phải là:
IF( MATCH( BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, IF(($E3=BangGia!$D$2:$D$40)*($C3=BangGia!$B$2:$B$40), BangGia!$J$2:$J$40&BangGia!$D$2:$D$40) , ) <> ROW($1:$100),BangGia!$H$2:$H$40,1)

Công thức đó thực hiện biến đổi "Mức Số lượng bán - Cột H sheet 'Banggia'", dòng dữ liệu đầu tiên của từng mã hàng về số 1 dù nó đang có giá trị là bao nhiêu:

Tôi lấy ví dụ trong file đính kèm, công thức tại ô O40:
IF( MATCH( BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, IF(($E40=BangGia!$D$2:$D$40)*($C40=BangGia!$B$2:$B$40), BangGia!$J$2:$J$40&BangGia!$D$2:$D$40) , ) <> ROW($1:$100),BangGia!$H$2:$H$40,1)
  • Lẽ ra công thức chỉ đơn giản là so khớp bằng công thức:
    • MATCH(BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, BangGia!$J$2:$J$40&BangGia!$D$2:$D$40 ,0 ): trả về kết quả là số vị trí dòng của từng mã hàng mà nó tìm thấy đầu tiên. Phải ghép 2 cột "Ngày áp dụng" và "Mã SP" vì theo yêu cầu của chủ thớt Mã hàng sẽ áp dụng có nhiều Ngày tương thích.
    • Vd: (Xem công thức cột AA "TM1") mã SP 2 có tại 4 ô (S5, S6, S35, S36) tương ứng với số thứ tự của nó là: 2, 3, 32, 33. Số thứ tự 2 và 3 có chung ngày áp dụng 20/03/2021, nên khi so khớp nó lấy stt: 2 là dòng đầu tiên của SP2 với ngày áp dụng 20/03/2021; Số thứ tự 32 và 33 có chung ngày áp dụng là 01/08/2021, nên khi so khớp nó lấy stt: 32 là dòng đầu tiên của SP2 với ngày áp dụng 01/08/2021.
  • Tuy nhiên Giá bán còn phụ thuộc vào "Khách hàng" và "Mã hàng" dành cho khách đó nên phải đặt thêm điều kiện: ($E40=BangGia!$D$2:$D$40)*($C40=BangGia!$B$2:$B$40), nếu thỏa mới cho thể hiện "Ngày áp dụng" và "Mã SP", nên công thức thành:
    • "CT So khớp"= MATCH( BangGia!$J$2:$J$40&BangGia!$D$2:$D$40, IF( ($E40=BangGia!$D$2:$D$40)*($C40=BangGia!$B$2:$B$40), BangGia!$J$2:$J$40&BangGia!$D$2:$D$40) , 0 )
    • Vd: (Xem công thức cột U "So khớp") bạn chỉ còn thấy nó ra kết quả tại 4 dòng mà thôi.
  • Công thức còn lại là:
    • IF( "CT So khớp" <> ROW($1:$100), BangGia!$H$2:$H$40, 1 )
    • Nếu kết quả thứ tự dòng từ so khớp "khác" với thứ tự dòng liên tục (Xem cột W) : Nếu Đúng thì lấy giá trị cột H, Nếu Sai thì đổi thành 1. (Xem cột X).
Kết quả Giá bán tại ô O40 là 27.000 vì "Ngày đơn hàng" là 02/08/2021 phải theo ngày áp dụng mới từ ngày 01/08/2021.

Thân
Khi xem lại bài viết của anh ứng dụng rất hiệu quả cho công việc của em, cảm ơn anh rất nhiều.
 
Web KT
Back
Top Bottom