Указание направления поиска в функции Excel VLOOKUP () - PullRequest
0 голосов
/ 29 августа 2018

Есть много хороших ответов о переполнении стека, описывающих, как использовать функцию VLOOKUP() в Excel. Некоторые из них, которые я исследовал до того, как задать этот вопрос, находятся здесь:

Похоже, что VLOOKUP() по умолчанию возвращает первую соответствующую запись в таблице (то есть поиск "top-first"). У меня есть необходимость вместо этого возвращать последнюю запись в таблице (т. Е. Поиск «снизу первым») - есть ли способ указать направление поиска с помощью функции VLOOKUP() или, за исключением этого, альтернативная функция, которая работает как VLOOKUP(), но позволяет указать направление поиска?

EDIT: Вот образец моих данных. У меня есть сетевой трафик, в котором я пытаюсь вычислить разницу во времени между пакетами с одинаковыми идентификаторами.

Packet ID  Timestamp (ms)
A          0.0
B          1.0
C          2.0
C          3.0
A          4.0
B          5.0
.          .
.          .
.          .

и мне нужно рассчитать разницу во времени, как показано ниже

Packet ID  Timestamp (ms) Timestamp Difference (ms, packet ID basis)
A          0.0            0.0
B          1.0            0.0
C          2.0            0.0
C          3.0            1.0 (i.e. "3.0 - 2.0")
A          4.0            4.0 (i.e. "4.0 - 0.0")
B          5.0            4.0 (i.e. "5.0 - 1.0")
C          6.0            3.0 (i.e. "6.0 - 3.0")
.          .              .
.          .              .
.          .              .

Для этого я пытаюсь создать VLOOKUP() для Packet ID, чтобы найти метку времени непосредственно предыдущего пакета с тем же идентификатором.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Почему бы не создать свой VLOOKUP() UDF?

Function VLOOKUP2(lookupVal, tblArray As Range, colIndex As Long)

    Dim r As Long
    r = tblArray.Find(What:=lookupVal, SearchDirection:=xlPrevious).Row
    VLOOKUP2 = tblArray(r, colIndex)

End Function

Отказ от ответственности: степень моего тестирования - это то, что вы видите на изображении ниже.

enter image description here

0 голосов
/ 29 августа 2018

С этой страницы , вы можете использовать:

=LOOKUP(2,1/(A2:A12=D2),B2:B12)

и для игнорирования нулей вы можете использовать эту формулу CSE (введите с помощью CTRL + SHIFT + ENTER )

=LOOKUP(9.99999999999999E+307,IF(A2:A12=D2,IF(ISNUMBER(B2:B12),B2:B12))) 

(Регулировка диапазонов по мере необходимости)

0 голосов
/ 29 августа 2018

Как говорит @tim, обычно лучше использовать уникальные значения в качестве индексов, чтобы у вас не возникало проблем при сортировке. Если это что-то, что не является индексом (например, датой), тогда это нормально.

Я бы использовал формулу массива (нажмите Ctrl, Shft, Enter, чтобы добавить фигурные скобки, а не просто введите):

{=INDEX(K34:K38,LARGE(IF(K34:K38="a",ROW(K34:K38),),1)-ROW(K34)+1)}

Вот разбивка:

INDEX(<<target column range>>,

 #Compare all the recorded row numbers, and get the largest
 LARGE(

     #For each item in the column, check to see if it matches the 
     #search value
  IF(<<column range to search>> = <<value to search>>,
     #if it does, record its row number          
     ROW(<<column range to search>>),
  )
 )

 #since we are getting the absolute row number (not relative to the
 #target column, we need to calculate an offset
 -ROW(<<start item>>)

 #excel ranges start at 1 and not 0 so we have to correct the offset
 +1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...