我在使用 Excel 时遇到了一些问题。想知道是否有人可以帮我解答?
假设你有一个包含两张表的 Excel,sheetA 和 sheetB
在 sheetA 上,您有如下表格
item 1
a value
b value
c value
d value
item 2
a value
b value
c value
d value
item 3
a value
b value
c value
d value
.... 等等
另外,我们不能假设任何固定的位置,因为有时我们可能有一个没有任何子项目的项目,或者比其他项目有更多的子项目,例如:
item X
a value
c value
d value
item Y
a value
b value
c value
d value
e value
item Z
c value
d value
e value
f value
在 sheetB 上我想检索特定的子项值,例如
第 3 项
b(我想使用一个函数来查找并找到本例中的第 3 项,并返回 b 的值
最有效的方法是什么?你能帮助我吗?
例如
在 SheetA 上我们有
Item1 a 700 b 500 c 800 Item2 a 750 b 550 d 320(Item2 中没有“c”,而是“d”)Item3 b 1020(Item3 中没有“a”)c 740 d 120
e 470(Item3 中多了一个“e”)
现在在同一个工作簿但不同的工作表中,我想要一个公式来返回 b 的值,例如,不同的项目 1,2,3,如下所示:
Item2,b = 函数将返回 550 Item3,b = 函数将返回 1020 Item1,b = 函数将返回 500
这可以在 Excel 中完成吗?问候
答案1
首先,假设 Sheet1 的 A 列中的项目是唯一的。然后运行 VLOOKUP:
=VLOOKUP("b", Sheet1!$A:$B, 2, FALSE)
这将在范围 Sheet1!$A:$B 的第一列中查找第一个完全匹配项,然后返回范围第 2 列中的相应值。VLOOKUP 的高级和较新的兄弟是 XLOOKUP,它提供了更多的自由度(搜索列不必是第 1 列,您可以从下往上搜索等)。您还可以将 VLOOKUP 分为两个步骤:
=MATCH("b", Sheet1!$A:$A, 0)
返回第一个匹配项发生的行号作为索引,然后:
=INDEX(Sheet1!$B:$B, MATCH("b", Sheet1!$A:$A, 0))
返回 B 列中匹配行号的值。
解释的原因很简单。普通的 VLOOKUP 不行。我们需要进行两次 MATCH 搜索。首先,我们需要找到“项目 3”的行号,然后使用第一个 MATCH 作为初始点。因此,第一次出现“项目 3”的行索引是
=MATCH("Item 3", Sheet1!$A:$A, 0)
搜索“b”的范围是
=INDEX(Sheet1!$A:$A, MATCH("Item 3", Sheet1!$A:$A, 0)+1):INDEX(Sheet1!$A:$A, MATCH("Item 3", Sheet1!$A:$A, 0)+10)
假设最多有 10 个子项目(您可以根据需要将 +10 设置得尽可能大)。
现在让 MATCH 在上述范围内搜索正确的“b”,它将返回行索引偏移量(关系到起始位置计算如下):
=MATCH("b", INDEX(Sheet1!$A:$A, MATCH("Item 3", Sheet1!$A:$A, 0)+1):INDEX(Sheet1!$A:$A, MATCH("Item 3", Sheet1!$A:$A, 0)+10), 0)
最后,使用 INDEX 进入 B 列起始位置+行索引偏移量:
=INDEX(Sheet1!$B:$B, MATCH("Item 3", Sheet1!$A:$A, 0) + MATCH("b", INDEX(Sheet1!$A:$A, MATCH("Item 3", Sheet1!$A:$A, 0)+1):INDEX(Sheet1!$A:$A, MATCH("Item 3", Sheet1!$A:$A, 0)+10), 0))
Ps. Excel 365 版本使用 LET 变量:
=LET(item, "Item 3", subitem, "b", maxsubitems, 10, itemrow, MATCH(item, Sheet1!$A:$A, 0), itemrange, INDEX(Sheet1!$A:$A, itemrow+1):INDEX(Sheet1!$A:$A, itemrow+maxsubitems), rowoffset, MATCH(subitem, itemrange, 0), INDEX(Sheet1!$B:$B, itemrow + rowoffset))