克服Excel Vlookup函数限制为256个字符的方法

Way to overcome Excel Vlookup function limit of 256 characters

我有一个具有多个值的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个字符时失败,但在D列中的INDEX / MATCH公式在所有情况下均有效

https://www.dropbox.com/s/fe0sb6bkl3phqdr/vlookup.xls


我遇到了同样的问题,并编写了此自定义原始vlookup。它不在乎单元格值的长度。

1
2
3
4
5
6
7
8
9
10
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行功能要差得多?


这是对Match()的替代,也是与上述betterSearch不同的优化的vba代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

用法:

1
Index(rangeA, Match2(LookupValue, LookupRange, 0)

上面安斯说:

Can't help but wonder why the original VLOOKUP written by
professionals is implemented in this particular case more poorly
than this 10-lined func?

优化和性能。如果将字符数限制为255,则在CPU上仅需要2个操作,而比较可变长字符串在CPU上需要执行更多的步骤,因为必须重复比较255个字符宽度。诸如VBA之类的编程语言在很多情况下都无法解决这一问题,因为所有子操作都为您服务。

例如,要比较固定长度为5的2个字符串" Hello"和" abc",那么我们只需在CPU上执行以下操作:

1
2
3
   0100100001100101011011000110110001101111 //Hello
-  0110000101100010011000110000000000000000 //abc
= -0000000000011000111111001111011010010100 //-419231380

现在,您可以简单地询问结果是< 0> 0= 0还是大约0。这可以通过2个CPU操作来完成。如果单元格的长度是可变的(还包括公式),那么在执行操作之前,首先必须使用CPU用0填充值的末尾,以使字符串具有相同的长度。