答案1
该评论虽然Mark Fitzgerald
是正确的,但还不够准确。
正确的部分是第四个参数既未指定也未指定为 FALSE。
如果未指定,则默认为 TRUE。如果指定为 TRUE,则也为 TRUE。无论哪种情况,您都会遇到此处看到的问题,但此处还发生了其他事情,导致您得到不满意的结果。
在解决这个问题之前,我应该指出,在像你这样的用法中,你显然需要精确匹配才能获得正确的结果。因此,你必须添加第四个参数并将其设为 FALSE,以便它寻找精确匹配。那么我将要解决的根本问题就不重要了,这是一个好处。
真正的问题在于您如何告诉 Excel 使用哪个范围进行查找:第二个参数。您使用的C:V
参数告诉 Excel 使用这些列中的每个单元格。有很多理由不这样做,但这里最重要的一个与第四个参数的 TRUE 值有关。
当它为 TRUE 时,Microsoft 告诉我们VLOOKUP()
(以及在不期望精确匹配的情况下查找内容时的一些其他函数)将搜索数据,直到找到“大于”查找值的单元格,然后停止,并返回该“大于”值之前的值。我要说的是,这并非事实,但对于您的困难来说已经足够接近事实了。
根据他们的主张,他们认为只有当查找列(此处为 C 列)按从低到高排序(“AZ”)时,才会出现正确的结果。而且这几乎总是可行的,即使在您的案例中,也可能如此(但可能性高达 99.99%)。不幸的是,大量人根本无法在不弄乱数据中的其他功能的情况下进行这种排序。对于大多数人来说,他们只是希望根据其他条件进行排序,而不能按查找列排序。
那么,您发生了什么事?查找在 C 列中查找“CA-whatever”。但是...它从单元格 C1 中的列标题开始。该标题是“条形码”...到目前为止(有点)很好。然后在单元格 C2 中,它找到了“大于”查找值(以“CA”开头)的东西。假设它在单元格 C2 中按字母顺序找到它和标题后面的东西。它立即停止并“撤退”回标题单元格。这是范围内的第 1 行,它向右读取 S 列并在该单元格(S1)中找到“房间”。这就是它返回的内容。
事实上,如果 C2 的字母顺序没有超过查找值,它肯定会在到达 C380 之前找到一些东西,并停在那个较早的点,后退一行,然后返回该行的 S 列值。这也可能是错误的,但它可能没有明显到让你注意到。毕竟,它会给出一些看起来正常的空间。一切可能看起来都不错。然而,现在很容易就有 4 个或 32 个,甚至 200-300 个错误值。
正如我在开始时提到的,无论如何您显然都需要精确匹配,因此请将第四个参数添加到查找中。使用FALSE
,而不是TRUE
。FALSE 将强制它查找精确匹配。
由于该问题发布于两年前,您似乎已经以某种方式解决了它。但也许这对其他人有用,有人可能会发现它甚至有助于解释使用其他函数添加结果,这些函数据称像 MS 所说的那样工作,但实际上就像我说的那样工作,尽管我触及了它只是整个主题的一小部分!但任何执行查找的函数都可能遇到它。MATCH()
和XMATCH()
,甚至是新XLOOKUP()
功能。不可否认,较新的函数仅在使用非精确匹配时才会遇到它,但因为它们确实如此,而且人们确实以这种方式使用它们……而且还有其他时候会出现这种情况。