Chào anh em,
Mình có file excel về đánh giá chất lượng sản phẩm theo các tiêu chuẩn tương ứng, nhờ anh em hỗ trợ giúp mình nhé
Cảm ơn anh em rất nhiều
Chi tiết theo file đính kèm!
M3 =IF((F3>E3)*(F3<>"KPH")+(E3="KPH")*ISNUMBER(F3)*(F3>1)+(H3>G3)*(H3<>"KPH")+(G3="KPH")*ISNUMBER(H3)*(H3>1)+(J3>I3)*(J3<>"KPH")+(I3="KPH")*ISNUMBER(J3)*(J3>1)+(L3>K3)*(L3<>"KPH")+(K3="KPH")*ISNUMBER(L3)*(L3>1),"KĐ","Đạt")
.Theo lô gic túm lại thì KPH tương đương vớii 0.
Nếu Excel 365 thì đặt một hàm Lambda chuyển KPH thành 0 (hoặc một số âm)
Các phiên bản khác thì bắt buộc phải tính từng trị.
Góp vui công thức
=IF(AND((SUBSTITUTE(SUBSTITUTE(INDEX(E3:L3;1;{1;3;5;7});"<";"");"KPH";0)-SUBSTITUTE(INDEX(E3:L3;1;{2;4;6;8});"KPH";0))>=0);"Đạt";"KĐ")
Nhớ ctrl shift enter.
Cái này em xài and() tương đương với hàm sum() mà bác.Hàm AND và OR không hoạt động trong công thức mảng nha bác sĩ!
.
Mỗi bảng tính khi hiển thị vậy đều có mục đích bạn à, nếu gán KPH thành giá trị 0 thì hàm đơn giản rồiCái bảng tính này căn bản là để xem cho đẹp mắt chứ về mặt tính toán thì được thiết lập bởi một kẻ dốt về lô gic.
Theo lô gic túm lại thì KPH tương đương vớii 0.
Nếu Excel 365 thì đặt một hàm Lambda chuyển KPH thành 0 (hoặc một số âm)
Các phiên bản khác thì bắt buộc phải tính từng trị.
Hàm khủng bố thì như vầy:
=IF(SUMPRODUCT(--(CHOOSE({1;2;3;4},IF($E3<>"KPH",$E3,0),IF($G3<>"KPH",$G3,0),IF($I3<>"KPH",$I3,0),IF($K3<>"KPH",$K3,0))>CHOOSE({1;2;3;4},IF($F3<>"KPH",$F3,-1),IF($H3<>"KPH",$H3,1),IF($J3<>"KPH",$J3,-1),IF($L3<>"KPH",$L3,-1)))) >= 4, "Đạt", "KĐ")
Hàm nhẹ hơn chút:
=IF(SUM(--LET(theRg, $E3:$L3, (FILTER(IF(theRg<>"KPH", theRg, 0),ISODD(COLUMN(theRg)))>FILTER(IF(theRg<>"KPH", theRg, -1),ISEVEN(COLUMN(theRg))))))>= 4, "Đạt", "KĐ")
Hàm ăn gian:
=IF(SUMPRODUCT(--(IF($E3:$L3<>"KPH",$E3:$L3,-1)<{-9,100,-9,200,-9,0,-9,10}))>= 4, "Đạt", "KĐ")
.Cái này em xài and() tương đương với hàm sum() mà bác.
Nó chỉ so sánh kết quả đầu tiên, và lờ đi các kết quả tiếp theo.Sao em thấy vẫn đúng mà.
Máy trên em đang xài là office 2013, không có nối mạng nên em chụp tạm. Thậm chí còn không cần ctrl shift enter.
À, đúng rồi bác. Excel bản 2013 chỉ nhận giá trị đầu. Em mới thử lại bên bản 365 thì nó nhận tất cả giá trị.Nó chỉ so sánh kết quả đầu tiên, và lờ đi các kết quả tiếp theo.
Bạn cần học thêm về căn bản chuyển dạng trị để so sánh.Mỗi bảng tính khi hiển thị vậy đều có mục đích bạn à, nếu gán KPH thành giá trị 0 thì hàm đơn giản rồi
Mà KPH ở đây không mặc định bằng 0 như bạn nói
Ở mỗi phương pháp phân tích thì KPH có thể khác nhau như 0.1%, 10 mg/L .... nhưng các giá trị này không đc hiển thị, mà phải nằm ở 1 mục riêng sau khi trả kết quả
Cảm ơn bạn đã trả lời chủ đề nhé
Tôi chưa thử công thức trên nhưng nhìn sơ qua thì có điểm này:Góp vui công thức
=IF(AND((SUBSTITUTE(INDEX(E3:L3;1;{1;3;5;7});"KPH";0)-SUBSTITUTE(INDEX(E3:L3;1;{2;4;6;8});"KPH";0))>=0);"Đạt";"KĐ")
Nhớ ctrl shift enter.
Bằng hàm của bác HieuCD đã giải quyết xong nha bạnBạn cần học thêm về căn bản chuyển dạng trị để so sánh.
A và B chỉ so sánh được nếu chúng cùng dạng, cùng loại, cùng đơn vị.
Môn Vật lý lớp 10-11 có phần dạy về cái này.
Tôi chưa thử công thức trên nhưng nhìn sơ qua thì có điểm này:
- Điều kiện so sánh ở bảng này là nhỏ hơn. Kể cả KPH. Vì vậy, nếu chuyển từ ký hiệu sang số thì phải chuyển ra hai trị khác nhau.
Chú thích 1: Thực ra, tối qua tôi giải bài này hơi muộn, buồn ngủ quá cho nên chỉ giải bằng lô gic trực tiếp.
Nếu chịu khó ngồi tom góp lại thì chỉ có hai vấn đề chính:
1. Bảng dỏm, dữ liệu không đồng bộ cho nên phải có cách đồng bộ hóa.
2. Thiết kế trẹo tay lái cho nên phải có cách lấy mảng lủng (filter mảng).
Chú thích 2: Tôi dùng 365 để cho bà con thấy cách dùng hàm Let. Chứ các phiên bản trước thì ở đây có rất nhiều người làm rồi, tôi không cần bận tâm.
Bài này dùng Lambda thì có lẽ ngon. Nhưng Lambda hơi khó giải thích cho nên chắc phải đợi 1 vài năm nữa, bà con từ từ quen.
Khi dùng mảng thì And và Or khá nguy hiểm, cần phải test đầy đủ.Cái này em xài and() tương đương với hàm sum() mà bác.
Đọc lại luật diễn đàn đi....
Còn bạn muốn thể hiện thêm về lambda thì làm cái chủ đề riêng nhé,
Góp ý thêm nhé bạn: Mọi người lên đây đều vui vẻ đóng góp, nếu cảm thấy không thích thì đừng góp ý, còn nếu góp ý rồi thì bạn đừng có thái độ coi thường người khác nhé bạn.
...
Nhờ admin đóng chủ đề này giúp nhé!
Cảm ơn mọi người đã giúp đỡ!
Em thích cách giải thích của bác về tính giao nhau của mảng trong trường hợp này hơn. (Em không nhớ bác dùng thuật ngữ gì)Khi dùng mảng thì And và Or khá nguy hiểm, cần phải test đầy đủ.
Lý do: hàm lô gic (And/Or) trong bảng tính Excel có tính chất "đi tắt nếu có thể"
Ví dụ: And(False, True, True) thì Excel chỉ xét tham đầu, thấy False rồi thì nó biết không cần xét tiếp hai tham còn lại. Tương tự Or(False, True,True) thì Excel chỉ cần xét đến tham thứ hai.
Với một hàm, Excel bắt buộc phải tính mọi tham số trước khi gọi hàm và nạp tham số...
Đối với excel bản cũ, hoặc 365 nhưng bấm ctrl shift enter, tùy thuộc vào số ô mà mình chọn trước khi kết thúc công thức, mà excel quyết định sẽ tính toán với bao nhiêu phần tử của mảng. Như hình ở #10, nếu chỉ chọn 1 ô thì excel nó chỉ tính mỗi phần tử đầu của mảng, trả true với ô c17 và false với ô c18.
...
Em thử gọi hàm And trên sheet, và 2 UDF như bác nói nhưng msgbox vẫn hiển thị:Hàm lô gic (And/Or) là hàm đặc biệt không theo luật "tính hết" này.
And(ToTi(), TiTe())
TiTe có được gọi hay không tùy theo kết quả của ToTi.
Function ToTi() As Boolean
ToTi = False
End Function
Function TiTe() As Boolean
TiTe = True
MsgBox "TiTe da duoc goi"
End Function
Xin lỗi. Tôi nhầm với cái khác.Em thử gọi hàm And trên sheet, và 2 UDF như bác nói nhưng msgbox vẫn hiển thị:
Hàm trên sheet: And(ToTi(), TiTe())
Code trong module:
Mã:Function ToTi() As Boolean ToTi = False End Function Function TiTe() As Boolean TiTe = True MsgBox "TiTe da duoc goi" End Function
Và em cũng có test một kiểu đơn giản hơn trên sheet: And(FALSE,1/0) thì hàm and vẫn trả về lỗi chứ không phải là false.