从宏

时间:2016-08-30 15:43:24

标签: vba udf

我想为我在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,并尝试通过录制宏来完成此操作。它给出了以下结果,我修改后将其作为名为newroute的变量输入B93。但是,这总是给出零值:

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

为什么它没有给出与公式相同的结果?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个

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