从宏创建的数组公式的 UDF

Posted

技术标签:

【中文标题】从宏创建的数组公式的 UDF【英文标题】:UDF for array formulas created from macro 【发布时间】:2016-08-30 15:43:23 【问题描述】:

我想为我在 Excel 上编写的公式创建一个 udf。公式如下:

=INDEX('Pivot-LH'!$D$5:$D$1650,SMALL(IF(B93='Pivot-LH'!$A$5:'Pivot-LH'!$A$1650,ROW('Pivot-LH'!$A$5:'Pivot-LH'!$A$1650)-ROW('Pivot-LH'!$A$5)+2),1))

基本上语法是通过 Pivot-LH 表上的一些数据查找单元格 B93(变量)并返回第 1、第 2 和第 3 个值。

我想为此定义一个 udf,并尝试通过录制宏来做到这一点。它给出了以下结果,我将其修改为输入 B93 作为名为 newroute 的变量。然而,这总是给出零值:

Public Function LH(newroute As Range) As Variant

Selection.FormulaArray = "=INDEX(R5C4:R1650C4,SMALL(IF(newroute=R5C1:R1650C1,ROW(R5C1:R1650C1)-ROW(R5C1)+2),1))"

End Function

为什么它给出的结果与公式不同?

【问题讨论】:

【参考方案1】:

如果您想从工作表公式调用LH,您的函数只能返回一个值。它不能直接更新工作表。

见:https://support.microsoft.com/en-us/kb/170787

工作表单元格中的公式调用的用户定义函数不能 更改 Microsoft Excel 的环境。这意味着这样一个 函数不能执行以下任何操作:

在电子表格中插入、删除或格式化单元格。 更改另一个单元格的值。 向工作簿移动、重命名、删除或添加工作表。 更改任何环境选项,例如计算模式或屏幕视图。 为工作簿添加名称。 设置属性或执行大多数方法。

所以你需要这样的东西:

Public Function LH(newroute As Range) As Variant

    LH = newroute.Parent.Evaluate("=INDEX(R5C4:R1650C4,SMALL(IF(" & _
                              newroute.Address() & _
            "=R5C1:R1650C1,ROW(R5C1:R1650C1)-ROW(R5C1)+2),1))"

End Function

【讨论】:

非常感谢@timWilliams。我明白你的意思。我仍然面临公式返回#Value 错误的问题。我现在输入: ' Public Function LH(newroute As Range) LH = newroute.Parent.Evaluate("=INDEX('Pivot-LH'!R5C5:R1650C5,SMALL(IF(" & _ newroute.Address() & _ "='Pivot-LH'!R5C2:'Pivot-LH'!R1650C2,ROW('Pivot-LH'!R5C2:'Pivot-LH'!R1650C2)-ROW('Pivot-LH'!R5C2)+1) ,1))") End Function' 我确定我在某处犯了一个小错误。 是否所有范围都在同一个工作表上? 它们在不同的工作表中,但即使我将范围放在同一个工作表中,我仍然会收到错误。 Debug.print 公式文本并尝试在工作表上调试它。 嗨@timwilliams,我已经为我的问题创建了一个模板工作表。你能调查一下吗。我会很感激。 [链接] (dropbox.com/s/c7c34uhx3f0k7en/Template.xlsm?dl=0)【参考方案2】:

试试这个

Public Function LH(newroute As Range) As Variant

Selection.FormulaArray = "=INDEX(R5C4:R1650C4,SMALL(IF(" & newroute.address & "=R5C1:R1650C1,ROW(R5C1:R1650C1)-ROW(R5C1)+2),1))"

End Function

【讨论】:

以上是关于从宏创建的数组公式的 UDF的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Excel 数组公式传递给 VBA UDF?

UDF数组导致#Value [重复]

数组 UDF 不断重复单个值

将多维数组传递到 VBA 中的 Excel UDF

从工作表将二维数组传递给 VBA/UDF 函数

如何为数据框中的复杂列创建包含数组(案例类)的udf