使用excel2003,公式:
=VLOOKUP(D1 ,A1:B135, 2)
如果 D1 的长度超过 255 个字符,则失败(即,列表中的一些文本长度超过 255 个字符,D1 具有相同的文本值,并且 VLOOKUP 返回 #VALUE!)。
MATCH 似乎也受到同样的字符限制。
我找不到任何关于这些限制的官方确认,例如这里:
http://office.microsoft.com/en-us/excel-help/vlookup-HP005209335.aspx
或者这里:
http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP005199291.aspx?CTT=3
我知道 excel 对公式中使用的文本长度有 255 的限制,但它表明 connate 应该可以工作(在这种情况下它不起作用,而且我没有在公式中使用字符串,而是引用了另一个单元格)。
有人可以确认这些限制是否存在(我有可能做错了其他事情)?
更重要的是,有人知道解决这些问题的方法吗?
谢谢
答案1
您始终可以编写自己的 VLOOKUP...但是,作为替代方案,您可以从查找值计算哈希值,并将其用作新的查找值。
可能会发生冲突,但使用像 MD5 这样的稍微不错的哈希算法,这应该不是问题。
要创建哈希函数,你可以使用以下想法https://stackoverflow.com/questions/125785/password-hash-function-for-excel-vba。
答案2
在 VBA 中编写自己的查找
这是一个开始:
Function MyVL(v As Range, r As Range, os As Long) As Variant
Dim cl As Range
For Each cl In r.Columns(1).Cells
If v = cl Then
MyVL = cl.Offset(0, os - 1)
Exit Function
End If
Next
End Function
答案3
我在搜索两份报告之间的精确匹配时遇到了这个问题。我将一份报告和另一份报告的几个不同字段连接成一个长字符串,然后使用 Vlookup 来确定两份报告之间 1000 条左右记录的每个字段是否匹配。就在那时,我遇到了这个问题。
因为这是一次性的事情,我可以通过将少于 255 个字符连接到 3 个单独的列中将其分解为更小的块,所以我这样做了,并编写了 3 个单独的查找,并将数据分为 3 个块而不是一次性比较。主要缺点是,在运行每个查找之前,我必须根据我想要对 3 个子组中的每一个运行查找的查找表(列)重新排序。
我认为我的解决方案对于一次性的事情来说是完全可以接受的,但如果我不得不多次这样做,我会寻找更有效的方法。
答案4
另一个考虑因素是,如果使用前 255 个字符找不到答案,则不需要它们。因此,可以在结构中嵌套查找IF()
(或者IFS()
,使用这个更好),并且可以在查找列中截断版本的值上进行每次连续查找。使用RIGHT()
和作为长度,从单元格的长度中减去 255。
如今(2021 年),LET()
已经可以使用,因此人们可以更轻松地缩短连续的长度。
当然XLOOKUP()
现在也有。我不知道它的查找值字符串长度限制,但可以肯定至少是 518 个字符。