如何以可读的方式重写excel公式?

时间:2012-10-03 17:40:20

标签: excel vba excel-vba excel-formula

我有一个带有公式的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的公式吗?

9 个答案:

答案 0 :(得分:9)

您可以在公式栏中使用Alt + Enter来使公式成为多行。遗憾的是,没有标签只是空格,因此创建和编辑变得乏味。另见

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

答案 1 :(得分:5)

命名您引用的一些单元格可能会使整个内容更具可读性

答案 2 :(得分:4)

作为使用辅助列的示例,您可以使用以下

缩短公式

[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等易失性函数时特别有效,当它们的结果相同时,你不想为每个单元重新计算。

它是否更具可读性,可能不是,但您可以使用适当的注释标记列标题

答案 3 :(得分:4)

FormulaDesk是一个免费的Excel加载项,它使复杂的公式更易读,更容易理解而无需重写。它使得创建,编辑,调试和理解公式变得更加容易。它有两种模式:&#39;编辑视图&#39;和&#39;探索视图&#39;,可以切换。

  • “编辑”视图是一个增强的公式编辑器,带有智能感知等。它会在您键入时进行格式化,垂直偏移嵌套元素,以便清晰和易懂。

  • “探索”视图以简单的嵌套/汇总方式显示公式,首先使用公式的最简单顶级视图,但允许您深入查看嵌套表达式。这使您可以快速了解返回当前结果的方式/原因。单击绿色条(汇总结果)以向下钻取。或者,单击“全部展开”,“全部折叠”按钮。

  • 在两个视图中,您可以将鼠标悬停在各种元素(例如:函数,参数等)上以查看包含更多信息的弹出窗口,例如定义/描述,当前值等。将鼠标悬停在某个范围上将显示其当前值例如。

  • 还有很多其他功能。

[披露:我是FormulaDesk的作者]

enter image description here

答案 4 :(得分:3)

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

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

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

另请注意,名称是智能的:sum(prices)将对整个范围求和,而B2中的=+prices*2解析为=+A2*2,B3中的=+prices*2解析为{{1}等等。

enter image description here

答案 5 :(得分:3)

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

= IF(式所示; 0,0,式)

.....相当于

= MAX(0,式)

[对于公式的数值结果]

如果您嵌套IF(D17 =“”......表达式在主公式中,即此版本

=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))))))

答案 6 :(得分:2)

既然你问过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

为了更容易遵循您的公式逻辑(我不知道单元格代表什么),我为单元格引用命名了变量。你想要将它们重命名为有意义的东西。代码属于模块。

答案 7 :(得分:1)

如果您的公式看起来像那样,那么要获得有意义的回复,您必须在论坛上发布样本工作簿,并明确说明您要实现的目标。

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

但是,如果不知道公式的 intent - 以及它所处的工作簿 - 只能提供如此多的建议。

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

答案 8 :(得分:0)

FormulaDesk仅适用于Windows。

除了上面的FormulaDesk:

这里是FastExcel当前Beta 3的链接。但它们似乎已经存在了十多年。 29美元。我认为只有Windows。该网站尚不清楚。

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

类似的功能Precision Calc。 12美元有一个Nagware免费版本,如果你偶尔需要它。仅限Windows。

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