我收集了一些在不同日期发表过演讲的演讲者。
Date,1/2/2023,1/2/2022,1/2/2021,1/2/2020,1/2/2019,1/2/2018
1st-Speaker,Jim,John,Fred,Sam,Scott,Riley
2nd-Speaker,Henry,Susan,John,Henry,Scott,Hugo
Lunch,Bob,Haley,Jim,Ed,Orin,Clark
3rd-Speaker,Simba,Riley,Sam,Scott,Ed,Hal
我想找到他们发言的最近(第一个,最左边)的日期。使用:
=INDEX($B$1:$G$1,SUMPRODUCT(MAX(($B$3:$G$6=D13)*(COLUMN($B$3:$G$6))))-COLUMN($B$1)+1)
我可以得到他们交谈的第一个日期(最后一个,最右边)(D13 是我正在查询的说话者),但更改MAX
为MIN
并没有返回任何东西。
我如何更新方程式以给出第一个实例而不是最后一个实例?
答案1
=INDEX($B$1:$G$1,1,MIN(IF($B$3:$G$6=Z1,COLUMN($B$3:$G$6)-COLUMN($B$3)+1)))
解释:
如果数据与演讲者匹配,则返回相对于起始列 B3 的列号
IF($B$3:$H$6=Z1,COLUMN($B$3:$H$6)-COLUMN($B$3)+1)
在结果数组中查找最小值
MIN(...)
从最小值返回第一行(日期)的值
INDEX($B$1:$H$1, 1, ...)
IFERROR(...,"")
如果有人没有发言则添加句柄(我还必须将单元格格式化为特定的日期,否则它就是日期序列-或使用TEXT(..., "dd/mm/yyyy")
)
答案2
如果您的原始数据如下:
并且您拥有 Microsoft 365,则可以在某些单元格中使用以下单个公式:
=LET(
spkrs, SORT(UNIQUE(TOCOL($B$3:$G$6))),
dts, BYROW(
spkrs,
LAMBDA(arr,
MAX(
$B$1:$G$1 *
ISNUMBER(FIND(arr, $B$3:$G$6))
)
)
),
VSTACK(
{"Speaker", "Most Recent Date"},
HSTACK(spkrs, dts)
)
)
结果将SPILL
显示所有发言者的最近日期:
注意:您可以创建并使用结构化引用来代替硬编码的范围引用,Table
这些引用会在您添加(或删除)数据时自动调整范围
如果您命名表格,Speaker
则可以使用如下公式:
=LET(
x, SORT(UNIQUE(TOCOL(DROP(Speaker, , 1)))),
spkrs, FILTER(x, x <> ""),
dts, BYROW(
spkrs,
LAMBDA(arr,
MAX(
DROP(Speaker[#Headers], , 1) *
ISNUMBER(
FIND(arr, DROP(Speaker, , 1))
)
)
)
),
VSTACK(
{"Speaker", "Most Recent Date"},
HSTACK(spkrs, dts)
)
)
答案3
此公式适用于 Excel 和 Google 表格。它首先构建数据的两行表示,最终在按名称过滤的列中找到 MIN() 日期。我最初尝试使用 MINIFS() 来执行现在由 FILTER() 处理的操作,但出现了错误:
=LET(crit, D13,
dates,$B$1:$G$1,
namerow, TOROW($B$3:$G$6),
daterow,HSTACK(dates,dates,dates,dates),
tbl,VSTACK(daterow,namerow),
fltr,FILTER(tbl,INDEX(tbl,2)=crit),
MIN(INDEX(fltr,1)))