问题定义:
在单元格中输入任意数量A1.现在在第一行的任何地方尝试以下公式.
=SUM(INDIRECT("A"&ROW()))
Run Code Online (Sandbox Code Playgroud)
和
=SUMPRODUCT(INDIRECT("A"&ROW()))
Run Code Online (Sandbox Code Playgroud)
第一个公式计算,第二个公式给出#VALUE错误.这是由ROW()函数内部表现不同引起的SUMPRODUCT().
在第一个公式中,ROW()返回1.在第二个公式中,行返回{1}(一个长度的数组),即使公式尚未作为CSE公式输入.
为什么会这样?
背景
我需要评估一种类型的公式
=SUMPRODUCT(INDIRECT(*range formed by concatenation and using ROW()*)>1)
Run Code Online (Sandbox Code Playgroud)
这样可以解决错误.作为这个问题的解决方法,我现在计算ROW()在另一个单元格中(显然在同一行中)并在我的内部连接INDIRECT().或者,我也尝试将它封装在sum函数中,就像SUM(ROW())它一样.
如果有人可以解释(或指向一个可以解释的资源),为什么ROW()在SUMPRODUCT()没有输入CSE的情况下返回一个数组,我当然会感激.
这段代码是我工作的一小部分.我已将问题缩小到以下部分.我有这个UDF SampleFunction,我需要传递一个数组,{3; 4}作为唯一的参数.
Function SampleFunction(InputVar As Variant) As Integer
SampleFunction = InputVar(LBound(InputVar))
End Function
Run Code Online (Sandbox Code Playgroud)
我用两种不同的方式称之为UDF.首先,通过VBA
Sub testSF()
MsgBox SampleFunction(Array(3, 4))
End Sub
Run Code Online (Sandbox Code Playgroud)
其次,通过我的excel工作表作为
={SampleFunction(ROW(3:4))} - >即作为数组函数.
UDF适用于案例1,即通过VBA调用#VALUE,当我通过excel工作表调用它时,它为案例2 提供了错误.
我在案例2中使用F8逐步执行该函数.Lbound(InputVar)计算结果为1(这与从案例1中的子句调用不同,它的计算结果为0),但InputVar(Lbound(InputVar))在案例2中显示"下标超出范围"错误.
我想知道的是如何从工作表中调用SampleFunction函数,即Case 2,使其具有与上面显示的Case 1相同的行为.作为奖励,如果有人可以解释为什么Lbound(InputVar)在上述情况下进行不同的评估会很好.
一些其他细节:
我正在构建一个UDF来执行一些正则表达式操作.InputVar上面的论点将是一个数组{x; y; z; ...},指定xth,yth,zth ......出现.数据类型InputVar保留为Variant,因为我希望能够将任意数字(作为一个长度数组),数组或范围(接收并转换为数组)传递给函数.
提前致谢!!