Способ преодоления ограничения функции Excel Vlookup в 256 символов

У меня есть массив excel с несколькими значениями. Некоторые содержат менее 256 символов, а некоторые имеют длину более 256.

Когда я попытался выполнить VLookup, используя образец строки, я могу получить результаты, когда он соответствует строкам с менее чем 256 символами. Для строк, содержащих более 256 символов, возвращается «#Н/Д».

Есть ли способ использовать Vlookup или использовать какую-либо другую встроенную функцию в Excel, чтобы преодолеть это ограничение?


person sandyiit    schedule 02.11.2012    source источник


Ответы (3)


Если вы используете функцию ВПР, как это

=VLOOKUP(A2,D2:Z10,3,FALSE)

то есть поиск A2 в D2: D10 и возврат результата из F2: F10, а затем попробуйте эту формулу вместо этого

=INDEX(F2:F10,MATCH(TRUE,INDEX(D2:D10=A2,0),0))

изменить диапазоны по мере необходимости

Изменить:

Я смоделировал образец здесь — значения в A2: A10 такие же, как в G2: G10, но в другом порядке. Длина каждого из этих значений показана в столбце B, ВПР в столбце C не выполняется для значений столбца A > 255 символов, но формула ИНДЕКС/ПОИСКПОЗ в столбце D работает во всех случаях.

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

person barry houdini    schedule 02.11.2012
comment
INDEX(D2:D10=A2,0) не работает и возвращает false для значений длиной более 356 символов. - person sandyiit; 06.11.2012
comment
Хорошо, возможно, я что-то упустил, какую формулу ВПР вы используете, все ли на одном листе? Я прикрепил пример в своем ответе - person barry houdini; 07.11.2012
comment
Я другой пользователь с проблемой дам, какая разница, что она на том же листе? Что-то вроде этого вывода требуется: Проверка свойства «Текст» не удалась! Ожидаемый: «C:\Data\Sample_Data_for_QA», Сравнение: «То же самое», Фактический: «RSS-каналы». ........#Н/Д -- вывод .....Уравнение индекса =ИНДЕКС('[Старая регрессия.xlsm]Отчет о регрессии'!$E$4:$E$96,MATCH(B23 ,'[Old Regression.xlsm]Отчет о регрессии'!$B$4:$B$96)) ......previous =VLOOKUP(B7,'[Old Regression.xlsm]Отчет о регрессии'!$B$4:$G $96, 4, ЛОЖЬ) - person Michael Dimmitt; 27.05.2016
comment
Это не обязательно должен быть один и тот же лист. У меня это сработало, но намного медленнее, чем vlookup - person Peter; 19.01.2021

У меня была та же проблема, и я написал этот пользовательский примитивный поиск. Его не волнует длина значений ваших ячеек.

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 Невольно возникает вопрос, почему оригинальная ВПР, написанная профессионалами, реализована в данном конкретном случае хуже, чем эта 10-строчная функция?

person Ans    schedule 02.06.2017

Это перетаскивание вместо 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)

Выше Анс сказал:

Невольно удивляешься, почему оригинальная ВПР, написанная профессионалами, реализована в данном конкретном случае хуже, чем эта 10-строчная функция?

Оптимизация и производительность. Если вы ограничиваете количество символов до 255, это требует только 2 операций на ЦП, тогда как сравнение строк переменной длины требует гораздо больше шагов на ЦП, потому что вам приходится многократно сравнивать ширину 255 символов. Языки программирования, такие как VBA, сильно скрывают это, потому что все подоперации выполняются за вас.

Например, чтобы сравнить 2 строки «Hello» и «abc» фиксированной длины 5, мы просто выполняем следующую операцию на процессоре:

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

Теперь вы можете просто спросить, является ли результат < 0, > 0, = 0 или даже приблизительно равным 0. Это можно сделать за 2 операции процессора. Если ячейки имеют переменную длину (а также формулы), то сначала вам придется использовать ЦП, чтобы дополнить конец значения нулями, чтобы получить строки одинаковой длины, прежде чем вы сможете выполнять операции.

person Sancarn    schedule 25.10.2018