5

似乎有点遗漏了,在 Excel 中创建用户定义的声明性函数而不定义宏是不容易的。我不能将 XSLM 用于企业中的艰苦战斗,但我希望能够有目的地定义一个函数。

我想做这个;

=BreakEven(C1:C20)

但我不能使用宏,虽然我可以使用“命名公式”。麻烦的是如何传递参数呢?我已经看到了一些技巧(kludgy workarounds),但不适用于 xslx。

我希望能够在另一个选项卡中定义一个 Breakeven() 函数,并在此处引用它,传入 MORE THAN 一个参数,实际上是两个范围。我确定有某种方法可以使用字符串解析,但我看不到它。

我不介意函数看起来不完全一样,只要它在单元格内进行评估并且我可以将其解析为“意图”。例如,我无法在 xlsx 中工作的这个示例( http://www.jkp-ads.com/articles/ExcelNames09.asp )使用这种语法;

=IF(ROW(D3),CellColor)

其中“cellcolor”是函数的名称,D3 是范围参数。我正在玩的另一个解决方案是使用可变参数列表以列格式定义一个函数(这是 Excel 电子表格的两行);

[Value][function][parameter1][parameter2][parameter3]
 24050  BreakEven C1:C20      A1:A20

它并不漂亮,但后者的好处是它向外部读者描述了该功能。我们知道这是一个盈亏平衡函数,而如果我们输入实际公式“OFFSET,INDIRECT,SUM()()()()等”,它将无法读取/解析。当然,在这种情况下,我必须通过解析 Excel 中右侧的单元格来构造值字段,这会使值公式变得混乱,但至少它会是一个自我描述的行。

任何人都可以提出更好的方法吗?

4

3 回答 3

2

穷人的UDF

所以我认为我们要做的就是这个;

      A      B         C           D           E
1    [Value][function][parameter1][parameter2][parameter3]
2     24050  BreakEven     C1:C20      A1:A20
3       111      mySum          1          10         100

其中“BreakEven”是一个“命名函数”。这是“mySum”的公式;

=sum(C1:E1)

要评估 B 中列出的函数,我们只需将其放在 A 列中(为 A 列中的所有行转置相同的值;

=value(B)

这是因为 A2 和 A3 都将列 B 评估为一个值,这导致 BreakEven 和 Sum 在 A2 和 A3 的上下文中运行(作为穷人的 UDF)。范围 (C1:E1) 当然是相对的。

因此,实际上,我们可以在 B 列中写入任何函数名称(只要在工作簿中定义了相应的命名函数,它可以像您喜欢的那样复杂)。C、D 和 E 列作为同一行上的函数的参数。

我本来希望能够在 A 列中写下以下内容;

=mySum(1,10,100)

但是在没有这种支持的情况下,上述机制提供了一个用户可以理解的可读参数化函数,它也是机器可读的(也可以在 CSV 中工作),并允许我们将可重用函数卸载到库表在工作簿的某个地方进行维护。

不完美,但可以接受的妥协,除非有人有聪明的方法在一个单元格中做到这一点?

于 2012-10-09T16:45:11.003 回答
0

不是真正的答案,但在这里比在评论中更容易说明。尽管您不能以简单的方式重命名公式-我喜欢您的建议,实际上我以前从未想过;但是我从来没有在非宏观环境中工作过,所以这从来没有发生过——你可以在实际的公式中添加注释来解释它的作用。例如:

=N("This is a really complex BreakEven Formula")+SUM(3,4,5)

是一个完全有效的公式。正如我所说,这不是一个真正的答案,但可能会增加复杂公式的清晰度

于 2012-10-09T15:56:25.583 回答
0

你可以用一个小技巧做到这一点

例如,要有效地创建一个模拟 =cuberoot(x) 的 cuberoot UDF,然后将变量命名为 cuberoot 并具有这样的“值”。

=(RC[-1])^(1/3)

现在您可以使用临时切换到 RC 模式来执行此操作,或者将光标放在单元格 E5 中并键入名称值 =(D5)^(1/3)

现在,当您需要一个 cuberoot 时,您可以将参数放在任何单元格中,然后将 =cuberoot 放在其右侧的单元格中。它确实有效并遵循真正的 Excel 规则。

我将它用于具有单个“参数”时间作为因变量的多参数模型。然后我将术语模型定义为模型方程,例如 =a+b Time+c Time^2

其中 a,b,c 已经命名为具有唯一参数值的位置 -

然后将时间定义为 =RC[-1]

我的工作表充满了简单地说 =Model 的单元格,并且左边有所需的时间值(即他们的参数)。使用多个单元格扩展到多参数函数很简单。它通常非常适合电子表格布局。在定义名称框中更改一次模型的定义,所有位置都会同时更改。

我有一个名为 ToDMS 的函数,它采用前面单元格中的十进制度值并将其转换为 deg Min 和 Sec 字符串 - 非常整洁。您需要将度数放在单个单元格中,但希望将其放在 alt 中。在另一个单元格中形成

优雅,简单并且有效

鲍勃乔丹

于 2015-08-20T09:54:22.613 回答