ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 161936|回复: 317

[函数用法讨论系列20] +-*/ 运算符和and/or在逻辑运算中的应用

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-3-13 10:56 | 显示全部楼层 |阅读模式
不少函数的初学者碰到了一些问题,就是连之前常用的+、-、*、/都有些看不明白了,尤其是*和+号[em06]——
不要着急,这里将给你一些解释:
1、小实例:见附件 oN9y2l8E.rar (1.98 KB, 下载次数: 8720)

多条件统计
=sumproduct((A2:A10="小王")*(B2:B10="收")*C2:C10)——公式1

或者
=sum(if((A2:A10="小王")*(B2:B10="收"),C2:C10))——公式1-1(数组公式,按Ctrl+shift+enter结束)

=sumproduct(((A2:A10="小王")+(A2:A10="小张"))*C2:C10)——公式2

或者
=SUM(IF((A2:A10="小王")+(A2:A10="小张"),C2:C10))——公式2-1(数组公式,按三键)

2、公式1和公式1-1(即公式1的变体)——都是求小王收到的数量,公式2和公式2-1(即公式2的变体)都是求小王和小张收到的数量。
3、大多数人会这么去理解——
认为*是and(且)、认为+是or:[quote]
比如公式1可以这么解释A列=小王且B列=收,对C列求和;公式2解释为A列是小王或者A列是小张,则对C列求和。
(这个理解曾伴我走了很长一段时间)
而实际上这个似乎非常符合汉语习惯的让人觉得非常“正确”的理解——却是不完全的。不妨用
=sum(if(and(A2:A10="小王",B2:B10="收"),C2:C10))——代替公式1-1,用=SUM(IF(OR(A2:A10="小王",A2:A10="小张"),C2:C10))代替公式2-1,答案将是错误的。
此时的*号和+号仍然是乘和加的作用
方法:工具〉公式审核一步步看公式的结果就知道了——*和+号两边得到的是{true,false……}组成的逻辑值数组,用于运算时计算机又将True=1、False=0代入计算,得出结果如果用于IF判断,0=False、其他数值=True;如果用于下一步计算(比如公式1后面的直接*C2:C10)则也是用1、0代入的(1*数值=数值本身,0*数值=0)
apolloh注:加分给此问题提出者,大家可以继续深入讨论,也许您的观点才是正确的。
[此贴子已经被sahelo于2006-12-24 20:48:51编辑过]
补充内容 (2017-10-29 08:56): 在ExcelHome技术论坛的最佳学习方法:http://club.excelhome.net/thread-117862-1-1.html

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-13 11:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

有了1楼的解释,原来“似是而非”的理解——“*=and +=or”自然就是错误的了。

但是,我们还是可以用*、+来代替很多的and、or,用于逻辑判断时,用*、+会减少公式的长度。

尤其是用于条件格式。也就是很多人入门时会觉得奇怪——怎么一个if都没有了? 比如=if(and(A1>0,A1<10)……——与=if((A1>0)*(A1<10)……可以互换使用,但其原理还是不同的。 and()——原理是每一个参数的值为TRUE,则返回TRUE,*号则是返回1或者0。 记住——运算符用于逻辑判断时,仍然是运算符,虽然看起来像“and、or”。

1、简单例子以及容易产生的“理解”

逻辑判断公式中,常常见到条件相*或相+,也常见到and和or,比如:

=if(and(A1>0,A1<8),B1,C1)……VS……=if((A1>0)*(A1<8),B1,C1)——对比and和*

=if(or(A1>0,A1<8),B1,C1)……VS……=if((A1<0)+(A1>8),B1,C1)——对比or和+

以上两种情况是完全可以互换的(等价的)。由此,初学函数的朋友就容易产生这么一种理解:“*就是and(而且的意思)+就是or(或者的意思)”

在某种意义上来说快速地解读公式含义的话,这个“理解”听起来最容易接受了。但不要由此就把这种逻辑判断中的理解扩散成“完全等价”!请看下一点:

在以下两个条件求和中:(数组公式,按Ctrl+shift+enter结束)(假设A1=4,A2=21;B1=5,B2=11)

=sum(if(and(A1:A2>0,A1:A2<8),B1:B2))……VS……=sum(if((A1:A2>0)*(A1:A2<8),B1:B2))

前者只有当A1、A2都介于0和8之间时才返回B1:B2的和,否则得到0;

后者则分开了,比如A1介于0和8之间,A2不介于0和8之间,那么求得的结果是B1的和,而不是0。

这只是一些显性的数组公式,还有不少用数组运算的公式(非数组公式,不按三键)

2、and、or与*、+的原理比较:

AND(logical1,logical2, ...)——详见and函数帮助:当所有的logical们都为True时返回True——这是1个单值

OR(logical1,logical2, ...)——详见and函数帮助:当所有的logical们只要有一个为True时返回True——这是1个单值

(A1:A2>0)*(A1:A2<8)——返回的是{True;False}*{True;True}类型的数组相乘的结果{1;0}——这是一个数组

(A1:A2>0)+(A1:A2<8)——返回的是{True;False}+{True;True}类型的数组相乘的结果{2;1}——这是一个数组

接下来:

由and、or得到的是:

=sum(if(and(A1:A2>0,A1:A2<8),B1:B2))=sum(if(and({True;True},{True;False}),B1:B2))=sum(if(False,B1:B2))=0

and({True;True},{True;False})——有出现False返回False;or公式类似。

由*、+得到的是:

=sum(if({1;0},B1:B2))=sum({5;False})=5——可以用F9键在编辑栏看出。

而=sum(if({2;1},B1:B2))=sum({5;11})=16

注:在逻辑判断if的条件中,0=False;非0的数值都=True

从以上的对比可以看出:运算符*和+在逻辑判断中与and和or是不同的,尤其是数组运算的情况下是不能互换的。

——2006-4-12整理
[此贴子已经被作者于2006-4-12 9:35:34编辑过]

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2006-3-13 11:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

楼主辛苦了。总的来说,写得不错。这个问题确实值得讨论。

对于楼主的说法,我有两点不同的意见,大家一起看看,我的理解对不对:

第一,楼主说:“计算机又将True=1、False=0代入计算……”——这句话有点问题。我认为,计算机从来没把true当作1,而是遵循下面这两条准则:

准则一,true*true=1,true*false=0…………

准则二,true与任一数字作算术运算,得到原数字;false与任一数字作算术运算,得到0

第二个问题:为什么不能用AND代替*?是因为公式的这一部分:(A2:A10="小王")*(B2:B10="收")需要得到的是一个数组,以便与C2:C10“匹配”,而用AND的结果是一个值,与要求不符。——这点才是他们的区别:一个得到数组,一个得到的是单值。所以决定了他们的用处不同。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-13 12:04 | 显示全部楼层

谢谢四海飘零兄指正!

关于2点不同意见的第一点这个只是对计算机内部运算准则的问题理解的差异,结果是一致的,呵呵。

第二点——完全同意!:)

我原意是在纠正——*=and或者理解为“且”的这种思路。 这一点的实质还是单值与数组的区别。

[此贴子已经被作者于2006-3-14 8:58:04编辑过]

TA的精华主题

TA的得分主题

发表于 2006-3-13 13:30 | 显示全部楼层

公式1-1和1-2我已经运用,但对公式2-1和2-2以前未见过,在这里第一次见到.谢谢gouweicao兄弟!

TA的精华主题

TA的得分主题

发表于 2006-3-13 13:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

谢谢gouweicao78提供分享。

TA的精华主题

TA的得分主题

发表于 2006-3-13 15:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
或者条件没用过+号,谢了gouweicao78

TA的精华主题

TA的得分主题

发表于 2006-3-19 10:18 | 显示全部楼层
谢谢,以前真的搞不懂,一直报怨EXCEL没有多条件统计,还在想为什么不在EXCEL中加个SQL查询窗口呢

TA的精华主题

TA的得分主题

发表于 2006-3-20 12:45 | 显示全部楼层
这场春雨下得真好,多谢gouweicao78和四海飘零俩老师。我正搞不明白and和*的区别,受益匪浅。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-23 15:07 | 显示全部楼层

补充:

由于sum或者sumproduct(条件1*条件2*……*统计区域)这种句式的广泛应用,很多人会将sum(if(条件1*条件2*……,统计区域))与之等同的概念扩散成“if(条件1*条件2*……,统计区域)(简称简化if法)可以用条件1*条件2*……*统计区域(简称连乘法)”的——错误概念。下面就此原理再次说明一下:

简化if法——是满足所有条件,返回统计区域,否则返回False(简化没写)。——即数值和False组成的数组。

连乘法——是利用数组相乘返回数组——即数值和0的数组。

在sum中,因为简化没写的0(简化if法返回)对于加总求和并没有影响,所以大多可以通用。

在Average、Max、Min等函数中则不能通用:

False在计算中大多情况=0,但并非都是这样。

比如Average——会将连乘法中0算入平均的个数,而不会将简化if法中的False算入个数。

而由满足条件的值都是负数的情况下,max连乘法将得到0,max简化if法得到的才是正确答案。

同理,min函数也是如此。

所以连乘法对应的不是简化if法,而是if(条件1*条件2*……,统计区域,0)。

[此贴子已经被作者于2006-3-24 8:47:57编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-19 19:22 , Processed in 0.052437 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表