【问题标题】:UDF for array formulas created from macro从宏创建的数组公式的 UDF
【发布时间】: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

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

【问题讨论】:

    标签: vba udf


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多