2016-08-05 2 views
0

Я зациклился на том, как логически подойти к проблеме, так как для этого могут потребоваться двумерные массивы, или, возможно, я слишком задумываюсь над проблемой.Excel VBA - Сравнение данных столбца с уникальными идентификаторами

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

Например, вот пример из Лист1:

1 | 06/08 
1 | 06/15 
1 | 06/16 
1 | 06/17 
1 | 06/22 
1 | 06/23 
1 | 06/30 
1 | 07/01 
1 | 07/05 
1 | 07/06 
1 | 07/07 
1 | 07/12 
1 | 07/15 
1 | 07/18 
2 | 06/24 
2 | 06/30 
2 | 07/05 
2 | 07/06 
2 | 07/07 
2 | 07/08 
2 | 07/14 

А вот пример из листа 2:

1 | 06/07 
1 | 06/16 
1 | 06/17 
1 | 06/23 
1 | 07/06 
1 | 07/07 
1 | 07/18 
1 | 06/21 
1 | 06/28 
1 | 07/08 
1 | 07/14 
2 | 06/09 
2 | 07/13 

В основном, это, как предполагается, чтобы проверить прогресс по дате для каждого идентификатора , Даты на Листе 1 имеют даты предоставления обязательств, когда проект должен быть обновлен. Даты на Листе 2 имеют даты, когда проект был фактически обновлен для этой последовательности.

Основной логический цикл - это взять все уникальные идентификаторы и, предположительно, сохранить их в массиве.

Затем для каждого уникального значения в этом массиве просмотрите каждую уникальную дату для этого идентификатора в Sheet1. На эту дату в Листе 1 есть ли дата в Листе2, которая равна или раньше? Если это так, проект был успешно обновлен в этот день.

Но вот сложная часть, эта дата на Sheet2 теперь должна быть отброшена, поскольку она была «использована». Теперь мы переходим к следующей дате Sheet1 для этого идентификатора. Есть ли другая дата для этого идентификатора в Sheet2, которая равна или раньше? И так далее.

Любая помощь, которую вы можете предоставить для перевода этой логики в VBA, будет очень признательна! Простое сравнение было бы простым, но для этого уровня сложности требуется гораздо больше VBA, чем я сейчас знаком.

ответ

0

Нет необходимости в VBA. Используйте эту формулу в С1 на Лист1 и перетащите вниз для всех ваших данных:

=B1>=OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),2,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0) 

Эта формула возвратит TRUE, если он найдет подходящую обновленное дату и FALSE, если дата обязательство не соблюдается.

EDIT

Два дополнительный пункт:

  1. Существует небольшая ошибка, где формула может читать 'дату обновления' из следующего идентификатора. Скорректированная версия:

    =AND(B1>=OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),2,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0), OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet2!$A:$A, 0),1,1,1,"Sheet2")), IFERROR(COUNTIF(OFFSET(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")),0,0,ROW()-ROW(INDIRECT(ADDRESS(MATCH(Sheet1!A1, Sheet1!A:A, 0),3,1,1,"Sheet1")))),TRUE),0),0)=Sheet1!A1) 
    
  2. Оба листа должны быть отсортированы по как идентификатор (столбец «A») и дату (колонка «B»)

+0

Это работало отлично, спасибо, и это гораздо более элегантное решение, чем то, что я пытался выполнить с помощью 4 массивов и VBA. – yutingxiang

+0

@yutingxiang Я рад помочь. Если этот ответ разрешил ваш вопрос, пожалуйста, подумайте о его принятии, нажав галочку. Это означает, что вы нашли решение для сообщества. Это не обязательно. – hstay