如何以可读的方式重写Excel公式

我有这样的公式的Excel文件:

=IF(OR(ISERROR(G16),ISERROR(G17)),X16,IF(OR(G16="xxx",G16="yyy",G16="zzz"),Y16,IF(G16="333","N\A",IF(G17="333",Z16,IF(D17="",IF((HEX2DEC(W$10)-HEX2DEC(W16))/VLOOKUP(F16,$M$36:$N$41,2,FALSE)<0,0,(HEX2DEC(W$10)-HEX2DEC(W16))/VLOOKUP(F16,$M$36:$N$41,2,FALSE)), IF((HEX2DEC(W17)-HEX2DEC(W16))/VLOOKUP(F16,$M$36:$N$41,2,FALSE)<0,0,(HEX2DEC(W17)-HEX2DEC(W16))/VLOOKUP(F16,$M$36:$N$41,2,FALSE)))))))

我想简化它们,所以它会被写入一个更可读的方式。

  • 我可以用缩进的方式编辑/写入Excel公式吗?
  • 我可以做什么样的简化?
  • 我应该使用VBA脚本而不是Excel的公式吗?

作为一个使用助手列的例子,你可以用下面的公式来缩短公式

[A1] =VLOOKUP(F16,$M$36:$N$41,2,FALSE)

[B1] =HEX2DEC(W$10)

[C1] =HEX2DEC(W16)

[D1] =HEX2DEC(W17)

那么大的公式就缩短了

=IF(OR(ISERROR(G16),ISERROR(G17)),X16,IF(OR(G16="xxx",G16="yyy",G16="zzz"),Y16,IF(G16="333","N\A",IF(G17="333",Z16,IF(D17="",IF((B1-C1)/A1<0,0,(B1-C1)/A1), IF((D1-C1)/A1<0,0,(D1-C1)/A1))))))

当使用易失性函数(如DATE或NOW)时,这是非常有效的,如果结果相同,则不希望为每个单元重新计算。

不pipe它是否更具可读性,也许不是,但是你可以用适当的注释标记栏目标题

您可以在公式栏中使用Alt + Enter使公式为多行。 可悲的是,没有标签只有空格,所以创build和编辑变得乏味。 也可以看看

http://www.dailydoseofexcel.com/archives/2005/04/01/excel-formula-formatter/

命名你引用的一些单元格可能会使整个事情更具可读性

FormulaDesk是一个免费的Excel插件,使复杂的公式更易读,更容易理解,而不必重写它们。 它使得创build,编辑,debugging和理解公式变得更加容易。 它有两种模式:“编辑视图”和“浏览视图”,可以切换。

  • “编辑”视图是一个增强的公式编辑器,带有智能感知等。它按input格式进行格式化,垂直偏移嵌套的元素以提高清晰度和可理解性。

  • “探索”视图以简单的嵌套/卷起的方式呈现公式,其中最简单的公式顶级视图,但允许您深入到嵌套的expression式。 这使您能够快速了解​​如何/为什么返回当前结果。 点击绿色条(卷起的结果)进行下钻。 或者,点击“全部展开”,“全部折叠”button。

  • 在这两个视图中,您可以将鼠标hover在各种元素(例如:函数,参数等)上以查看具有更多信息的popup式窗口,例如定义/描述,当前值等。例如,hover在范围上将显示其当前值。

  • 还有其他一些function。

[披露:我是FormulaDesk的作者]

在这里输入图像说明

辅助列和命名范围的组合将使得这个公式非常简单。

在下图中,您可以看到命名范围如何整理公式:

请注意,“价格”是范围A2:A7的名称,“inflated_prices”是B2:B7的名称。

还要注意名称是智能的: sum(prices)将总和整个范围,而在B2中的=+prices*2parsing为=+A2*2=+prices*2 B3中的=+prices*2parsing为=+A3*2等等。

在这里输入图像描述

您可以在保持单一配方的同时大幅简化您的配方。 用HEX2DEC/VLOOKUP部分重复几乎相同的expression4次,如果您认识到这一点,可以将其简化为单个实例

= IF(式<0,0,式)

…..相当于

= MAX(0,式)

[公式的数字结果]

如果你嵌套你的IF(D17 =“”…..expression式在主公式中,即这个版本

=IF(ISERROR(G16&G17),X16,IF(OR(G16={"xxx","yyy","zzz"}), Y16,IF(G16="333","N\A",IF(G17="333",Z16,MAX(0,(HEX2DEC(IF(D17="",W$10,W17))-HEX2DEC(W16))/VLOOKUP(F16,$M$36:$N$41,2,0))))))

既然你问了VBA代码,我想我会试试看。 这当然是可以理解的,因此可以维护,但是这个函数有11个参数,所以有点难以处理。

 Function Magic(d17 As Range _ , f16 As Range _ , g16 As Range _ , g17 As Range _ , w10 As Range _ , w16 As Range _ , w17 As Range _ , x16 As Range _ , y16 As Range _ , z16 As Range _ , m36 As Range) As Variant Dim a As Variant Dim b As Variant If IsError(g16.Value) Or IsError(g17.Value) Then Magic = x16.Value Exit Function End If If g16.Value = "xxx" Or g16.Value = "yyy" Or g16.Value = "zzz" Then Magic = y16.Value Exit Function End If If g16.Value = "333" Then Magic = "N\A" Exit Function End If If g17.Value = "333" Then Magic = z16.Value Exit Function End If If d17.Value = "" Then a = Application.WorksheetFunction.Hex2Dec(w10.Value) _ - Application.WorksheetFunction.Hex2Dec(w16.Value) a = a / Application.WorksheetFunction.VLookup(f16.Value, m36, 2, False) If a < 0 Then Magic = 0 Exit Function Else Magic = a Exit Function End If Else b = Application.WorksheetFunction.Hex2Dec(w17.Value) _ - Application.WorksheetFunction.Hex2Dec(w16.Value) b = b / Application.WorksheetFunction.VLookup(f16.Value, m36, 2, False) If b < 0 Then Magic = 0 Exit Function Else Magic = b Exit Function End If End If End Function 

为了更容易遵循公式逻辑(我不知道单元格代表什么),我给单元格引用命名了variables。 你会想把它们重新命名为有意义的东西。 代码属于一个模块。

如果你有一个看起来像这样的公式,那么要得到一个有意义的回应,你将不得不在一个论坛上发布一个示例工作簿,并明确说明你正在努力达到的目标。

是的,上面的一些答案指出了如何更好地查看公式,或者摆脱一些多余的东西,或者隐藏一些VBA中的复杂性(在我看来,这只是针对化妆品,可能会带来巨大的费用重新计算时间)。

但是,如果不知道配方的意图以及它所处的工作手册,只能提供如此多的build议。

如果您的工作簿中有这样的数以万计的公式,那么您将遇到数据结构问题,而不是公式问题。 最有效的公式就是避免的公式。 如果您要从头开始重新devise此工作簿,以便利用Excel表,数据透视表和可能的高级筛选器,那么您将避免成千上万像这样的公式。 也许成千上万的公式。

FormulaDesk只适用于Windows。

除了上面的FormulaDesk:

这里是FastExcel目前Beta 3的链接。但是它们似乎已经存在了十多年了。 $ 29块钱。 我只觉得窗户。 该网站不清楚。

http://fastexcel.wordpress.com/2014/04/28/making-sense-of-complex-formulas-an-indenting-viewer-editer/

与Precision Calc类似的function。 $ 12有一个Nagware的免费版本,如果你现在只需要这个。 仅限Windows。

http://precisioncalc.com/tf/what_is_the_formulator.html