Ứng dụng Toán học để rút gọn công thức trong Excel

Liên hệ QC

VietDaSau

Thành viên chính thức
Tham gia
27/11/11
Bài viết
51
Được thích
33
Ứng dụng Toán học để tối giản công thức trong Excel.

Phần 1: Lời mở đầu
Khi mới vào diễn đàn, mình đã được chú Mỹ ptm0412 “bắt giò”, và những lần mình tối giản công thức trong Excel đều được chú Mỹ và thầy Ba Tê chỉnh chu công thức sao tối giản nhất. Xin cảm ơn sự tận tình của mọi người trong diễn đàn, bởi thực tế cho mình thấy rằng, đa phần đều chỉ chú trọng đến kết quả (điều hiển nhiên) mà không chú trọng đến một vấn đề quan trọng khác: “Công thức càng đơn giản càng tốt”.

Sau một thời gian gia nhập diễn đàn để lấy lại “căn bản”, mình muốn mở topic này, để khảo cứu vấn đề như đã nêu trên. Bởi vấn đề này chúng ta sử dụng nhiều, nhưng chưa có người khảo cứu để tập hợp lại thành chủ đề mà nó lại nằm tản mác trong rất nhiều topic, lại rời rạc không theo hệ thống nên rất khó tìm ra.

Nói nghiêm khắc thì trình độ Excel của mình rất hạn chế, chỉ sử dụng thành thạo các toán tử +,-,*,/,<,>,=,^. Từ lúc gia nhập diễn đàn, thì đến hôm nay cái mục Most Recently Used chỉ hiện lên các hàm: True, Iserror, Sum, Average, If, Hyperlink, Count, Max, Sin, Sumif. Nói vậy để mọi người hiểu rằng thật tình mình muốn học hỏi và kiến thức khá hạn chế, những công thức mình may mắn tối giản được nhờ chút “kỹ xảo” từ môn Số học và Đại số Boolean. Và may mắn là Excel đã hỗ trợ môi trường cho sự kết hợp của 02 môn này trong công thức (điều mà Toán học phổ thông không cho phép).

Ai cũng biết rằng vẻ đẹp của Toán học nói chung là ở sự đơn giản, và Excel chắc chắn là 99,99999% là dựa trên nền tảng của Toán học rồi. Nhưng mình dám khẳng định ngoài GPE ra, chưa có môn học nào ứng dụng Excel trong các trường Đại học lại quan tâm đến việc này cả. Đồng thời không có môn học dạy chúng ta dùng Đại Số Boolean để phối hợp với Toán học phổ thông. Điều này nghe ra có vẻ hơi ngược đời…

Mới mở đầu mà nói dài quá rồi, xin được phép đi vào thẳng Ví dụ sau
ViDu1.JPG

Ở ô B2, công thức thông thường được sử dụng là:
=IF(MOD(B$1,2)=0,1,0)
Tại B3, mình đã tối giản công thức trên như sau:
=MOD(B$1+1,2)

Tương tự cho các ví dụ dưới, các bạn có thể tải file đính kèm để xem các hàm thông thường so với các hàm đã được tối giản.

Nhưng trước tiên, mình xin giới thiệu sơ lược về đại số Boolean và cách áp dụng nó để khử các hàm If, and, or trong Excel.

Phần 02: Khử if, and, or, not trong Excel
Mục 1: Khử if
Đại số Boolean chỉ áp dụng cho các giá trị True (1) và False (0). Điều này được áp dụng vào Excel. Ta gọi một điều kiện logic nào đó là Đk, ví dụ (B1=0) là một điều kiện, khi đó, Excel sẽ hiểu (B1=0) là 1 (True), nếu B1=0. Còn nếu B1<>0, Excel sẽ gán cho nó giá trị là 0 (False).

Như vậy có nghĩa, bản thân các điều kiện trong Excel đã là một hàm if, dạng như thế này if(Đk, True, False). Tận dụng điều này, ta sẽ bỏ đi được những hàm if không cần thiết để công thức vừa gọn mà Excel lại chạy nhanh hơn. Và với những hàm Excel dạng if(Đk, 1, 0) các bạn hoàn toàn có thể tóm lược lại thành (Đk)*1. Sở dĩ phải thêm *1 vì nếu không Excel theo mặc định sẽ hiện ra kết quả là True hoặc False, dẫu cùng ý nghĩa nhưng hẻm được thuận mắt cho lắm.
Ví dụ công thức sau:
=IF(MOD(B$1,2)<>0,1,0)
Các bạn có thể áp dụng điều vừa nêu trên để rút gọn công thức thành
=((MOD(B$1,2)<>0)*1

Thông thường 80% công thức ta sử dụng không quá 02 điều kiện cho cùng một thông số, khi đó ta khử như sau
Thông thường: =And(Đk1,Đk2,…,Đkn)
Khử And: =(Đk1)*(Đk2)*…*(Đkn)

Thông thường:= Or(Đk1,Đk2,…,Đkn)
Khử or:= ((Đk1)+(Đk2)+…+(Đkn))
Dùng hàm sum để hàm khử or ngắn hơn: =Sum(Đk1,Đk2,...,Đkn).

Thông thường:= Not(Đk)
Khử not:= 1-(Đk)
 

File đính kèm

  • Du lieu mau.xls
    19.5 KB · Đọc: 55
Lần chỉnh sửa cuối:
ước gì mình giỏi toán nhỉ+-+-+-+
 
Ví dụ = IF(ĐK, sin(x) + 1, sin (x))
nên viết thành
= IF (ĐK, 1, 0) + sin(x)

và hay hơn là
= ĐK + sin(x)
Tôi thường thấy nhiều công thức kồng kềnh vì 1 công thức có cả trong 2 tham số của hàm IF.

Hoặc là: IF(ĐK, A1*2, A1)
(A1 là công thức nào đó)
nên thay bằng A1 * (ĐK +2)
 
ước gì mình giỏi toán nhỉ
clip_image001.gif
Mình viết vội vàng, chưa chỉnh chu lời văn, nhờ bạn góp ý giùm, cảm ơn nhiều

Hoặc là: IF(ĐK, A1*2, A1)
(A1 là công thức nào đó)
nên thay bằng A1 * (ĐK +2)
Ở đây có lẽ bạn haonlh hơi lầm lẫn một chút, công thức rút gọn đúng phải là
A1*2^(ĐK)
Ta có thể mở rộng ra một chút với công thức sau IF(ĐK, A1*a, A1*b)
Rút gọn thành: = A1*(b+ĐK*(a-b))

Mời bạn xem link này, tôi thấy bài viết của bác ptm0412 rất hay và bổ ích, không biết bạn Vietdasau đã đọc chưa?
http://www.giaiphapexcel.com/forum/showthread.php?44175-Giải-thích-cách-dùng-Min-Max-thay-thế-cho-hàm-If&
Cảm ơn bạn Tiamo, mình biết chú ptm0412 và thầy Ba Tê cũng bận rộn với công việc của mình, và các thầy ấy cũng rất muốn truyền đạt lại những kiến thức của các thầy. Chính vì thế, mình mới mở topic này ra vì 02 lý do:

  1. Hệ thống lại cách rút gọn công thức, về điều này thì mình phải học tập rất nhiều ở các thành viên GPE, đặc biệt là 02 thầy ptm0412 và Ba Tê
  2. Những người nghiêm túc học Excel, muốn biết cách suy luận để làm gọn ghẽ công thức của mình có một nơi để thảo luận đúng chủ đề

Mình mới vào, có rất nhiều bài hay chưa được đọc, cảm ơn bạn đã gửi link ấy cho mình.
 
Mình không tin rằng có một phương pháp bảo đảm tuyệt đối việc thông thạo cách thiết lập một công thức gọn nhất. Trong mọi trường hợp nếu có một phương pháp như thế đi nữa, thì mình cũng chưa được biết, và điều hiển nhiên là mình không hề có tham vọng tìm ra phương pháp ấy, bao giờ cũng như sau này. Áp dụng một cách từ từ các phép rút gọn là một điều mình học được bằng cách bắt chước và thực hành. Mình dự định làm tất cả những gì mình có thể làm được để giúp những người ham muốn thông thạo cách suy luận một công thức tối giản, song tất cả những gì mình có thể làm là lấy những thí dụ làm mẫu, diễn giải rõ ràng các bước suy luận của mình, với hy vọng là các bạn đỡ thời gian mày mò hơn mình. Xin lấy một ví dụ sau đây

Các bạn ơi hướng dẫn mình với mình có cái này nhưng không giải quyết được :
Hàm IF trong Excel chỉ cho phép 7 hàm lồng vào nhau nhưng mình muốn như sau :
Nếu a1<0.5 thì là không
Nếu a2<1.5 thì là một
Nếu a2<2.5 thì là hai
Nếu a2<3.5 thì là ba
Nếu a2<4.5 thì là bốn
Nếu a2<5.5 thì là năm
Nếu a2<6.5 thì là sáu
Nếu a2<7.5 thì là bảy
Nếu a2<8.5 thì là tám
Nếu a2<9.5 thì là chín
Còn lại là 10
Các bạn làm giúp mình với. Mình bí quá

Mong các bạn giúp mình với nhé
Cảm ơn nhiều

Chỉ cần suy nghĩ chút xíu, mình có thể ra ngay công thức gọn nhất, tuy nhiên nếu ghi ra ngay có thể một số bạn sẽ thắc mắc “từ đâu ra?” nên mình sẽ làm theo phương pháp rút gọn từ từ.

Bước 1: Sử dụng If lồng
=if(a1<0.5, 0, if(a1<1.5,1, if(a1<2,5, 2….))))))))))
Cách này rất đơn giản, chỉ có một vấn đề mắc mướu là dường như Excel không cho sử dụng hàm if lồng nhiều hơn 7

Bước 2: Khử if theo cách mình đã trình bày ở post đầu tiên, và một chút khéo léo
= (a1>=0.5)+ (a1>=1.5)+ (a1>=2.5)+…+ (a1>=8.5)+(a1>=9.5)
Để công thức gọn hơn, các bạn có thể dùng hàm SUM
=Sum(a1>=0.5, a1>=1.5, a1>=2.5,...,a1>=8.5, a1>=9.5)

Bước 3: Tời đây ngẫm nghĩ thêm một chút, các bạn dễ dàng nhận ra đề bài là gợi ý của một cách làm tròn, từ đó ta dễ dàng suy ra công thức sau:
= Round(a1,0)
Nhưng vấn đề là công thức vừa lập sẽ vi phạm yêu cầu “Còn lại là 10”

Bước 04: Chuyện nhỏ thôi, ở đây các bạn dễ dàng nhận thấy, 10 là giá trị tối đa mà công thức lập ra có thể đạt được. Khi đó, ta hãy liên tưởng đến 02 hàm để quy định giá trị tối đa phải trả về là MIN và MOD. Trường hợp ở đây ta dùng MIN
= Min(Round(a1,0), 10)
 
Lần chỉnh sửa cuối:
Nếu A1 bé hơn hoặc bằng 0.5 thì công thức của bạn ra số âm, đâu giống với mô tả của bạn ấy???
 
Nguyên văn bởi haonlh Hoặc là: IF(ĐK, A1*2, A1)
nên thay bằng A1 * (ĐK +2)


Ở đây có lẽ bạn haonlh hơi lầm lẫn một chút, công thức rút gọn đúng phải là
A1*2^(ĐK)
haonlh có nhầm, nhưng không sai hoàn toàn: Có thể thay bằng A1 * (ĐK +1)
So với luỹ thừa (2^ĐK) thì cộng vẫn dễ hiểu hơn.

Đây là 1 chuyên mục hay, Đả Sầu và mọi người nên tham gia đóng góp. Tuy vậy, để tránh làm cho bài viết trở nên kém giá trị, đề nghị mọi người trước khi viết ra, hãy test thật cẩn thận. Vì toán học, nhất là toán học logic vốn rất trừu tượng, chỉ tưởng tượng mà không test, sơ sảy là sai ngay.


mình biết chú ptm0412 cũng bận rộn với công việc của mình

Tôi từ lâu đã định viết về phép loại trừ với nhiều điều kiện <and or Not> phối hợp nhưng không rảnh.
Nhân tiện, Đả Sầu có thể viết về vấn đề này?
Đại khái là Liệt kê tất cả các trường hợp True False của:

A And B| Not (A And B)
A Or B|Not (A Or B)
A And B And C|Not(A And B And C)
(A And B) Or C| Not((A And B) Or C)
(A Or B) And C| Not((A Or B) And C)
... | Not(...)

Sau đó nếu dùng phép loại trừ, sẽ quyết định nên loại cái nào và lấy cái nào.
Việc này rất quan trọng trong việc rút gọn công thức, và cả rút gọn code VBA. Nó còn làm tối ưu hoá thuật toán nữa.
 
Lần chỉnh sửa cuối:
Mình không tin rằng có một phương pháp bảo đảm tuyệt đối việc thông thạo cách thiết lập một công thức gọn nhất. Trong mọi trường hợp nếu có một phương pháp như thế đi nữa, thì mình cũng chưa được biết, và điều hiển nhiên là mình không hề có tham vọng tìm ra phương pháp ấy, bao giờ cũng như sau này. Áp dụng một cách từ từ các phép rút gọn là một điều mình học được bằng cách bắt chước và thực hành. Mình dự định làm tất cả những gì mình có thể làm được để giúp những người ham muốn thông thạo cách suy luận một công thức tối giản, song tất cả những gì mình có thể làm là lấy những thí dụ làm mẫu, diễn giải rõ ràng các bước suy luận của mình, với hy vọng là các bạn đỡ thời gian mày mò hơn mình. Xin lấy một ví dụ sau đây
Lúc trước mới học Excel tôi cũng giống như bạn: Cái gì cũng muốn rút gọn, càng ngắn càng tốt... nhưng sau này tôi "đổi hướng" khác: Ưu tiên cho các giải pháp TỐC ĐỘ CAO ---> Công thức hoặc code có thể dài hơn nhưng nhanh hơn là được
Suy nghĩ xem liệu toán tử nhân có nhanh hơn hàm IF không? Tôi thì không tin nó nhanh hơn đâu
--------------------
Tóm lại: Rút gọn là 1 chuyện nhưng phải tính toán cho kỹ, không phải cái gì gọn cũng ngon lành đâu
 
Bác huuthang xem lại chứ tôi kiểm tra công thức = Min(Round(a1,0), 10) thì thấy =0,5 kết quả sẽ là 1, từ -0,499.. dến 0,499.. thì kết quả là 0 mà.
Xin lỗi, tôi gõ thiếu dấu trừ (-). Bé hơn hoặc bằng -0.5 thì kết quả là số âm.
 
Tôi cũng nghĩ như anh NDU.
Vấn đề là "tối ưu"
Để được việc, ta cần có nhanh công thức, đôi khi có thể là "củ chuối".

Những lúc rỗi rãi, ta tối ưu công thức. Rỗi rãi hơn, tối ưu tốc độ Tối ưu công thức có thể hỗ trợ công việc.

công thức
=IF(ĐK, A1*2, A1)

= A2 * IF(ĐK,2,1)
= A2 * (1 + IF(ĐK,1,0))
= A2 * (1 + ĐK)

Xin lỗi vì sơ suất.
 
Nếu A1 bé hơn hoặc bằng 0.5 thì công thức của bạn ra số âm, đâu giống với mô tả của bạn ấy???
Trong trường hợp ví dụ trên, nếu mình không tuân thủ theo các bước làm, thì mới vào sẽ phang ngay công thức
= Round(A1,0)
Bởi đơn giản, ta thường bàn đến các bài toán có thực trong thực tế. Khi nhìn vào đề bài, mình đã thấy ngay đây chẳng qua chỉ là bài toán làm tròn điểm theo hệ số 1 với giá trị điểm số nằm trong đoạn [0, 10]
Nói nôm na là theo thống kê phương pháp chỉ có độ tin cậy 95% thôi, 5% còn lại rơi vào 02 trường hợp A1<0 và A1>10.
Ở đây, mình cố gắng làm nổi bật các suy nghĩ làm cơ sở rút gọn công thức, những suy diễn có lý đã dẫn đến việc ấy, nói tóm lại là tất cả những gì mà mình đang bắt chước và cóp nhặt. Tất nhiên, việc bắt chước và cóp nhặt thì không thể hoàn hảo, cũng như mình đã nói sẽ không có một phương pháp nào có thể giúp ta rút ra ngay công thức tối giản.
Ở đây, khi suy luận từ bước 1 sang bước 2 mình đã bỏ qua trường hợp A1<0, và nhờ một may mắn tình cờ, công thức tìm ra vẫn đúng đươc đến -0.5
Như vậy, công thức đã tìm chỉ cần bổ sung thêm điều kiện (A1>0) là thỏa yêu cầu bài toán
=Min(Round(a1,0), 10)*(A1>0)

haonlh có nhầm, nhưng không sai hoàn toàn: Có thể thay bằng A1 * (ĐK +1)
So với luỹ thừa (2^ĐK) thì cộng vẫn dễ hiểu hơn.

Đây là 1 chuyên mục hay, Đả Sầu và mọi người nên tham gia đóng góp. Tuy vậy, để tránh làm cho bài viết trở nên kém giá trị, đề nghị mọi người trước khi viết ra, hãy test thật cẩn thận. Vì toán học, nhất là toán học logic vốn rất trừu tượng, chỉ tưởng tượng mà không test, sơ sảy là sai ngay.
Cảm ơn sự góp ý của chú Mỹ, thật ra công thức chú chỉnh sửa lại là áp dụng của công thức rút gọn A1*(b+ĐK*(a-b)) mà con đã nêu. Ở đây a=2 và b=1.
Tất nhiên, chuyên mục này là topic duy nhất mà con mở trên GPE tính đến thời điểm này, nên con sẽ đóng góp đến khi nào “hết vốn” thì thôi. Tuy nhiên có một số vấn đề do thói quen, nên không thể tránh khỏi sai sót khi áp dụng công thức trên thực tế. Đảm bảo phần công thức cơ sở sẽ chính xác đến 99% (1% còn lại do con nhớ nhầm hoặc đọc lộn sách).

Tôi từ lâu đã định viết về phép loại trừ với nhiều điều kiện <and or Not> phối hợp nhưng không rảnh.
Nhân tiện, Đả Sầu có thể viết về vấn đề này?
Theo con biết, đa phần những người làm việc với Excel đều đã từng kinh qua môn Đại Số và Đại số Boolean. Một số cũng được học sơ qua về môn Số học. Chỉ là do lâu ngày không dùng rồi quên thôi chú ạ, một số nhớ nhưng cũng không rảnh như chú Mỹ đây.
Theo gợi ý của chú, con sẽ viết về vấn đề này một cách hệ thống hơn, chú trọng những vấn đề dùng trong Excel. Ở đây ta sẽ gọi là phép Toán logic.

Phép Toán Logic được áp dụng trong Excel được thành lập từ 04 phần tử

  1. Tập hợp số nguyên (kể cả số nguyên âm).
  2. Phép Toán “*” (tương đương với hàm And)
  3. Phép toán “+” (tương đương với hàm Or)
  4. Phép toán phủ định (tương đương với hàm Not, hoặc rút gọn là “1-“)

Kết quả của phép toán Logic trong Excel được trả về 02 kết quả là False (nếu công thức dạng đại số cho kết quả là 0) hoặc False (nếu công thức đại số cho kết quả khác không). Điều này rất quan trọng, các bạn cần ghi nhớ vì:

  1. Vì thông thường phép Toán logic được xây dựng dựa trên 04 phần tử của môn Đại số như đã nói trên, chỉ được phân biệt với phép Toán thông thường bằng dấu ()… Và vì như ta đã biết, bất cứ những gì được thể hiện trên vi tính đều là dạng số, do đó sẽ có những trường hợp ta vi phạm nguyên tắc thành lập phép toán logic nhưng vẫn ra kết quả.
  2. Việc hiểu được đại số Boolean một cách thấu triệt là một việc nằm ngoài khả năng của mình, vì như thầy Mỹ nói, nó quá trừu tượng, thậm chí theo chủ quan của mình còn khó hơn cả Triết học. Hjc hjc, do đó chắc chắn sẽ có sai mà mình không hiểu, các bạn chịu khó “mỏi não” mà bắt giò giùm mình phần này với.
LogicTable0.JPG

Xin người đọc lưu ý phần xanh lá cây

Việc này rất quan trọng trong việc rút gọn công thức, và cả rút gọn code VBA. Nó còn làm tối ưu hoá thuật toán nữa.

Sau khi xong phần này, con sẽ tìm hiểu thêm về mảng, công thức mảng, Pivot Table, Subtotal, tối ưu hóa thuật toán và viết code…

Lúc trước mới học Excel tôi cũng giống như bạn: Cái gì cũng muốn rút gọn, càng ngắn càng tốt... nhưng sau này tôi "đổi hướng" khác: Ưu tiên cho các giải pháp TỐC ĐỘ CAO ---> Công thức hoặc code có thể dài hơn nhưng nhanh hơn là được
Suy nghĩ xem liệu toán tử nhân có nhanh hơn hàm IF không? Tôi thì không tin nó nhanh hơn đâu
--------------------
Tóm lại: Rút gọn là 1 chuyện nhưng phải tính toán cho kỹ, không phải cái gì gọn cũng ngon lành đâu

Cảm ơn chú NDU, tiêu đề topic đã nêu rất rõ “Áp dụng toán học để rút gọn công thức”. Còn việc tốc độ có nhanh hơn không, theo tiêu chuẩn nào, đánh giá ra sao….? Thì con hoàn toàn không biết, và xin được phép hầu chú NDU khi nào có dịp dùng đến nó ạ.
 
Lần chỉnh sửa cuối:
Cảm ơn chú NDU, tiêu đề topic đã nêu rất rõ “Áp dụng toán học để rút gọn công thức”. Còn việc tốc độ có nhanh hơn không, theo tiêu chuẩn nào, đánh giá ra sao….? Thì con hoàn toàn không biết, và xin được phép hầu chú NDU khi nào có dịp dùng đến nó ạ.
Không gì bằng thử nghiệm để rút ra kết luận
Bạn cứ thí nghiệm với những dữ liệu thật lớn (cở 10000 dòng dữ liệu trở lên) sẽ biết liền
 
Không gì bằng thử nghiệm để rút ra kết luận
Bạn cứ thí nghiệm với những dữ liệu thật lớn (cở 10000 dòng dữ liệu trở lên) sẽ biết liền

Đúng là quan trọng tốc độ, chứ không phải là công thức ngắn gọn là ngon?

Chúng ta nên sử dụng các công cụ có sẵn của chính phần mềm (excel) đang có thì là nhanh nhất,

IF là diễn giải của boolean, AND, OR cũng thế mà, xét cho cùng Excel đi từ toán học để đạt áp dụng thực tế tốt nhất.

Nếu làm như chủ topic này là chúng ta đang đi ngược lại quá trình này,

Dĩ nhiên có những khi tốt vì cách làm này giúp ngắn gọn công thức dễ hiểu sáng hơn - nhưng cũng có thể đôi khi làm tối đi (vì IF là biểu đạt ngữ nghĩa của boolean rồi)

Vì thế không có giải pháp tốt nhất cho tất cả - tùy theo quy mô ứng dụng và trường hợp cụ thể thôi.
 
Không gì bằng thử nghiệm để rút ra kết luận
Bạn cứ thí nghiệm với những dữ liệu thật lớn (cở 10000 dòng dữ liệu trở lên) sẽ biết liền
Thân gửi chú NDU
Chắc xét về tuổi tác, con nhỏ hơn chú nhiều, về Excel, cũng chỉ đáng bậc học trò. Điều kiện thực tiễn Excel để tiếp xúc với những dữ liệu thật lớn như chú nói cũng chưa hề. Những gì con biết về Excel đã được đề cập hầu hết tại post1 của topic này.
Cháu vào diễn đàn này với tinh thần học hỏi, và được sự góp ý của một người như chú đây cũng thật quý báu. Nhưng phải thú thiệt là đến giờ con vẫn gần như không đồng ý với lập luận của chú, chẳng những topic này mà còn các topic sau:

http://www.giaiphapexcel.com/forum/...nh-chị-giúp-e-viết-1-công-thức-chứa-Điều-kiện

http://www.giaiphapexcel.com/forum/showthread.php?58079-Giúp-em-viết-code-chọn-số-ngẫu-nhiên

Tại sao, vì rõ ràng chú đã áp đặt ý kiến của mình nên không đưa được công thức đúng trong những trường hợp đó.
Mỗi cái đều có ưu khuyết riêng, cháu sẽ ghi nhận và học tập những điều mình còn thiếu sót, nhưng mong là 02 chú cháu mình sẽ cùng hợp tác, để có được những công thức súc tích như chủ đề này:
http://www.giaiphapexcel.com/forum/showthread.php?58165-Điền-số-thứ-tự-của-1-biến-trong-1-ngày

Cảm ơn chú nhiều ạ...
 
Ý tôi muốn liệt kê ra tất cả các trường hợp True, False, để có thể áp dụng vào các điều kiện thực, và để loại trừ, hoặc để xét mọi trường hợp, không bỏ sót, hiểu không?
Thí dụ với 2 điều kiện A và B:
A​
|
B​
|
A And B​
|
A Or B​
|
Not (A And B)​
|
Not(A Or B)​
|
Not(A)​
|
Not(B)​
|
Not(A) And Not(B)​
|
Not(A) Or Not(B)​
|
T​
|
T​
|
T​
|
T​
|
F​
|
F​
|
F​
|
F​
|
F​
|
F​
|
T​
|
F​
|
F​
|
T​
|
T​
|
F​
|
F​
|
T​
|
F​
|
T​
|
F​
|
T​
|
F​
|
T​
|
T​
|
F​
|
T​
|
F​
|
F​
|
T​
|
F​
|
F​
|
F​
|
F​
|
T​
|
T​
|
T​
|
T​
|
T​
|
T​
|

Rồi có 1 bài toán, giả sử có 2 điều kiện:
A: X <> 10,
B: X < 30

Tôi muốn biết:
- nếu không thoả cả 2 điều kiện này, X sẽ nằm ở những đâu.
- Chỉ cần thoả 1 trong 2 điều kiện, X sẽ nằm những đâu.
- ...
(Thí dụ thôi, không cần giải)

Hoặc 1 bài toán khác, cũng 2 điều kiện A và B, nếu tôi biết 3T 1F tôi sẽ loại trừ cái nào, nếu 3F 1T tôi sẽ loại trừ cái nào. Không những thế, tôi sẽ cân nhắc nên dùng xác định ngắn hơn, hay phủ định ngắn hơn.

Sau đó là tất cả các trường hợp cho 3 điều kiện A, B,C phối hợp như bài trên (bài trên thí dụ vẫn chưa đủ đâu)
 
Lần chỉnh sửa cuối:
Nhưng phải thú thiệt là đến giờ con vẫn gần như không đồng ý với lập luận của chú, chẳng những topic này mà còn các topic sau:

http://www.giaiphapexcel.com/forum/showthread.php?58485-Anh-chị-giúp-e-viết-1-công-thức-chứa-Điều-kiện

http://www.giaiphapexcel.com/forum/showthread.php?58079-Giúp-em-viết-code-chọn-số-ngẫu-nhiên

Tại sao, vì rõ ràng chú đã áp đặt ý kiến của mình nên không đưa được công thức đúng trong những trường hợp đó.
Mỗi cái đều có ưu khuyết riêng, cháu sẽ ghi nhận và học tập những điều mình còn thiếu sót, nhưng mong là 02 chú cháu mình sẽ cùng hợp tác, để có được những công thức súc tích như chủ đề này:
http://www.giaiphapexcel.com/forum/showthread.php?58165-Điền-số-thứ-tự-của-1-biến-trong-1-ngày

Cảm ơn chú nhiều ạ...
Có lẽ bạn chưa hiểu lắm ý tôi nói!
Tôi đâu có phủ nhận việc rút gọn công thức (tôi vẫn làm thế)
Ý tôi muốn nói rằng: Song song với việc rút gọn như thế, bạn nên chú ý về mặt tốc độ nếu như có điều kiện thử nghiệm
Nói thật, tôi không mấy thông minh nên trước giờ luôn rất cẩn thận... 1 công thức hoặc code phải thử đi thử lại nhiều lần mới dám đưa lên
(nếu bạn để ý sẽ thấy bên dưới các bài viết của tôi luôn có dòng Hiệu chỉnh lần cuối bởi ndu96081631.... )
----------------
Trở lại với chủ đề này: Tôi rất hoan nghênh công việc bạn đang làm vì 1 công thức có thể biểu diễn bằng nhiều cách sẽ giúp ta "ngộ" ra được nhiều vấn đề hay...
Chỉ là 1 vài góp ý nhỏ mang tính xây dựng, hy vọng bạn đừng nghĩ là tôi áp đặt!
----------------
Ý tôi muốn liệt kê ra tất cả các trường hợp True, False, để có thể áp dụng vào các điều kiện thực, và để loại trừ, hoặc để xét mọi trường hợp, không bỏ sót, hiểu không?
Hình như còn thiếu em XOR thì phải sư phụ à
 
Hic, định là nhờ Đả Sầu làm, nên chỉ thí dụ 1 ít thôi, rốt cuộc em í không hiểu, phải thí dụ thêm. Nếu viết hết thì mình mở hẳn 1 topic mới, nhiều điều để nói sau khi viết 3 cái tê tê ép ép này lắm.

Thí dụ bảng trên cho các kết quả đó, nhận xét rằng Not (A And B) = Not(A) Or Not(B)
Vậy thì khi viết công thức hoặc viết code VBA, gặp 2 điều kiện kết hợp bằng "And", ta sẽ cân nhắc cái nào ngắn hơn trong 2 cái trên để dùng (kể cả A And B là 3 chọn lựa)

Hai điều kiện thì không thấy khác biệt nhiều giữa 3 chọn lựa, chứ 3 điều kiện trở lên sẽ thấy!
 
Ý tôi muốn liệt kê ra tất cả các trường hợp True, False, để có thể áp dụng vào các điều kiện thực, và để loại trừ, hoặc để xét mọi trường hợp, không bỏ sót, hiểu không?
Thực tế như ở cuối bài chú đã nói con liệt kê vẫn chưa đủ thì làm sao có thể liệt kê các hàm Boolean ra hết được? Hàm số dạng f(A,B,C,....) thì nhiều vô cùng tận, không cách nào liệt kê ra hết được.
Dù vậy, lần này con cũng đã hiểu ý chú rõ hơn, tuy nhiên phải làm qua ví dụ thôi.
Bây giờ con sẽ xét hàm số f(A,B,C,D)=A*B*C*(A+D)
Sau khi liệt kê ra được bảng chân trị và tính toán, thì công thức rút gọn tương đương là f'(A,B,C,D)=A*B*C = Max(A+B+C-2,0)
Bảng chân trị không có f1,f2, thêm vào là để làm đối chứng



Thực tế, chú Mỹ cứ đưa bất cứ công thức Boolean nào trong vòng 04 biến A,B,C,D đổ lại. Trong vòng 02 phút rưỡi sau khi lập xong bảng chân trị, con sẽ rút gọn được công thức ấy. Còn nhiều hơn 04 thì con chịu.
Chèn bảng từ Excel sang mãi mà không được. Bây giờ chỉ nêu vài ví dụ không có bảng chân trị nhé
f(A,B,C,D)=(1-A)BC(A+D)
Rút gọn thành f'=(1-A)BCD=Max(-A+B+C+D-2,0)

f=A(1-B)C(A+D)
f'=A(1-B)C = Max(A-B+C-1,0)

f=ABC(1-A-D)
f'=-ABCD=-Max(A+B+C+D -3,0)
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT
Back
Top Bottom