跳过数组中的列

时间:2011-03-10 18:31:35

标签: arrays excel vba

我有一个VBA函数,它返回一个要在Excel中显示的数组。数组的前两列包含不需要显示的ID。

有没有办法修改Excel公式以跳过前两列,而无需返回创建VBA帮助以剥离列?

公式如下所示,其中括号让数组跨越一系列单元格显示:

{=GetCustomers($a$1)}

4 个答案:

答案 0 :(得分:1)

Excel与内置数组操作最接近的是'INDEX'函数。在你的情况下,如果你的'GetCustomers'例程返回的数组是一行,并且如果你知道它有多长(我猜你自己将它放入工作表中),你可以得到你想要的做这样的事情:

=INDEX(GetCustomers($A$1),{3,4,5})

所以说GetCustomers()返回数组{1,2,“a”,“b”,“c”},上面只会返回{“a”,“b”,“c”}。< / p>

但是,有各种方法可以保存自己必须输入索引数组。例如,

=COLUMN(C1:E1)

将返回{3,4,5},您可以改为使用它:

=INDEX(GetCustomers($A$1),COLUMN(C1:E1))

但这个技巧不适用于真正的二维数组。如果你在正确的位置传入零,'INDEX'将返回整行或列,但我不知道如何使它返回2-D子集。编辑:你可以做到,但它很麻烦。假设你的数组是2x5,你想要最后三列。你可以使用:

=INDEX(GetCustomers($A$1), {1,1,1;2,2,2}, {3,4,5;3,4,5})

(进一步编辑:chris neilsen在他的回答中提供了计算这些数组的好方法。)

查尔斯威廉姆斯在他的网站上有一个链接,解释了有关在这里使用这样的数组的更多信息:

http://www.decisionmodels.com/optspeedj.htm

他发布了回答这个问题我问:

Is there any documentation of the behavior of built-in Excel functions called with array arguments?

就个人而言,我使用VBA辅助函数来做这样的事情。使用正确的库例程,您可以执行以下操作:

=subseq(GetCustomers($A$1),3,3)

在1-D案例中,或者:

=hstack(subseq(asCols(GetCustomers($A$1)),3,3))

在二维情况下,它更清楚。

答案 1 :(得分:0)

最简单的解决方案就是隐藏前两列

另一个可能是使用OFFSET来调整返回的数组的大小 语法是

OFFSET(reference,rows,cols,height,width)

答案 2 :(得分:0)

我建议修改'GetCustomers'函数以包含一个可选的布尔变量来告诉函数返回所有列,或者只返回单列。这将是最干净的解决方案,而不是试图在公式方面处理它。

Public Function GetCustomers(rng as Range, Optional stripColumns as Boolean = False) as Variant()

    If stripColumns Then  'Resize array to meet your needs

    Else  'return full sized array

    End If
End Function

答案 3 :(得分:0)

您可以使用INDEX函数从返回数组中提取项目 - 公式在从单元格B2开始的范围内

{=INDEX(getcustomers($A$1),ROW()-ROW($B$2)+1,COLUMN()-COLUMN($B$2)+3)}