Giải bài tập hàm if (2 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

nguyenmauduyen

Thành viên mới
Tham gia
2/6/24
Bài viết
1
Được thích
0
Em có một bài tập là tính tiền điện nước. Tiền điện nước =tiêu thụ*đơn giá trong đó đơn giá được tính theo phương pháp lũy tiến:
0-40 thì đơn giá 4800
41-60 thì 9200
Trên 60 thì 11000
Em không biết sai ở đâu nữa

1717318140012855973788489133872.jpg
 
Em có một bài tập là tính tiền điện nước. Tiền điện nước =tiêu thụ*đơn giá trong đó đơn giá được tính theo phương pháp lũy tiến:
0-40 thì đơn giá 4800
41-60 thì 9200
Trên 60 thì 11000
Em không biết sai ở đâu nữa

View attachment 301323
Đơn giá được lập cho 3 phạm vi --> khối lượng tại D3 cũng phải tách ra làm 3 cho khớp với 3 phạm vi đó --> phạm vi nào * đơn giá đó
 
Có hai cách làm, cách theo từng bậc đơn giá và cách theo lũy tiến.

Cách 1:
Chẻ ra 3 phần, nhân cho đơn giá tương ứng và cộng lại.

Cách 2:
Nhân tiêu thụ cho đơn giá 1
+ Nhân tiêu thụ trên 40 cho (đơn giá 2 - đơn giá 1)
+ Nhân tiêu thụ trên 60 cho (đơn giá 3 - đơn giá 2)

Các cách khác:
Phải biết cách dùng mảng và hàm mảng mới nói chuyện được.

Khi nào tôi học xong cách dùng cái cá-mè-ra trong phôn thì tôi sẽ gởi cho ảnh chụp công thức
 
Cái If ngoài cùng vô nghĩa: chẳng có điều kiện gì mà nhảy vào tính toán (dù tính bằng 2 If khác) rồi hết luôn. Lỗi thiếu tham số
Các mức giá áp cho từng khoảng sử dụng chứ không áp hết cho tổng số sử dụng.
 
Cái If ngoài cùng vô nghĩa: chẳng có điều kiện gì mà nhảy vào tính toán (dù tính bằng 2 If khác) rồi hết luôn. Lỗi thiếu tham số
...
Tại thớt không chịu theo đúng cái lô gic mà chính mình đã nêu ra ở trên.
Cứ tính từng phần <=40, >40 and <=60, >60; cộng 3 phần lại.
Công thức khá dài, nếu muốn gọn thì theo lô gic sau:
Gọi Tiêu Thụ là TT, và đơn giá là DG thì:
TT40 = MIN(TT, 40)
TT60 = MAX(MIN(TT-40, 20), 0) ; chú thích: 20 = 60-40
TT60p = MAX(TT-60, 0)
Giá tiêu thụ = DG40 * TT40 + DG60 * TT60 + DG60p * TT60p

Dùng một công thức Sumproduct cũng được.

Nếu đặt lô gic ngược lại (từ số lớn đến số nhỏ) thì dùng hàm IF rất hiệu quả.
Giá tiêu thụ = IF(TT>60, (TT-60)*DG60p + DG60*20 + DG40*40, IF(TT>40, (TT-40)*DG60 + DG40*40, TT*DG40))
Các con số DG40*40, DG60*20, DG60*20 + DG40*40 đặt cho names (TRAPHAN40, TRAPHAN60, TRAPHAN60P) thì càng hiệu quả hơn nữa.

* ký hiệu p ở trên là 'plus', dấu cộng, có nghĩa là 'bằng hoặc nhiều hơn', nhưng ở đây tôi dùng như 'nhiều hơn'
 
Lần chỉnh sửa cuối:
Em có một bài tập là tính tiền điện nước. Tiền điện nước =tiêu thụ*đơn giá trong đó đơn giá được tính theo phương pháp lũy tiến:
0-40 thì đơn giá 4800
41-60 thì 9200
Trên 60 thì 11000
Em không biết sai ở đâu nữa
Sai ở chỗ người ra đề bài:
Nếu chỉ số điện nước (???) lớn hơn 40 & nhỏ hơn 41 thì khỏi trả tiền!!!
 
Nếu chỉ số điện nước (???) lớn hơn 40 & nhỏ hơn 41 thì khỏi trả tiền!!!
Đang giả định là chỉ số để tính tiền không có thập phân. Mà thực tế là vậy mà?
Tại thớt không chịu theo đúng cái lô gic mà chính mình đã nêu ra ở trên.
Ý tôi là như vầy:
Tác giả bài 1 nói là công thức sai mà không nói sai cái gì, sai như thế nào, kết quả sai hay công thức lỗi. Tôi thì không tin kết quả sai vì cứ như hình chụp mà enter là đã bị mắng "hàm If quá ít tham số" rồi, có đâu ra kết quả mà sai với đúng.
 
Công thức chảnh (hù người ra bài) là thế này:
=SUMPRODUCT({4800,9200,11000}*CHOOSE({1,2,3}, MIN(A1, 40), MAX(MIN(A1-40, 20), 0), MAX(A1-60, 0)))
Đương nhiên đồ hoa hòe thì kém hiệu quả.
 
Công thức chảnh (hù người ra bài) là thế này:
=SUMPRODUCT({4800,9200,11000}*CHOOSE({1,2,3}, MIN(A1, 40), MAX(MIN(A1-40, 20), 0), MAX(A1-60, 0)))
Đương nhiên đồ hoa hòe thì kém hiệu quả.
Hai Min, hai Max, đã thế Min lại còn lồng trong Max, cả Min cả Max lồng trong Choose. Hoa hết cả mắt anh ơi.
 
Hai Min, hai Max, đã thế Min lại còn lồng trong Max, cả Min cả Max lồng trong Choose. Hoa hết cả mắt anh ơi.
Đã là công thức chảnh để hù Thầy/Cô thì nó phải rõ là chảnh.
Min đầu giới hạn trong vòng 40, Tương đương với IF > 40 thì chỉ lấy tới 40.
Min thứ 2 giới hạn phần nằm giữa 40 và 60 ở vòng 20 (tức 60-40)
Hai cái Max bảo đảm nếu âm thì trả về 0
Choose để chuyển các biểu thức vào Array để cho Sumproduct nhai. Để ý {1,2,3} tương ứng với {4800,9200,11000}
 
Đã là công thức chảnh để hù Thầy/Cô thì nó phải rõ là chảnh.
Min đầu giới hạn trong vòng 40, Tương đương với IF > 40 thì chỉ lấy tới 40.
Min thứ 2 giới hạn phần nằm giữa 40 và 60 ở vòng 20 (tức 60-40)
Hai cái Max bảo đảm nếu âm thì trả về 0
Choose để chuyển các biểu thức vào Array để cho Sumproduct nhai. Để ý {1,2,3} tương ứng với {4800,9200,11000}
Hàm này em mà lọ mọ thì chắc mấy cái IF dễ lộn tùng phèo lắm.
 
Hàm chảnh hơn nữa nè:
=CHOOSE(MATCH(A1, {0,40,60}, 1), A1*4800, (A1-40)*9200+40*4800, (A1-60)*11000+20*9200+40*4800)
(những con toán chỉ thuần hằng số, bạn có thể tính trước rồi cho vào. Lười tính trước, hay sợ sai thì cũng có thể gõ hết rồi lợi dụng F9 để tính)

Định nghĩa hàm chảnh:
Hàm né mấy cái IF's lồng nhau cho nên trông có vẻ hiểu biết rộng, nhưng thực tế là rất kém hiệu quả so với dùng hàm IF.
Điển hình: Choose phải tính tất cả các biểu thức trong dãy tham số của nó, IF chỉ tính đến lúc gặp cái True đầu tiên.
 
Lần chỉnh sửa cuối:
Hàm chảnh hơn nữa nè:
=CHOOSE(MATCH(A1, {0,40,60}, 1), A1*4800, (A1-40)*9200+40*4800, (A1-60)*11000+20*9200+40*4800)
(những con toán chỉ thuần hằng số, bạn có thể tính trước rồi cho vào. Lười tính trước, hay sợ sai thì cũng có thể gõ hết rồi lợi dụng F9 để tính)

Định nghĩa hàm chảnh:
Hàm né mấy cái IF's lồng nhau cho nên trông có vẻ hiểu biết rộng, nhưng thực tế là rất kém hiệu quả so với dùng hàm IF.
Điển hình: Choose phải tính tất cả các biểu thức trong dãy tham số của nó, IF chỉ tính đến lúc gặp cái True đầu tiên.
Em góp vui 1 công thức:
=SUMPRODUCT(FREQUENCY(ROW(INDIRECT("1:"$A1)),{40,60}),{4800;9200;11000})

Em có nhớ đợt nào bác nói: choose cũng như If, không có tính hết các tham số của nó, chỉ tính theo giá trị của tham số đâu (biểu thức điều kiện đối với if và biểu thức giá trị đối với choose.)
 
Lần chỉnh sửa cuối:
Hàm chảnh hơn nữa nè:
=CHOOSE(MATCH(A1, {0,40,60}, 1), A1*4800, (A1-40)*9200+40*4800, (A1-60)*11000+20*9200+40*4800)
(những con toán chỉ thuần hằng số, bạn có thể tính trước rồi cho vào. Lười tính trước, hay sợ sai thì cũng có thể gõ hết rồi lợi dụng F9 để tính)

Định nghĩa hàm chảnh:
Hàm né mấy cái IF's lồng nhau cho nên trông có vẻ hiểu biết rộng, nhưng thực tế là rất kém hiệu quả so với dùng hàm IF.
Điển hình: Choose phải tính tất cả các biểu thức trong dãy tham số của nó, IF chỉ tính đến lúc gặp cái True đầu tiên.
Hổng cho chơi mảng!?(sao buồn vậy! :() vậy chơi vầy được không anh!?

=A1*4800+MAX(A1-40,)*4400+MAX(A1-60,)*1800

Chúc anh ngày vui
/-*+//-*+//-*+/
 
Hổng cho chơi mảng!?(sao buồn vậy! :() vậy chơi vầy được không anh!?

=A1*4800+MAX(A1-40,)*4400+MAX(A1-60,)*1800
Được, nhưng nó chưa đủ tuổi để "chảnh" vì:
1. ngắn quá, cho nên có thể cạnh tranh tốc độ vói IF
2. sử dụng một số hằng phải tính bằng tay trước. (các con số 4400 và 1800 nên cho vào Names để giải thích xuất xứ của chúng.

Ai hổng cho chơi mảng vây? Sumproduct không phải hàm mảng sao?
Điều hổng cho chơi là dùng mấy cái lô gic rõ rệt quá. Ẩn ẩn hiện hiện nó mới vui.

...
Em có nhớ đợt nào bác nói: choose cũng như If, không có tính hết các tham số của nó, chỉ tính theo giá trị của tham số đâu (biểu thức điều kiện đối với if và biểu thức giá trị đối với choose.)
Nếu tôi có nói vậy thì chắc tại ngày xưa tôi lầm. Chưa tét kỹ.
Trừ hàm IF ra, tất cả các hàm khác của Excel đều đòi hỏi tính tất cả tham số. Nếu tham số là range thì chúng nạp theo kiểu ByRef cho nên chỉ cần tính địa chỉ.

Điều kiện này có áp dụng cho 365 - đặc biệt là Lambda - hay không thì hiện tại tôi chưa tìm ra tài liệu cho nên chưa rõ.
 
Được, nhưng nó chưa đủ tuổi để "chảnh" vì:
1. ngắn quá, cho nên có thể cạnh tranh tốc độ vói IF
2. sử dụng một số hằng phải tính bằng tay trước. (các con số 4400 và 1800 nên cho vào Names để giải thích xuất xứ của chúng.

Ai hổng cho chơi mảng vây? Sumproduct không phải hàm mảng sao?
Điều hổng cho chơi là dùng mấy cái lô gic rõ rệt quá. Ẩn ẩn hiện hiện nó mới vui.


Nếu tôi có nói vậy thì chắc tại ngày xưa tôi lầm. Chưa tét kỹ.
Trừ hàm IF ra, tất cả các hàm khác của Excel đều đòi hỏi tính tất cả tham số. Nếu tham số là range thì chúng nạp theo kiểu ByRef cho nên chỉ cần tính địa chỉ.

Điều kiện này có áp dụng cho 365 - đặc biệt là Lambda - hay không thì hiện tại tôi chưa tìm ra tài liệu cho nên chưa rõ.
Dạ bác.
Em thì thử bằng chức năng evaluate formula của excel. Em thấy hàm if, choose, iferror, ifna đều là lệnh rẽ nhánh hết ạ.
3​
=CHOOSE(1,1+2,1/0)
5​
=IF(1,2+3,1/0)
5​
=IFERROR(2+3,1/0)
#DIV/0!​
=OR(1<>1,1/0)
1​
=IFERROR(1/0,1)
1​
=IFNA(1,1/0)
3​
=CHOOSE(2,1/0,1+2,1/0)
 
Định nghĩa hàm chảnh:
Hàm né mấy cái IF's lồng nhau cho nên trông có vẻ hiểu biết rộng, nhưng thực tế là rất kém hiệu quả so với dùng hàm IF.
Điển hình: Choose phải tính tất cả các biểu thức trong dãy tham số của nó, IF chỉ tính đến lúc gặp cái True đầu tiên.
Vậy, chơi ghép mảng và tránh If() lồng nè anh:

=SUMPRODUCT(CHOOSE({1,2,3}, A1,IF(A1>40, A1-40,0),IF( A1>60, A1-60,0)) * ({4800,9200,11000}-{0,4800,9200}))

Có đủ điểm mua Rohto chưa anh?

/-*+//-*+//-*+/
 
Lần chỉnh sửa cuối:
Dạ bác.
Em thì thử bằng chức năng evaluate formula của excel. Em thấy hàm if, choose, iferror, ifna đều là lệnh rẽ nhánh hết ạ.
3​
=CHOOSE(1,1+2,1/0)
5​
=IF(1,2+3,1/0)
5​
=IFERROR(2+3,1/0)
#DIV/0!​
=OR(1<>1,1/0)
1​
=IFERROR(1/0,1)
1​
=IFNA(1,1/0)
3​
=CHOOSE(2,1/0,1+2,1/0)
Bạn đúng rồi. Có lẽ ngày xưa tôi test trên Mac cho nên có những điều bên trong hơi khác nhau. Lâu quá quên mất rồi.

Hàm Or, cũng như mọi hàm logical (And, Xor,...), tính mọi tham số.

Xin tuyên bố lại: một số hàm được MS cải tiến, chúng sẽ chỉ tính điều kiện chính (thường là tham số 1), sau đó dùng điều kiện này để quyết đinh dùng tham số nào, và chỉ nạp tham số ấy.
Hàm Choose sẽ tính điều kiện qua tham số đầu tiên, và dùng số này để tính xem cần nạp tham số nào.
Những hàm bắt buộc phải tính mọi tham số thì trong Help của MS có cảnh báo. Điển hình là hàm Switch (khá mới - GPE ít đụng tới).
 
Chủ thớt choáng quá chưa tỉnh nổi...
 
Web KT

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

Back
Top Bottom