我很惊讶 Excel 竟然没有一个简单的功能2D_LOOKUP(array, row, col)
。例如,我有一个正在管理的复杂 Excel 表,我经常想在给定日期提取给定参数的值。
作为一个具体的例子,我想说:
日期1 | 日期2 | 日期3 | 日期4 | |
---|---|---|---|---|
第 1 行 | A | 乙 | C | 德 |
第 2 行 | 埃 | F | G | H |
第 3 行 | 我 | J | 钾 | 大号 |
然后打电话2D_LOOKUP(Array, Row2, Date2)
再回复F
。
不过,多亏了lambda
我现在可以定义这样的函数了。有多种方法可以做到这一点 - 使用XLOOKUP
、使用INDEX
和MATCH
使用VLOOKUP
等。
我很好奇什么是最佳的实现方式。代码本身可能很复杂,因为我的计划是通过 a 在名称管理器中定义它,LAMBDA
然后从现在开始忘掉它。
我看见https://medium.com/@gareth.stretton/excel-matrix-lookup-with-lambda-30a345472152这似乎有一个很好的解决方案,但是MAKEARRAY
我不确定它的效率如何。
要明确的是,我正在寻找一个完整的解决方案——我想要我(以及后续读者)可以直接放入名称管理器的代码。
谢谢!/YGA
答案1
这是一种不使用任何LAMBDA()
辅助函数的方法:
• 单元格中使用的公式C8
=_2D_LOOKUP(A1:E4,A7,A8)
其中,_2D_LOOKUP()
是名称管理器中定义的名称,参考以下公式:
=LAMBDA(Array,Row,Col,
LET(
_Data, Array,
_Array, DROP(_Data,1,1),
_Row, DROP(TAKE(_Data,,1),1),
_Col, DROP(TAKE(_Data,1),,1),
XLOOKUP(Row,_Row,XLOOKUP(Col,_Col,_Array,""),"")))
自定义LAMBDA()
函数及其参数为
=_2D_LOOKUP(Array, Row, Col)
Excel 命名规则
在名称管理器中定义名称时,应遵循以下基本规则:
• 名称应位于255 characters long
。
• 名称不能包含spaces
和大多数punctuation characters
。
• 名称必须以letter
,underscore (_)
, 或者backslash (\)
。如果名称以其他内容开头,Excel 将抛出错误。
• Excel 名称是case-insensitive
。
• 不能cell references
喜欢MAT1
或者SSS1
到某个范围。
• 可以使用单个字母来命名范围,如、、、a
等,但字母、、、和除外(因为这些字符在 中键入时用作选择当前选定单元格的行或列的快捷方式)。b
D
r
R
c
C
NameBox
命名准则摘自这里
答案2
我不知道这个版本是更快还是更慢,但它在处理错误数据方面确实做得更好。
=LAMBDA(Array,Row,Col,
LET(ACol, MATCH(Col, TAKE(Array, 1), 0),
ARow, MATCH(Row, TAKE(Array, ,1), 0),
IFERROR(INDEX(Array, ARow, ACol), "")))
另一个具有VLOOKUP
功能的版本(稍微短一些):
=LAMBDA(Array,Row,Col,
LET(ACol, MATCH(Col, TAKE(Array, 1), 0),
IFERROR(VLOOKUP(Row, Array, ACol, FALSE), "")))