【问题标题】:Way to overcome Excel Vlookup function limit of 256 characters克服 256 个字符的 Excel Vlookup 功能限制的方法
【发布时间】:2012-11-02 20:18:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: excel vlookup


    【解决方案1】:

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

    【讨论】:

    • INDEX(D2:D10=A2,0) 不起作用,超过 356 个字符长的值返回 false。
    • 好的,也许我遗漏了一些东西,您使用的是什么 VLOOKUP 公式,所有内容都在同一个工作表上吗?我在回答中附上了一个例子
    • 我是另一个用户,有 dame 问题,它在同一张纸上是否重要?需要类似这样的输出:属性“文本”验证失败!预期:“C:\Data\Sample_Data_for_QA”,比较:“相同”,实际:“RSS 源”。 ........#N/A -- 是输出.....Index Equation is =INDEX('[Old Regression.xlsm]Regression Report'!$E$4:$E$96,MATCH(B23 ,'[Old Regression.xlsm]回归报告'!$B$4:$B$96)) ......previous =VLOOKUP(B7,'[Old Regression.xlsm]回归报告'!$B$4:$G $96, 4, 假)
    • 不需要是同一张纸。它对我有用,但比 vlookup 慢得多
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是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 这样的编程语言在很大程度上掩盖了这一点,因为所有子操作都由您负责。

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

         0100100001100101011011000110110001101111 //Hello
      -  0110000101100010011000110000000000000000 //abc
      = -0000000000011000111111001111011010010100 //-419231380
      

      现在您可以简单地询问结果是&lt; 0&gt; 0= 0 还是近似于 0。这可以在 2 个 CPU 操作中完成。如果单元格是可变长度的(以及公式),那么首先你必须使用 CPU 用 0 填充值的末尾以使字符串达到相同的长度,然后才能执行操作。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 2018-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-21
          相关资源
          最近更新 更多