2015-10-08 5 views
0

Добрый день, очень нужна помощь в отношении определенного результата поиска/возврата excel. Я пробовал INDEX/MATCH, VLOOKUP и VBA, но все они потерпели неудачу, так как я не очень хорошо знаком с ними.Excel Formula/Excel-Macro/Duplicate data

enter image description here Проблема в этом.

Значение поиска будет идентификатором productID и ContractID и типом изменения. В этом случае это «delete», который имеет несколько значений. Я хотел бы вернуть значения в столбце Old Value на основе последней даты в столбце Valid From. Поэтому

LOOKUP VALUE - идентификатор продукта - договор ID - тип изменения

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

+0

Часто ли ваши данные меняются? Если нет, мы можем отсортировать его (или создать отсортированную копию где-нибудь), а затем найти первое совпадение при запросе по некоторым критериям. –

+0

Да, это часто меняется. часть «delete» может содержать 10 элементов в одном файле. вот почему мне тяжело – avumlas

+0

Это выглядит просто, как правило, с помощью процедуры цикла VBA, но я боюсь, что это слишком медленно, если набор данных большой. –

ответ

0

Возможно, это сработает? не уверен, вы можете попробовать его видеть, делает ли она:

=SUMPRODUCT((A:A=123456)*(B:B="SGSINtest")*(C:C="delete")*(D:D=MAX(IF(AND(A:A=123456,B:B="SGSINtest,C:C=""delete"),D:D)))*(E:E)) 

где колонок А представляет идентификатор продукта столбец B представляет идентификатор и столбца C представляет тип и D представляет дату Действительно с E представляет OldValue?

+0

Нет гарантии, что каждый из этих диапазонов будет иметь одинаковый размер. Чаще всего это не так. Это почти всегда показывает # N/A, но интересно, хотя. –

+0

Я попробовал ваш и немного изменил его, но, поскольку B: B = "", он немного определен. – avumlas

+0

вы можете подставить «SGSINtest» любым идентификатором. – Stanley

0

Это (очень простой) макрос, который должен дать вам как-то то, что вы ищете, но будьте осторожны, что он не оптимизирован, может быть очень медленным на больших данных, и, кроме того, он предполагает, что столбцы даты отформатированы как типы даты. Учитывая критерии, он дает вам строку (как объект Range), которая соответствует критериям и имеет наивысшую дату, если выполняется более одной строки. Если ни одна строка не соответствует критериям, она возвращает «Ничего».

Function rowWithHighestVF(productId As Long, contractId As String, typeOfChange As String) As Range 
    Dim r As Range, validFrom As Date, maxVF As Date: maxVF = 0 
    For Each r In UsedRange.Rows 
     If r.Cells(1) = productId And r.Cells(2) = contractId And r.Cells(3) = typeOfChange Then 
      validFrom = r.Cells(4) 
      If validFrom > maxVF Then 
       maxVF = validFrom 
       Set rowWithHighestVF = r 
      End If 
     End If 
    Next 
    If Not rowWithHighestVF Is nothing then rowWithHighestVF.Activate 
End Function 

Это отправная точка. Заставьте его работать с вашими данными, а затем попытайтесь его оптимизировать. Надеюсь, поможет.

+0

плохо попробуйте это первым и вернитесь к вам – avumlas