我需要一个 VLOOKUP,它不会搜索整个列的范围,而是从根据当前单元格而变化的地址开始搜索。
company1 user1 01/2020
fixed val2 1200,00
fixed val2 1100,00
fixed val15 3000,00
company1 user2 01/2020
fixed val13 500,00
fixed val65 200,00
我正在尝试使用 VLOOKUP 搜索每个“用户”的值。我已经使用另一个公式确定了每个用户的“标题”以获取正确的地址,因此我可以使用 VLOOKUP 来查找它。
因此公式是:
VLOOKUP(<value to be found>,<formula to start cell> : <formula to last cell>,<return column number>)
问题是,无论我做什么,地址都会带有引号。
问题formula to get the start cell
出在零件上。我试过了,但没有成功:
CELL("address",INDIRECT(<cell with the address without quotes>,1))
在 VLOOKUP 之外,它返回不带引号的结果,但在公式内部,引号始终存在。即使我在上面的公式中使用 ADDRESS(),它仍然会返回带引号的结果。有人能帮我吗?
答案1
我不确定我理解你在做什么,但如果你的startCell
和endCell
公式将结果地址存储在例如A2
和中A3
,那么 VLOOKUP 的数组参数将是INDIRECT(A2):INDIRECT(A3)
A2
和/或A3
可以被任何以字符串形式返回地址的公式替换。
从长远来看,拥有一个组织得更好的数据源会对您更有帮助。
答案2
如果我从头开始解决这个问题,我会使用的策略是创建一个包含组合用户+项目值的复合索引列,然后查找该列,以相对干净和简单的方式实现我所理解的您的目标,避免嵌套函数和执行行数学运算,这很容易导致一行或两行并导致间歇性错误。
下面的例子:底部是复合索引和值查找的公式。
复合索引列将“用户”和“项目”组合在一起,中间有一个冒号(如果您需要在用户名中使用冒号,请选择另一个用户名中不存在的字符)。当某一行“固定”时,它会通过查找冒号前的文本从上面的行中提取用户名,并将项目名称添加到其中。如果该行不是“固定”的,那么它会更改当前用户。(在“用户”行中添加“#”以停止公式与空白搜索值的匹配)
复合索引列现在包含了您需要的所有信息,并且针对“用户:项目”进行简单的索引/匹配即可得到答案。
仅供参考:INDEX() 通常比 VLOOKUP() 更快、更灵活、更高效。此外,ADDRESS() 和 OFFSET() 等函数会导致工作表上不必要的重新计算,因为 Excel 的计算引擎无法提前确定它们从工作表的哪些部分获取数据。(它们被称为“易失性”函数,在大型工作表上可能会大大降低速度。)