15

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

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

有没有办法使用 Vlookup 或使用 Excel 中的其他一些内置函数来克服这个限制?

4

4 回答 4

26

如果您像这样使用 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

于 2012-11-02T22:43:00.947 回答
6

我有同样的问题,我写了这个自定义的原始 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 更差?

于 2017-06-02T13:47:45.337 回答
4

这是一个替代品的拖累,并且与上面不同的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 填充值的末尾以使字符串具有相同的长度,然后才能执行操作。

于 2018-10-25T12:18:49.880 回答
1

XLookup 不再有这样的限制。我能够用它查找 > 500 个字符。

于 2022-02-10T21:29:05.057 回答