如何使用 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。我创建了两个溢出范围公式的列表,它们是:

  1. 列出 12 月所有天数的专栏
  2. 请求休假的懒惰者列表(水平排列)。

第 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自动变大变小。它还将开始日期和结束日期作为输入。