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

时间:2012-11-02 20:18:22

标签: excel vlookup

我有一个包含多个值的excel数组。有些小于256个字符,有些长度大于256个。

当我尝试使用示例字符串执行VLookup时,我可以在匹配少于256个字符的行时获得结果。对于大于256个字符的行,它返回“#N / A”。

有没有办法在Excel中使用Vlookup或使用其他一些内置函数,我可以克服这个限制?

3 个答案:

答案 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公式适用于所有情况

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

答案 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填充值的末尾,以使字符串具有相同的长度。