我有一个包含多个值的excel数组。有些小于256个字符,有些长度大于256个。
当我尝试使用示例字符串执行VLookup时,我可以在匹配少于256个字符的行时获得结果。对于大于256个字符的行,它返回“#N / A”。
有没有办法在Excel中使用Vlookup或使用其他一些内置函数,我可以克服这个限制?
答案 0 :(得分:19)
如果你正在使用这样的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公式适用于所有情况
答案 1 :(得分:5)
我遇到了同样的问题,我已经编写了这个自定义原语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行的功能更差?
答案 2 :(得分:0)
这是Match()
的替代品,并且与上面的betterSearch
不同,它也是经过优化的vba代码。
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)
在安斯上方说:
不禁想知道为什么原始的VLOOKUP由 在这种特殊情况下,专业人员的实施情况较差 而不是这个10行功能?
优化和性能。如果将字符数限制为255,则在CPU上仅需要2个操作,而比较可变长度字符串在CPU上需要执行更多的步骤,因为必须重复比较255个字符宽度。诸如VBA之类的编程语言在很多情况下都难以理解,因为所有子操作都为您服务。
例如,要比较2个固定长度5的字符串“ Hello”和“ abc”,那么我们只需在CPU上执行以下操作:
0100100001100101011011000110110001101111 //Hello
- 0110000101100010011000110000000000000000 //abc
= -0000000000011000111111001111011010010100 //-419231380
现在,您可以简单地询问结果是< 0
,> 0
,= 0
还是大约0。这可以通过2个CPU操作来完成。如果单元格的长度是可变的(并且公式也是),那么在执行操作之前,首先必须使用CPU用0填充值的末尾,以使字符串具有相同的长度。