我正在尝试将数据行转换为 4 列数据。
所有数据目前都在 1 列和数万行中。每个用户通常有 4 行相关数据:
- 用户名1
- ID1
- 电子邮件1
- 最后登录1
- 用户名2
- ID2
- 电子邮件2
- 最后登录2
- ETC...
但是,如果用户从未登录过,则没有第 4 行,下一行将直接延续。例如:
- 用户名3
- ID3
- 电子邮件3
- 最后登录3
- 用户名4
- ID4
- 电子邮件4
- 用户名5
- ID5
- 电子邮件5
- 最后登录5
(查看用户 4 没有第 4 行 LastLogIn)
如果全部用户恰好有 4 行与之关联,我可以很容易地使用以下函数将所有行变成 4 列:
=INDEX($A:$A,ROW(A1)*4-4+COLUMN(A1))
但有时缺少第 4 行让我感到困惑。有人知道我该怎么做吗:
- 抓住第一行并将其变成第 1 列。
- 抓住第二行并将其变成第二列。
- 抓住第 3 行并将其变成第 3 列。
- 如果第 4 行以“Last”开头,则抓取该行并将其转入第 4 列,如果“Last”不存在,则第 4 列 =“NEVER”。
答案1
另一个针对较旧版本的 Excel 的建议。我曾使用过 LET 函数,但很容易以延长公式为代价将其消除。
公式C2
可以复制到D2:E2
。公式F2
不同。
公式C2
和版权归E2
:
=INDEX($A:$A, 4*COUNTA(C$1:C1)-COUNTIF($F$1:$F1, "NEVER")+COLUMN(A1))&""
公式F2
:
=LET(test, INDEX($A:$A, 4*COUNTA(F$1:F1)-COUNTIF($F$1:$F1, "NEVER")+COLUMN(D1)),
IF(LEFT(test,4)="Last", test, IF(test="", "", "NEVER")))
然后C2:F2
按要求抄下来。
答案2
使用 Microsoft 365,您可以使用:
=LET(u,FILTER(ROW(A1:A19),LEFT(A1:A19)="U"),MAKEARRAY(ROWS(u),4,LAMBDA(r,c,LET(x,INDEX(A:A,INDEX(u,r)+c-1),IF(c<4,x,IF(LEFT(x)="U","NEVER",x))))))
或者
=REDUCE({"Username","ID","Email","LastLogin"},FILTER(ROW(A1:A19),LEFT(A1:A19)="U"),LAMBDA(x,y,LET(z,TOROW(INDEX(A:A,SEQUENCE(4,,y))),IFNA(VSTACK(x,TOROW(IF(LEFT(z)={"U","I","E","L"},z,NA()),2)),"NEVER"))))