我有一个VBA函数,它返回一个要在Excel中显示的数组。数组的前两列包含不需要显示的ID。
有没有办法修改Excel公式以跳过前两列,而无需返回创建VBA帮助以剥离列?
公式如下所示,其中括号让数组跨越一系列单元格显示:
{=GetCustomers($a$1)}
答案 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)}