从宏创建的数组公式的 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的主要内容,如果未能解决你的问题,请参考以下文章