Hàm nối chuổi theo điều kiện
Xin chào các bạn,đầu xuân chúc các bạn luôn mạnh khỏe,luôn hạnh phúc và đạt nhiều thành công trong cuộc sống.
Tôi có một bài toán đã đề cập trong file kèm, các bạn xem và giúp mình với.
Cảm ơn!
Bạn thử dùng hàm Jointext của bác ndu96081631 xem có được ko? –=0
Link MediaFire: [URL='www.mediafire.com/?zj6bvbjc861f6rf']Dem theo dieu kien (jointext)
www.giaiphapexcel.com/diendan/threads/h%C3%A0m-n%E1%BB%91i-chu%E1%BB%95i-theo-%C4%91i%E1%BB%81u-ki%E1%BB%87n.89643/
Khóa học SprinGO phù hợp
Kỹ năng giải quyết vấn đề hiệu quả
Mô tả Nội dung Đánh giá Tài nguyên KỸ NĂNG GIẢI QUYẾT VẤN ĐỀ HIỆU QUẢHiểu đúng vấn đề là một nửa của giải...
Xem khóa học
Hàm đó tôi cảm thấy khá rắc rối khi áp dụng, bạn dùng hàm này vậy:
Cách dùng như sau:
Giả sử cột A chứa tất cả điều kiện, cột B chứa dữ liệu và cột D chứa điều kiện, thì cột E có công thức như sau:
=TextJoin($A$1:$A$11,D1,$B$1:$B$11)
Rất giống hàng SUMIF phải không bạn? Có dễ dùng lắm không?
Lưu ý: Cột A và cột B phải có số hàng tương ứng nha bạn!
Hàm mảng hay hàm tự tạo cũng có quy luật chung mà bạn, bạn dùng if để biến đổi sẽ cho các kết quả như ý. Ví dụ
Đoạn màu đỏ là đoạn bắt lỗi trong If, thêm điều kiện cột E không rỗng. Bạn cứ thế triển khai thôi. Còn về cách sử dụng hàm JoinText thì bạn tìm trên diễn đàn sẽ có ngay.
Vì điều kiện tôi đưa ra là Cột Điều Kiện và Cột Dữ Liệu phải có số hàng tương ứng nên tôi đã sửa lại hàm cho gọn lại tí:
————————————————————–
Riêng dữ liệu của bạn đưa ra, cột điều kiện ở bảng 1 không có ngày 04/02/2014 và 05/02/2014 nha bạn, trong khi ở cột bảng 2 lại có ngày đó thì sao nó tính được?
Hàm ở bài vừa rồi ([URL='https://www.giaiphapexcel.com/forum/showthread.php?76124-H%E1%BB%8Fi-nhanh-%C4%91%C3%A1p-nhanh-v%E1%BB%81-c%C3%B4ng-th%E1%BB%A9c-%28ph%E1%BA%A7n-2%29&p=559449#post559449'%5D#921)tôi mới sửa lại nha, bạn copy về mà xài!
Lỗi phát sinh là trùng dữ liệu nó không xử lý ở hàm JoinText, nhưng với hàm TextJoin của tôi thì đã xử lý việc trùng này và cấu trúc gọn gàng dễ sử dụng hơn nha bạn.
Bộ hàm nối chuổi mà tôi viết gồm có 2 hàm: JoinText và JoinIf. Bài này bạn nên dùng JoinIf mới đúng (vì liên quan đến Unique)
Hàm thế này:
Tất cả được xử lý trên mảng.
—————————————————————————
Mặc khác, bạn đang dùng hàm JoinText version cũ đấy, mới nhất nó là thế này:
——————–
Với file của bạn thì cú pháp hàm dùng trên bảng tính là:
Nếu cột điều kiện đều là dạng DATE thì hàm này chỉ viết riêng cho trường hợp của bạn:
Bạn muốn định dạng kiểu "quái" nào cũng được, miễn là từ DATE mà ra!
File mới của bạn, nếu dùng hàm JoinIf của tôi thì sẽ thế này:
———————
Ai lại làm thế! Hàm phải tổng quát chứ
Trường hợp này nó giống với Advanced Filter và Filter đấy (dạng đặc biệt) và ta cũng phải lường trước trong code
Bài đó chưa có hay đâu, bài này mới đã nè!
Em đã làm một cách tổng quát cho Hàm TextJoin và khi so sánh thì Hàm JoinIf còn nhiều trường hợp chưa chính xác.
Xem file.
Bổ sung vấn đề so sánh chữ HOA, chữ Thường
Nếu bạn không cần so sánh chữ HOA, chữ thường thì làm công thức bình thường:
=TextJoin($B$2:$B$94,E2,$C$2:$C$94)
Nhưng nếu bạn phân biệt chỉ tính chữ HOA hoặc chữ thường thì bạn thêm TRUE:
=TextJoin($B$2:$B$94,E2,$C$2:$C$94,TRUE)
Rất tiện lợi phải không!
Không chính xác là vì chú mày không biết xài hàm thôi
Hàm tôi so sánh dựa trên toán tử Like và Evaluate. Vậy, đối với dữ liệu dạng Number, nếu muốn so sánh CHÍNH XÁC thì phải thêm dấu "=" vào điều kiện
Ví dụ: Thay vì viết:
Thì phải viết:
Hàm này hoạt động gần giống với SUMIF: Cho phép so sánh "=", ">", "<" vân… vân…
Ngoài ra, hàm hoạt động theo Array nên dữ liệu trên bảng tính là ngang hay dọc đều dùng được cả
———————
Còn cái chuyện Nghĩa cố tình đưa ra những dữ liệu tào lao để cố chứng minh rằng hàm tôi không chính xác thì tôi.. không quan tâm. Vì dữ liệu thật chẳng bao giờ như vậy cả
Nên nhớ rằng: Tôi viết hàm là để phục vụ cho nhu cầu có thật, dựa trên CSDL thật. Thành ra, ai thích cứ xài, không thích cũng không sao
Ẹc… Ẹc…
Cái này như tôi đã nói ở trên: Thêm dấu "=" để so sánh rồi còn gì
Quá dễ, nếu muốn sửa code
Cái này thì Nghĩa đã suy nghĩ quá xa rồi. Nối chuổi có bao giờ ra kết quả mấy ngàn từ không? Cho dù có ra được kết quả cũng chẳng đọc được
——————————————-
Như ta đã biết, đã gọi là SO SÁNH thì không chỉ có SO SÁNH BẰNG. Còn có LỚN HƠN, NHỎ HƠN, KHÁC hoặc GẦN GIỐNG nữa… và JoinIf của tôi viết ra là để phục vụ cho nhu cầu này (gần giống với SUMIF)
SUMIF là do cả tập đoàn MS viết ra mà trong một số trường hợp cụ thể còn có sai sót (đã bàn trên diễn đàn nhiều lần rồi). Vậy nên MS cũng viết thêm hàm SUMPRODUCT để ta tùy ý phát biểu điều kiện… Thực chất chúng ta không thể viết 1 hàm tổng quát đến mức có thể đáp ứng mọi dữ liệu và mọi nhu cầu… nên tôi cũng bắt chước MS, viết thêm hàm JoinText để người dùng có thêm lựa chọn trong trường hợp điều kiện so sánh phức tạp
Vậy:
– Nếu cảm thấy SUMIF không chính xác thì dùng SUMPRODUCT
– Cũng giống như nếu cảm thấy JoinIf không chính xác thì dùng JoinText
Thế thôi
Thì dùng hàm JoinText
Na ná nghĩa là *Chuổi* ấy, đương nhiên là so sánh chuổi rồi. Code tôi dùng toán tử Like nên chẳng cần phải suy nghĩ gì nhiều, tự nhiên nó vẫn đạt được như vậy thôi (áp dụng giải thuật trong hàm Filter2DArray)
Chú mày nói quá! Chỉ là nghiên cứu thôi (với lại tôi cũng không nghĩ phải hoàn thiện thêm gì nữa cả: 2 hàm JoinIf và JoinText là quá đủ để áp dụng)
——————————————
(Đã dời bài đúng box)