如何使用 Excel 溢出范围将多列数组转换为两列数组
How to Use Excel Spill Range To Convert Multi-Column Array into Two Column Array
我正在尝试创建一个溢出范围解决方案,以将日期列表和多列名称转换为结构化的两列数据。我可以使用 VBA 来做到这一点,但是因为这将是自动化的并且是基于网络的,所以我需要一个溢出范围解决方案。
可以找到我的情况的样本文件in this file。
正如您将在下面看到的,我有一个 set of employees(“偷懒者”)的列表,他们在 12 月请求 vacation/PTO。我创建了两个溢出范围公式的列表,它们是:
- 列出 12 月所有天数的专栏
- 请求休假的懒惰者列表(水平排列)。
第 2 部分提出了问题,因为懒惰者的数量不一致,我不确定如何为每一行创建额外的日期。因此,我的问题是如何构建一个 filter/Array 公式来按天列出每个员工。
在接下来的选项卡中,您可以看到我想要的结果。我用宏来生成这个,但是因为这是基于网络的,所以我不能使用它。
我尝试了各种混合和匹配数组公式和过滤器,但找不到用每个名称填充日期的方法。
虽然我的问题范围是解决从多列到 2 列方法的这种转换,但我很高兴听到针对整体概念的评论。
如果有超过 8 个潜在懒汉,您可能需要调整 maxWidth。
=LET(maxWidth,8,
days,ByDay!A2#,
slackerBox,OFFSET(days,,1,,maxWidth),
ndx,SEQUENCE(ROWS(days)*maxWidth),
ndxDay,INT(ndx-1)/maxWidth+1,
slackerList,INDEX(slackerBox,ndxDay,MOD(ndx-1,maxWidth)+1),
FILTER(CHOOSE({1,2},INDEX(days,ndxDay),slackerList),slackerList<>0))
这是你的数据table:
=LET(
end, PtoRequestsTable[End],
strt, PtoRequestsTable[Start],
us, PtoRequestsTable[Slacker],
usCnt, COUNTA(us),
lst, DATE(YEAR(TODAY()),12,1),
led, DATE(YEAR(TODAY()),12,31),
dtSq, INT(SEQUENCE((led-lst+1)*usCnt,,lst,1/usCnt)),
md, MOD(SEQUENCE((led-lst+1)*usCnt,,0),usCnt)+1,
ussl, IF((INDEX(end,md)>=dtSq)*(INDEX(strt,md)<=dtSq),INDEX(us,md),""),
SORT(FILTER(CHOOSE({1,2},dtSq,ussl),ussl<>""),1,-1)
)
它会随着table自动变大变小。它还将开始日期和结束日期作为输入。
我正在尝试创建一个溢出范围解决方案,以将日期列表和多列名称转换为结构化的两列数据。我可以使用 VBA 来做到这一点,但是因为这将是自动化的并且是基于网络的,所以我需要一个溢出范围解决方案。
可以找到我的情况的样本文件in this file。
正如您将在下面看到的,我有一个 set of employees(“偷懒者”)的列表,他们在 12 月请求 vacation/PTO。我创建了两个溢出范围公式的列表,它们是:
- 列出 12 月所有天数的专栏
- 请求休假的懒惰者列表(水平排列)。
第 2 部分提出了问题,因为懒惰者的数量不一致,我不确定如何为每一行创建额外的日期。因此,我的问题是如何构建一个 filter/Array 公式来按天列出每个员工。
在接下来的选项卡中,您可以看到我想要的结果。我用宏来生成这个,但是因为这是基于网络的,所以我不能使用它。
我尝试了各种混合和匹配数组公式和过滤器,但找不到用每个名称填充日期的方法。
虽然我的问题范围是解决从多列到 2 列方法的这种转换,但我很高兴听到针对整体概念的评论。
如果有超过 8 个潜在懒汉,您可能需要调整 maxWidth。
=LET(maxWidth,8,
days,ByDay!A2#,
slackerBox,OFFSET(days,,1,,maxWidth),
ndx,SEQUENCE(ROWS(days)*maxWidth),
ndxDay,INT(ndx-1)/maxWidth+1,
slackerList,INDEX(slackerBox,ndxDay,MOD(ndx-1,maxWidth)+1),
FILTER(CHOOSE({1,2},INDEX(days,ndxDay),slackerList),slackerList<>0))
这是你的数据table:
=LET(
end, PtoRequestsTable[End],
strt, PtoRequestsTable[Start],
us, PtoRequestsTable[Slacker],
usCnt, COUNTA(us),
lst, DATE(YEAR(TODAY()),12,1),
led, DATE(YEAR(TODAY()),12,31),
dtSq, INT(SEQUENCE((led-lst+1)*usCnt,,lst,1/usCnt)),
md, MOD(SEQUENCE((led-lst+1)*usCnt,,0),usCnt)+1,
ussl, IF((INDEX(end,md)>=dtSq)*(INDEX(strt,md)<=dtSq),INDEX(us,md),""),
SORT(FILTER(CHOOSE({1,2},dtSq,ussl),ussl<>""),1,-1)
)
它会随着table自动变大变小。它还将开始日期和结束日期作为输入。