2014-04-18 161 views
1

我正在尝试使用VLOOKUP为SMALL函数返回一个数组,以便我可以根据查找来计算X最小值。查找表如图所示。上述 enter image description hereVLOOKUP返回一个小函数数组

的图像是从“使用多少”工作表。我在公式中使用以下公式=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

狭义启动和对外工作:

(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。这个功能应该被认为是不稳定的,除非你知道更好。)

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

(2)我产生整数1-K阵列通常的方法是做这样的事情:

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

(跟随引导,使用排阵,虽然我倾向于使用列。显然,必须在一个数组公式中,但是你真正想要做的是平均数组中的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:RANK(A1:Z1,A1:Z1,1)+COLUMN(A1:Z1)/COLUMNS(A1:Z1)如果值的ID是最小的一个(在我的例子中,最小的10)的值包括在内,否则我将""传递给AVERAGE函数。

要获取要使用的项目数(在我的示例中代替“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,"")) 
+0

谢谢你的很好的解释和创造性思维。我插上这一点,跟着你的公式,我认为这将有一个例外的工作 - 空白单元格返回'#N/A的'RANK'功能。我对如何避免空白单元格的N/A有点难倒。再次感谢您的深思熟虑的分析。 – p0werenner

+1

@ p0werenner您可以取代RANK($ N9:AA9,$ N9:AA9,1)与IFERROR(RANK($ N9:AA9,$ N9:AA9,1),COUNT($ N9:AA9)+1) – maybeWeCouldStealAVan

+0

谢谢@maybeWeCouldStealAVan - 就像一个魅力。 – p0werenner