VLOOKUP为SMALL函数返回一个数组

我正在尝试使用VLOOKUP为SMALL函数返回一个数组,以便我可以根据查找来计算X个最小的值。 查找表如图所示。 在这里输入图像说明

上面的图片来自“如何使用”工作表。 我在公式中使用下面的公式=VLOOKUP(COUNTA($N9:AA9),'How Many to Use'!A2:C14,3)但Excel公式(#VALUE),因为它返回期望的数组,但返回它作为文本,而不是我希望的小function真正的数组。 有没有办法将其转换为实际的数组?

在上下文中的完整公式试图平均使用我的主工作表中的数组中的一定数量的值,并根据行的值中的全部计数平均最小的X值。

 =IF(COUNT($N9:Z9)<>0,IF(COUNT($N9:Z9)<=3,AVERAGE($N9:Z9),SUM(SMALL(INDEX($N9:Z9,MATCH(TRUE,COLUMN($N9:Z9)=LARGE(NOT(ISBLANK($N9:Z9))*COLUMN($N9:Z9),COUNTA($N9:AA9)),0)):Z9,VLOOKUP(COUNTA($N9:AA9),'How Many to Use'!A2:C14,3)))/VLOOKUP(COUNTA($N9:AA9),'How Many to Use'!A2:C14,2)),"") 

狭义地开始工作:

(1)要直接回答你的问题,你可以使用VBA将string转换为数组,例如:

 Function Eval(formulaText As String, Optional stable As Boolean = False) As Variant Application.Volatile Not stable Eval = Evaluate(formulaText) End Function 

=Eval(VLOOKUP(COUNTA($N9:AA9),'How Many to Use'!A2:C14,3),true)

(注意,即使你不需要这个机制,我也包含了volatile机制,因为你使用的方式是一个特殊情况,不需要声明volatile。除非你知道更好,否则这个函数应该被认为是volatile的。 )

但是,这不是真的有必要。

(2)我通常的方法来生成一个1-K整数数组是做类似的事情:

 =COLUMN(A1:INDEX(1:1,k)) 

(在你的领导下,使用一个行数组,虽然我倾向于使用列。显然,必须在数组公式中。

(3)但是你真正想要做的是平均数组中的k个最小值。 为此,我只是这样做:

 =AVERAGE(IF(RANK(A1:Z1,A1:Z1,1)+COLUMN(A1:Z1)/COLUMNS(A1:Z1)<=SMALL(RANK(A1:Z1,A1:Z1,1)+COLUMN(A1:Z1)/COLUMNS(A1:Z1),10),A1:Z1,"")) 

其中A1:Z1是数组,10是要包含的项的数量,作为数组公式input。

你不能仅仅使用SMALL作为包含testing,因为你毫无疑问已经知道,第k项可能是几个具有相同价值的项目之一。 所以,我使用RANK为每个值分配一个整数(如果它们已经是整数,这是没有必要的),那么我会根据外观顺序添加一个分数,以便为每个保持其位置的值生成一个ID: RANK(A1:Z1,A1:Z1,1)+COLUMN(A1:Z1)/COLUMNS(A1:Z1)如果一个值的id是最小的一个(在我的例子中是最小的10) ""到AVERAGEfunction。

要获取要使用的项目数(在我的示例中代替“10”),可以使用表查找或使用MAX(1,MIN(10,COUNT(A1:Z1)-1))

所以,最后的公式,使用你的范围,可能是:

 =AVERAGE(IF(RANK($N9:AA9,$N9:AA9,1)+COLUMN($N9:AA9)/COLUMNS($N9:AA9)<=SMALL(RANK($N9:AA9,$N9:AA9,1)+COLUMN($N9:AA9)/COLUMNS($N9:AA9),MAX(1,MIN(10,COUNT($N9:AA9)-1))),$N9:AA9,""))