![Excel 中的 IF 函数(或任何其他效果更好的函数)](https://linux22.com/image/1565997/Excel%20%E4%B8%AD%E7%9A%84%20IF%20%E5%87%BD%E6%95%B0%EF%BC%88%E6%88%96%E4%BB%BB%E4%BD%95%E5%85%B6%E4%BB%96%E6%95%88%E6%9E%9C%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%89.png)
我希望使用日期创建一个 IF 函数,并希望将到期日期填写J1
为最新适用日期之后的 5 年。
以下是我想要在 J1 中返回的内容。
如果日期 3I1
非空,则返回日期 3 加 5 年。
如果I1
为空,那么我希望它返回日期 2G1
加 5 年。
如果日期 2G1
为空,那么我希望它返回日期 1D1
加 5 年。
下面是我迄今为止尝试过的公式,它返回“#value!”错误。
=IF(I1="",IF(G1="",DATE(YEAR(D1)+7,MONTH(D1),DAY(D1)),DATE(YEAR(G1)+7,MONTH(G1),DAY(G1))),DATE(YEAR(I1)+7,MONTH(I1),DAY(I1)))
有人可以帮我解决这个问题吗?
答案1
您也可以尝试这个公式:
=IF(AND(I1<>"",ISNUMBER(I1)),DATE(YEAR(I1)+5,MONTH(I1),DAY(I1)),IF(AND(G1<>"",ISNUMBER(G1)),DATE(YEAR(G1)+5,MONTH(G1),DAY(G1)),IF(AND(D1<>"",ISNUMBER(D1)),DATE(YEAR(D1)+5,MONTH(D1),DAY(D1)),"No date")))
怎么运行的:
该公式检查相应的单元格是否不为空且具有序列号(主要用于日期),然后将年份加 5 以获取到期日期。
答案2
对于这种公式,您可以很好地使用IFS()
它。您不仅可以像下面这样布局,还可以像在 Excel 的公式编辑器中那样布局,这本身就很好,因为从 Excel 2007 开始,您可以将公式编辑器窗口的底部向下拖动到屏幕可以容纳的行数,而不仅仅是三行,因此您可以看到它的完整布局,而不必滚动它,这意味着每个“测试”都可以单独出现在一行上,这样就很容易看到您正在应用的逻辑,这样一年后就可以理解它,也可以轻松地编辑它或将其交给其他人,不,不仅如此,在编写电子表格时,使其逻辑易于理解和编辑本身就是一件大事。
所以:
=IFS(
AND(I1<>"", ISNUMBER(I1)), EDATE(I1,12*5),
AND(G1<>"", ISNUMBER(G1)), EDATE(G1,12*5),
TRUE, EDATE(D1,12*5)
)
IFS()
以这种方式布局,可以更轻松地添加新条件进行测试,并且使它们的去向更加清晰。删除条件也是如此。
在其中,我使用了对您所使用的Rajesh Sinha
基本方法的改进IF()
,即不仅测试单元格是否为空白,还测试输入的数据是否为数字。这几乎可以确保有人在您即将使用的单元格中输入了日期。您可以做更多,但他的测试是“无论如何,如果失败,则说明您输入了错误的数据”,而其他事情都是推测性的,例如“应该是正确的,因此测试成功应该是一个好的测试”,这可能会因奇怪的输入而导致一些错误。
鉴于该公式的使用似乎可能涉及金钱,使用他的第二次测试似乎是一个非常好的主意。
我注意到,在您的公式中,您采用与这两个答案相反的方式:我们都将其视为查看 I1 并期望成功,等等,直到 D1。所以我们都使用以下逻辑:如果(测试 1,如果成功则执行,如果失败则执行),并且我们的测试被编写为“希望”获得成功的结果。所以我们IF( I1<>""
这样写,以便我们将下一个测试视为直接结果,而不是IF( I1=""
它不会立即显示第一个测试成功的良好结果,而是将您送入“好的,那么,然后测试这个,然后这个,然后这个”的老鼠窝,然后最终达到第一个测试的目标。
第一个成功的结果在所有这些的末尾,或者说是“埋藏”了。通常,如果第一个测试的满意结果紧接着其结果,那么公式在后面甚至当时就更容易理解。
换句话说,测试 I1 不为空,这样您就可以立即得到 TRUE 点的结果,如果您真正想要测试的结果失败,那么鼠窝就无需再考虑它。然后,每个逻辑部分都保留在公式中,您不必扫描数英寸的神秘材料来寻找与开头的内容相匹配的另一个位。
我说“通常”是因为,就像人类的一切一样,如果你尝试了这两种答案的方法,但完全不理解(但确实尝试了),那么很可能无论这种方法对其他人有多有效,对你来说都是陌生的,你的方法一清二楚。人与人之间确实存在差异。
我以前见过这种情况,而且经常会得到一些反馈,结果发现做这件事的人接受过一些编程培训,或者是专业编程。从中可以得出(不一定正确)当专业编程时,这种方法是有优势的。但谁知道呢?我从来没有得到过第二级的反馈,只有第一级的反馈。
但是,如果由于你的大脑“连接”方式,这种方法不适合你,我想指出的是,这种方法在 Excel 中具有非常大甚至巨大的优势:Excel 会拆开一个公式,选择开始的地方,将各个部分排列成一条路径,直到完成为止。那么,50 个计算元素意味着 50 次计算,对吗?不是这样的。Excel 意识到它已经达到最终结果时,它就会停止。因此,如果它只需要进行 50 次计算中的 9 次即可达到目标,那么它只会进行 9 次,而不是全部 50 次。将这样的增益乘以 1,000、100,000 等行和多列,你会看到性能的极大提升。Excel 卡住并且你必须重新启动计算机的日子在 2001 年至 2010 年间结束了,但谁愿意每次按下 Enter 键时都有五秒钟的延迟呢?我保证,这会非常非常麻烦。因此,编写公式时,首先要测试成功与否,而不是强制执行所有步骤,无论第一步是否成功,这会带来非常好的好处。因此,我建议,如果您能让这种方法感觉正确,那就IF()
这样做吧。
就我个人而言,出于某种原因,我讨厌它SWITCH()
。它似乎完全不符合 Excel 风格。在编写永远不会很小的电子表格时(要始终确保这一点比您想象的要困难),我只需咕哝或IF()
。IFS()
但如果它会变得太大或公式数量比平时多,我承认IF/IFS
当将它们转换为时,某些工作会运行得更快SWITCH()
。这种情况并不常见,甚至不到 Excel 推出时所宣传的 1%,也不适合任何常规的IF/IFS
,但偶尔,它确实可以节省计算量,尽管通常不是逻辑节省。从IF()
适合单个的公式中去掉 10 个测试,SWITCH()
可能需要为其设置一个函数,这样您就将计算量减少了 20%。乘以 80,000 行... 就可以节省。我讨厌它,但值得一试。
我更讨厌这个功能,但我不知道为什么,所以我无法解决这个问题。但当需要节省开支时,我仍然会使用它。