4

示例: 假设我有几个一维数组,例如 A、B 和 C:

 A    B    C
---  ---  ---
 2    4    99
 3    5    37
 4    6    42
      7

我想使用一个公式来填充这些数组中的每一个(称为范围),以便它们具有相同的行数。 (已编辑,以提供更完整的解释:) 我还希望能够将每个数组的起始位置移动指定的行数。这是一个示例输出,其中我将 A 移动 2,B 移动 3,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, "") &"}")

(其中带下划线的变量是四个输入的命名范围)

但是,似乎不可能构建这样的数组。我已经搜索了使用公式组合一维数组的其他方法,但结果为空。

另一种方法可能是创建一个具有最终所需长度的数组,并最初用填充值填充它。例如,创建一个包含 8 行 0 的 A' 数组。(我可以在动态公式中执行此步骤。)然后您可以用原始数组覆盖这个初始化数组中的值,确保将原始数组转移到正确的位置。例如,用 A 的值覆盖 A' 的第 2 行到第 4 行中的 0 值。(我不知道如何执行第二步...)

背景: 我有多个一维数据数组(使用动态命名范围生成),我想将它们一起绘制在一个折线图上。然而,数组有不同的长度,所以我需要在数组的开头/结尾用一定数量的 NA() 值填充每个数组。它们还需要根据索引“排列”。

在 VBA 中实现这一点可能不会太难,但我更喜欢(非用户定义的)基于公式的解决方案。

4

1 回答 1

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 是一个垂直的一维数组

于 2012-12-04T18:37:46.943 回答