我有一个包含多个值的 excel 数组。有些少于 256 个字符,有些长度大于 256。
当我尝试使用示例字符串进行 VLookup 时,当它与少于 256 个字符的行匹配时,我可以获得结果。对于超过 256 个字符的行,它返回一个“#N/A”。
有没有办法使用 Vlookup 或使用 Excel 中的其他一些内置函数来克服这个限制?
如果您像这样使用 VLOOKUP
=VLOOKUP(A2,D2:Z10,3,FALSE)
即在 D2:D10 中查找 A2 并从 F2:F10 返回结果然后尝试使用此公式
=INDEX(F2:F10,MATCH(TRUE,INDEX(D2:D10=A2,0),0))
根据需要更改范围
编辑:
我在这里模拟了一个示例 - A2:A10 中的值与 G2:G10 相同,但顺序不同。每个值的长度显示在 B 列中,C 列中的 VLOOKUP 在 col A 值 > 255 个字符时失败,但 col D 中的 INDEX/MATCH 公式在所有情况下都有效
我有同样的问题,我写了这个自定义的原始 vlookup。它不关心单元格值的长度。
Function betterSearch(searchCell, A As Range, B As Range)
For Each cell In A
If cell.Value = searchCell.Value Then
betterSearch = B.Cells(cell.Row, 1)
Exit For
End If
betterSearch = "Not found"
Next
End Function
PS 不禁想知道为什么专业人士编写的原始 VLOOKUP 在这种特殊情况下实现起来比这个 10 行 func 更差?
这是一个替代品的拖累,并且与上面不同的Match()
是,它也是优化的 vba 代码。betterSearch
Public Function Match2(search As String, lookupArray As Range, Optional match_type As Integer = 0) As Long
Application.Volatile
Dim vArray As Variant
vArray = lookupArray.Value
For i = 1 To UBound(vArray, 1)
If match_type = 0 Then
If search = vArray(i, 1) Then
Match2 = i
Exit Function
End If
Else
If match_type = -1 Then
If search <= vArray(i, 1) Then
Match2 = i
Exit Function
End If
Else
If search >= vArray(i, 1) Then
Match2 = i
Exit Function
End If
End If
End If
Next
End Function
用法:
Index(rangeA, Match2(LookupValue, LookupRange, 0)
上面Ans说:
不禁想知道为什么专业人士编写的原始 VLOOKUP 在这种特殊情况下的实现比这个 10 行 func 更差?
优化和性能。如果您将字符数限制为 255,这仅需要 CPU 上的 2 次操作,而可变长度字符串的比较在 CPU 上需要更多步骤,因为您必须重复比较 255 个字符宽度。像 VBA 这样的编程语言使这一点变得模糊不清,因为所有子操作都已为您处理好。
例如,要比较两个固定长度为 5 的字符串“Hello”和“abc”,那么我们只需在 CPU 上执行以下操作:
0100100001100101011011000110110001101111 //Hello
- 0110000101100010011000110000000000000000 //abc
= -0000000000011000111111001111011010010100 //-419231380
现在您可以简单地询问结果是< 0
、> 0
还是= 0
近似 0。这可以在 2 个 CPU 操作中完成。如果单元格是可变长度的(以及公式也是),那么首先你必须使用 CPU 用 0 填充值的末尾以使字符串具有相同的长度,然后才能执行操作。
XLookup 不再有这样的限制。我能够用它查找 > 500 个字符。