示例: 假设我有几个1D数组,例如A,B和C:
A B C
--- --- ---
2 4 99
3 5 37
4 6 42
7
我想使用公式来填充这些数组(命名范围),因此它们具有相同的行数。 (编辑,提供更完整的解释:)我还希望能够将每个数组的起始位置移动指定的行数。这是一个示例输出,我将A移动两个,B移动三个,C移动一个位置:
A' B' C'
--- --- ---
0 0 0
0 0 99
2 0 37
3 0 42
4 4 0
0 5 0
0 6 0
0 7 0
所以填充其中一个数组的“公式”(实际上是多个现有标准公式的组合)实际上会有四个输入:原始数组名称/范围,在原始数组开头填充的值的数量,最后填充的数字和填充值(即0,NA()等)。
初步方法: 我的第一次尝试是将三个数组部分(开始填充数组,原始数组和结束填充数组)连接成一个数组,如下所示:
=INDIRECT("{" & IF(_NPadBegin>0, REPT(_PadVal&",", _NPadBegin-1) & _PadVal&",", "") & _ArrayName & IF(_NPadEnd>0, "," & REPT(_PadVal&",", _NPadEnd-1) & _PadVal, "") &"}")
(其中带有下划线的变量是四个输入的命名范围)
但是,似乎不可能像这样构建一个数组。我已经搜索了使用公式组合1D数组的其他方法,但是空洞了。
另一种方法可能是创建一个具有最终所需长度的数组,并最初使用填充值填充它。例如,创建一个8行为0的A'数组。(我可以在动态公式中执行此步骤。)然后,您可以使用原始数组覆盖此初始化数组中的值,确保将原始数组移位到正确的位置。例如,用A值覆盖A'的第2行到第4行中的0值。(我无法弄清楚如何执行第二步......)
背景 我有多个1D数据数组(使用动态命名范围生成),我想在一个折线图上一起绘制。然而,数组具有不同的长度,因此我需要在数组的开头/结尾处使用一定数量的NA()值填充每个数组。他们还需要根据指数“排队”。
在VBA中实现这一点可能不会太困难,但我更喜欢(非用户定义的)基于公式的解决方案。
答案 0 :(得分:2)
如果您在A2:A4中有值2,3和4,请尝试此公式
=IF(COUNTIF(A2:A4,ROW(INDIRECT("1:"&D2))-1),ROW(INDIRECT("1:"&D2))-1,0)
其中D2包含值的数量(在您的示例中为8)。
这将返回此数组
{0;0;2;3;4;0;0;0}
假设数字序列从零开始 - 公式末尾的零是“填充值”,根据需要更改
根据评论,您可以使用此数组公式
=IF((ROW(INDIRECT("1:"&NPadBegin+NPadEnd+ROWS(_ArrayName)))>NPadBegin)*(ROW(INDIRECT("1:"&NPadBegin+NPadEnd+ROWS(_ArrayName)))<=ROWS(_ArrayName)+NPadBegin),N(OFFSET(_ArrayName,ROW(INDIRECT("1:"&NPadBegin+NPadEnd+ROWS(_ArrayName)))-1-NPadBegin,0,1)),PadVal)
假设_ArrayName是垂直 1D数组