VLOOKUP返回一个SMALL函数数组

时间:2014-04-18 17:13:11

标签: excel excel-formula

我正在尝试使用VLOOKUP返回SMALL函数的数组,以便我可以根据查找来评估X最小值。查找表如图所示。 enter image description here

上面的图片来自“使用多少”'工作表。我使用下面的公式=VLOOKUP(COUNTA($N9:AA9),'How Many to Use'!A2:C14,3)但是我的公式上的Excel扼流圈(#VALUE)因为它返回了预期的数组但是将其作为文本返回,而不是我希望为SMALL提供的真实数组功能。 有没有办法将其转换为实际数组?

上下文中的完整公式是尝试在我的主工作表中平均使用数组中的一定数量的值,并根据行的值中的完整计数对最小的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 个答案:

答案 0 :(得分:1)

从狭隘开始向外工作:

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

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是要包含的项目数,以数组公式的形式输入。

您不能仅仅使用SMALL作为包含测试的原因,正如您无疑已经知道的那样,第k项可能是具有相同值的几个中的一个。所以,我使用RANK为每个值赋一个整数(如果它们已经是整数,这不是必需的)然后我根据外观的顺序添加一个分数,为每个保持其位置的值产生一个id:{{1如果值的id是最小的(在我的示例中,最小的10)之一,则包含该值,否则我将RANK(A1:Z1,A1:Z1,1)+COLUMN(A1:Z1)/COLUMNS(A1:Z1)传递给AVERAGE函数。

要获取要使用的项目数(代替我的示例中的“10”),您可以使用表查找或使用""等规则。

因此,使用您的范围的最终公式可能是:

MAX(1,MIN(10,COUNT(A1:Z1)-1))