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