Excel命名函数参数或不带宏的UDF

cir*_*rus 5 excel function excel-formula

在没有定义宏的情况下,在Excel中创建用户定义的声明函数没有简单的方法,这似乎有点遗漏.我不能将XSLM用于企业中需要的艰苦战斗,但我希望能够有意义地定义一个功能.

我想做这个;

=BreakEven(C1:C20)
Run Code Online (Sandbox Code Playgroud)

但我不能使用宏,虽然我可以使用"命名公式".问题是如何传递参数?我已经看过几个技巧(kludgy workarounds)但不适用于xslx.

我希望能够在另一个选项卡中定义一个Breakeven()函数,并在此处引用它传递多于一个参数,实际上是两个范围.我确定有一些方法使用字符串解析但我看不到它.

我不介意函数看起来是不是那样,只要它在单元格内进行求值,我就可以解析它为'intent'.例如,我在xlsx中无法使用的示例(http://www.jkp-ads.com/articles/ExcelNames09.asp)使用此语法;

=IF(ROW(D3),CellColor)
Run Code Online (Sandbox Code Playgroud)

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

[Value][function][parameter1][parameter2][parameter3]
 24050  BreakEven C1:C20      A1:A20
Run Code Online (Sandbox Code Playgroud)

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

有谁能建议更好的方法?

cir*_*rus 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
Run Code Online (Sandbox Code Playgroud)

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

=sum(C1:E1)
Run Code Online (Sandbox Code Playgroud)

为了计算 B 中列出的函数,我们只需将其放入 A 列中(对 A 列中的所有行转置相同的值;

=value(B)
Run Code Online (Sandbox Code Playgroud)

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

因此,实际上,我们可以在 B 列中写入任何函数名称(只要工作簿中定义了相应的命名函数,该函数可以是任意复杂的)。C、D 和 E 列充当同一行上函数的参数。

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

=mySum(1,10,100)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果我们只讨论声明性函数而不是算法函数,我无法想象会有太多错误。完全声明性函数,只是内置 excel 函数的命名编译,应该没问题。但是,如果允许这些函数循环或其他此类编程结构,那么是的,我可以看到这是一个问题。 (2认同)