寻找缩短IF公式的解决方案


9

我有一个具有以下结构的长公式:

=IF(!X!<>0,!X!+A1,"")

在那里!X!是一个很长的公式。

有什么解决方法可以避免重复!X!两次?我有两个原因需要它:

  1. 使公式对工作表的用户可读
  2. 减少处理时间

感谢您的帮助。

谢谢,迪奥


1
如果您愿意,To reduce the process time那么显然必须将结果存储在某个位置,否则Excel必须在条件匹配时再次重新计算该值。除法也是一项非常昂贵的行动
phuclv

2
也只是好奇,您是否已尽可能地“降低”长期配方的使用量?为了使其更短,也许添加命名范围?
BruceWayne

要使长公式更易读,请使用alt + return将参数分隔到不同的行上。一个缺点是,除非用户扩大了公式栏的高度,否则该公式看起来是不完整的。
布拉德·史密斯

Answers:


12

另一种方法是使用双重反转

=IFERROR(1/(1/really_long_formula)+A1,"")

如果real_long_formula的计算结果为0,则将除以零并IFERROR()捕获它!

请注意,处理此要求的常用方法(也是最好的方法)是使用辅助单元。


7
这可能会因为浮点除法而失去精度
phuclv

3
@LưuVĩnhPhúc 您完全正确!AFH的方法是最好的办法!
加里的学生,

这是一个很好的,肮脏的把戏。我会尽量避免使用它,但是,万不得已,谁知道呢?
安德烈·查拉利亚

3
注意:确实可能会有一些精度损失,但这很少是一个相关的问题。我1/1/x在Excel中多次测试了100,000个随机数,只有1.4%的时间出现了舍入错误。我曾经发现的最大相对误差是1.6e-16,实际上是零。同样,有趣的是,整数从未显示过舍入错误(测试了从0到1e14的几个范围)。因此,从纯度/清洁度的角度来看,这个答案可能会被拒绝,但从实际计算的角度来看,却不会。
安德烈Chalella

1
我发现加里的解决方案是最好的。首先是因为它很干净(André也提到过)并且可以被其他用户读取。第二,因为它满足了我的需求。我没有复杂或长整数。我希望选择此方法的用户阅读评论,以了解此解决方案的优缺点。
Dio

23

显而易见的答案是将公式放在远离主表的工作单元中。例如,如果您使用H1,请将其设置为:

=!X!

您的公式将变为:

=IF(H1<>0,H1+A1,"")

这是任何其他编程语言所能做的事情的典型表现。


我没有添加帮助列的可能性。不管怎么说,还是要谢谢你。
Dio

2
@Dio如果不应该看到它,则只需隐藏该列即可。您甚至可以命名列/范围以使其更易于阅读
phuclv

4
@Dio-好的。您接受的答案很聪明,但是请注意,由于四舍五入的关系,您可能会失去准确性(1/(1/x)并不总是与完全相同x),尤其是在处理整数数据时。它也不适用于更广泛的范围(例如,检查小于零)。(评论与@LưuVĩnhPhúc的答案都被接受。)
AFH

感谢您的建议和评论。我将让这个问题仍然开放,看看是否还有新的建议。
Dio

2
看到较长的公式将很有帮助。除了工作单元外,还可以在包含公式的工作表中定义一个名称
datatoo

3

您是否真的需要结果""在错误的情况下?如果你只需要在单元格的外观空白(例如,你不会使用像=ISNUMBER()后来它),你可以使用条件格式隐藏在虚假情况的内容。

您将应用到单元格以使其不显示任何内容的条件格式是自定义格式"",如下所示(它是葡萄牙语,但您可以理解):

自定义格式的空白单元格

如预期的那样,单元格中的公式将很简单=!X!+A1

条件格式设置公式可能=!X!=0,但是这将强制重新计算!X!您不想要的(您的“ Point 2”)。最好利用=B1=A1(假设我们的单元格为B1)利用单元格本身,这暗示着!X! = 0

即使您实际上需要单元格的内容 "",通常也可以在工作表中进行一些小的更改,以便可以使用此方法。如果是这样,请在评论中说明情况。


1

我没有添加帮助列的可能性。不管怎么说,还是要谢谢你。

如果您无法添加帮助器,为什么不添加整个工作表?这有几个优点:

  • 您的辅助单元不会占用本来可以使用的空间,因为它在单独的工作表中。
  • 您可以命名单元格,然后通过名称进行寻址,例如=IF(X<>0,X+A1,"")
  • 如果您需要在多个单元中执行此操作,则可以:
    1. 将助手工作表重命名为“ helper”
    2. 将辅助方程式与主方程式放在同一单元格中(称为)D5
    3. helper!D5在主表中对单元格进行寻址。
  • 如有必要,您可以隐藏帮助表。
  • 它比两次评估要快。
  • 它不会失去精度。

我可以看到的缺点是:

  • 您必须引用主工作表中未命名的单元格,sheetname!D5而不是D5
  • 现在,公式分为两部分,而不是第一部分。
  • 工作表扩散。

权衡利弊后,我认为对于许多用例来说,这是一个很好的解决方案。在某些情况下,它不是最佳的,尽管我暂时无法想到。


1
好答案。我看到的缺点是:1。它并不能帮助了很多有使计算更简单的用户,因为现在的大公式隐藏起来。2.许多工作簿已经挤满了工作表。即使隐藏了它,也可能必须经过许多隐藏的工作表才能取消隐藏它。除此之外,这是一个很好的解决方案。
安德烈Chalella

@AndréNeves谢谢!第一次发生在我身上,但是在我写劣势部分时我就忘记了。
wizzwizz4

1

一个尚不建议的选项是创建用户定义的函数。您需要打开菜单栏中的“开发人员”标签(用Google选中)并创建一个模块。

 public function udf_myCalc(ValueToAdd as double)
    dim myvar as double
    dim udf_myCalc as double
    myvar = .. put the logic of !X! in here

    if myvar<>0 then 
        udf_myCalc = myvar + ValueToAdd
    else
        udf_myCalc = ValueToAdd
    end if
 end function

然后在公式栏中

=udf_myCalc(A1)

注意:现在,该文件将变成.xlsx(带有宏)文件,并且在公司网络中可能需要其他权限,因为宏可用于恶意目的,并且某些电子邮件过滤器会阻止它们。这些函数没有文档说明,因此您需要提供有关函数功能的注释,我发现调用所有函数udf_xxxxx很有用,这样很明显它不是内置函数

还有其他一些带有UDF的GOTCHA。有关一些好的提示,请参见此链接 http://www.decisionmodels.com/calcsecretsj.htm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.