我有一个可变高度的VSTACK 输出,它可以有或没有前导空白值:
<blank>
1
<blank>
2
3
<blank>
我正在尝试删除前面的空白,如下所示:
IF(INDEX(<vstack_output>;1)="";
DROP(<vstack_output>;1);
<vstack_output>)
其计算结果为 TRUE 并删除第一个单元格,将其他值上移,但由于某种原因,输出中的最后一个单元格仍保留#N/A 错误:
1
<blank>
2
3
<blank>
#N/A // This should not be here
奇怪的是,我注意到将IF 的 FALSE 语句的值更改为随机字符串......
IF(INDEX(<vstack_output>;1)="";
DROP(<vstack_output>;1);
"random string instead of vstack output")
...实际上使 TRUE 语句按预期工作,给出以下所需的输出(请注意,它不仅删除了初始空白,还修剪了列,使其比单元格短一个):
1
<blank>
2
3
<blank>
上面的输出与我没有使用 IF 时的输出相同DROP(<vstack_output>;1)
。
我猜想这可能与数组在内存中的存储方式有关,但除此之外我一无所知。您知道为什么 TRUE if 输出可能会根据 FALSE 参数而改变吗?
您可以使用隐式交集来评估数组的左上角单元格:
并且正如@Pb 所建议的,
LET()
在等式中加入一个变量只是为了避免对 vstack 变量进行第二次计算。您所面临的问题似乎与 Excel 或 Google Sheets 处理动态数组的方式有关。在使用带有 IF 语句的 VSTACK 和 DROP 等函数时,您看到的 #N/A 错误可能是因为当您有条件地删除数组的第一行时,Excel/Sheets 可能无法正确调整数组大小,留下显示为 #N/A 的额外空间。当您用静态值替换 IF 语句中的数组时,它会强制 Excel/Sheets 正确处理数组大小,这就是问题消失的原因
我认为您可以使用
MATCH(TRUE,data<>"",0,1)
来查找第一个非空值,然后使用来查找最后一个非空值,然后使用和MATCH(TRUE,data<>"",0,-1)
对数组进行切片。DROP
TAKE
INDEX(vstack_out, 1, 1) 也可能有效
添加列参数似乎
INDEX
可以消除错误。我不确定它是否适用于所有版本,但它适用于我的 Mac Microsoft 365。我对 Excel 的经验有限,但我认为
INDEX(vstack_out, 1, 1)
被视为单个值,而INDEX(vstack_out, 1)
被视为具有单个值的数组。因此由于“广播/提升”(我最近意识到了这个术语,与CHOOSE文档中提到的行为相关)当将数组作为参数而不是单个值给出时的行为,
IF
从 扩展数组VSTACK
。也许更有经验的用户可以更好地解释这一点。