我试图避免重复计算与记录相同的索引,因此我是否应该使用 MATCH 预先计算索引隐藏单元格在我的桌子上方?
还值得注意的是,虽然我的表格不会很大,但也不会很小。大概会有 6 个表格,每个表格有一两个 VLOOKUPS(全列),总记录数为数百。
更准确地说,我将在 Excel 中创建一组表,并使用 VLOOKUP 函数模拟适当的关系数据库的功能来获取相关表的值,但我将使用 MATCH 函数通过其标题获取我想要的列的索引。以下是我实际使用的公式:
=VLOOKUP([@ForeignKey],RelatedTable,MATCH(RelatedTable[[#Headers],[ItemName]],RelatedTable[#Headers],0),FALSE)
'按参数细分 VLOOKUP( 查找值 := [@ForeignKey] 表数组 := 相关表 Col_index_num := '返回 MATCH 匹配( 查找值 := RelatedTable[[#Headers],[ItemName]] Lookup_array := RelatedTable[#Headers] Match_type := 0 '完全匹配 Range_lookup := FALSE '完全匹配
编辑:
第一个表是带有主键的表。后两个是我所指的两个示例中的任何一个。
表_产品 ╔════╦════════╦═════════════════╦═════════════╗ ║ ║ A║ B║ C║ ╠════╬═════════╬═════════════════╬═════════════╣ ║ 1 ║ 商品ID ║ 商品名称 ║ 商品价格 ║ ╠════╬═════════╬═════════════════╬═════════════╣ ║ 2 ║ 1 ║ 触控笔 ║ 25.00 美元 ║ ╠════╬═════════╬═════════════════╬═════════════╣ ║ 3 ║ 2 ║ 机械键盘 ║ $ 120.00 ║ ╠════╬═════════╬═════════════════╬═════════════╣ ║ 4 ║ 3 ║ 监控 ║ $ 750.00 ║ ╚════╩═════════╩═════════════════╩═════════════╝ 表_交易 要么像这样 ╔════╦════════╦═════════╦═══════╦═════════════════════════╗ ║ ║ A║ B║ C║ D║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 1 ║ 客户 ID ║ 商品 ID ║ 数量 ║ 商品名称 ║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 2 ║ 101 ║ 3 ║ 1 ║ VLOOKUP(,,Match(,,),) ║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 3║ 102║ 3║ 2║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 4║ 103║ 3║ 1║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 5║ 104║ 2║ 3║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 6║ 105║ 1║ 8║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 7║ 106║ 2║ 2║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 8║ 107║ 2║ 1║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 9║ 108║ 2║ 2║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 10║ 109║ 1║ 4║...║ ╠════╬═════════╬═════════╬═══════╬══════════════════════════╣ ║ 11║ 110║ 2║ 16║ ...║ ╚════╩═════════╩═════════╩═══════╩══════════════════════════╝ 或者像这样 (D1 单元格不是表格的一部分) ╔════╦════════╦═════════╦═══════╦══════════════════╗ ║ ║ A║ B║ C║ D║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 1 ║ ║ ║ ║ 匹配(,,)║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 2 ║ 客户 ID ║ 商品 ID ║ 数量 ║ 商品名称 ║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 3 ║ 101 ║ 3 ║ 1 ║ VLOOKUP(,,D$1,) ║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 4║ 102║ 3║ 2║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 5║ 103║ 3║ 1║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 6║ 104║ 2║ 3║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 7║ 105║ 1║ 8║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 8║ 106║ 2║ 2║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 9║ 107║ 2║ 1║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 10║ 108║ 2║ 2║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 11║ 109║ 1║ 4║...║ ╠════╬═════════╬═════════╬═══════╬════════════════════╣ ║ 12║ 110║ 2║ 16║...║ ╚════╩═════════╩═════════╩═══════╩═══════════════════╝
答案1
我会在 D2 中写入,=index(Table_Products'$B:$B,(match($B2,Table_Products'$A:$A,0))
如果您想更改要返回的列,也可以进行双向匹配,而不是对项目名称列(B 列)进行硬编码。如果您需要,我可以修改答案。
我每天都在包含 1000 个多表查找的表单上使用它,没有发现任何性能问题。一般来说,Index/Match 比 Vlookup 更好,因为 vlookup 需要处理整个范围。