1

У меня есть таблица Excel 2007 с 2250 строками и 19 столбцами. В этих строках у меня может быть две строки дубликата информации о клиенте, которые необходимо объединить, но только если ячейка выше пуста. У меня также могут быть строки данных о клиентах, которые не нуждаются в объединении. Уникальный номер участника клиента может использоваться для идентификации строк, которые необходимо объединить. Я изо всех сил пытаюсь разработать правильный сценарий VBA, чтобы объединить уникальные данные о клиентах в одну строку (сверху) и удалить строку, оставшуюся после объединения. Кто-нибудь готов помочь? Это сэкономит мне часы / дни на ручное объединение этих строк, и мы находимся в середине чувствительного ко времени аудита.

Образец наших данных:

MEMBER FIRST NAME   MEMBER LAST NAME    MEMBER #    MVP SYSTEM ENTRY DATE   ENROLL DATE MVP POINTS  DRAWING ENTRIES ENROLL FORM?    POINTS CORRECT? POINTS MISSED   FINAL POINTS    DRAWING ENTRIES SP Talon #  WP Talon #  BD  DEPT    EMPLOYEE    NOTES   DLR
Gene    S   550061  3/2/2013        0   0               0   #N/A                            
Gene    S   550061      3/2/2013                                1539    137     MC  MJ      SP
Steve   G   550087      3/2/2013                                30019   1588        PA  NR      WP
Curtis  S   550128  4/24/2013       5   0               5   #N/A                            
Curt    S   550128      4/24/2013                               358 47      MC  MJ      SP

Отредактируйте (не из OP), чтобы добавить версию с разделителем для трубы / абзаца с подчеркиванием для пробелов в заголовках:

MEMBER_FIRST_NAME | MEMBER_LAST_NAME | MEMBER_ # | MVP_SYSTEM_ENTRY_DATE | ENROLL_DATE | MVP_POINTS | DRAWING_ENTRIES | ENROLL_FORM?| POINTS_CORRECT?| POINTS_MISSED | FINAL_POINTS | DRAWING_ENTRIES | SP_Talon_ # | WP_Talon_ # | BD | DEPT | СОТРУДНИК | ПРИМЕЧАНИЯ | DLR
Gene | S | 550061 | 03/02/2013 || 0 | 0 |||| 0 | # N/A |||||||
Gene | S | 550061 || 03/02/2013 |||||||| 1539 | 137 || MC | MJ || SP
Стив | G | 550087 || 03/02/2013 |||||||| 30019 | 1588 || PA | NR || WP
Кертис | S | 550128 | 4/24/2013 || 5 | 0 |||| 5 | # N/A |||||||
Curt | S | 550128 || 4/24/2013 |||||||| 358 | 47 || MC | MJ || SP

2 ответа2

0

Я не слишком уверен в разъяснениях, которые вы предоставили, но здесь все равно идет!

Ключевой момент - следующее предполагает, что в MEMBER # MVP SYSTEM ENTRY DATE всегда будет указываться выше ENROLL DATE.

В целях безопасности работайте с копией и добавьте индексный номер в каждую строку (например, вставьте ColumnA , введите 1 в A1 , =A1+1 в A2 и скопируйте формулу до Row2250. Скопируйте ColumnA и вставьте специальные / значения поверх.

Выберите D2 , Главная> Стили - Условное форматирование, Новое правило, Используйте формулу, чтобы определить, какие ячейки форматировать, Отформатируйте значения, где эта формула верна: вставьте =AND(NOT(ISBLANK(D2)),OR(D1=D2,D2=D3)) , Format, Fill, выберите желтый, OK, OK. В разделе «Условное форматирование - управление правилами» в поле «Применить» введите =$D$2:$D$2250 , «Применить». ХОРОШО.

Выберите всю электронную таблицу (нажмите на треугольник слева от A и над 1 в заголовках), выберите Данные> Сортировать и отфильтровать - Фильтр, а для ColumnD Фильтровать по цвету выберите желтый.

Скопируйте Row1 до последней строки, пронумерованной синим, и вставьте в A1 другого листа (скажем, Sheet2).

В Листе 2 удалите F1 , Сдвиньте ячейки вверх, ОК. Также N1:T1 . (Именно здесь может потребоваться дополнительное зрение.)

Добавьте новую ColumnA к Sheet2. Поместите 1 в A1 , 2 в A2 , выберите A1:A2 , возьмите правый нижний угол выделения, удерживайте нажатой левую кнопку мыши, одновременно перетаскивая ее вниз до тех пор, пока не нажмете и не удерживаете Ctrl.

Выберите «Лист2», «Данные»> «Сортировать и отфильтровать» - «Сортировать», проверить, что «Мои данные имеют заголовки», «Сортировать по ColumnA (первый из 1 с!)», «Сортировать по значениям», «Порядок наименьшего к наибольшему», «ОК».

Обратите внимание на самый низкий номер строки, который содержит 2 в ColumnA Sheet2 и номер самой высокой занятой строки. Удалить ColumnA

Вернитесь на свой первый лист и удалите все строки, содержащие желтую подсветку.

На Листе 2 выберите нижний номер строки и все другие занятые строки с копией с большим номером и вернитесь обратно в ColumnA внизу вашего первого листа.

Надеюсь, это достигнет большинства того, что вам нужно, или, если нет, то это «шаг в правильном направлении»! Чтобы проверить, ваша последняя занятая строка теперь должна быть на 2250+1 меньше разницы между двумя числами, отмеченными выше.

Чтобы проверить имя первого члена, я предлагаю создать таблицу поиска MEMBER #, а затем сравнить имя первого члена на этой основе в листе, копию которого вы взяли. Курт или Кертис - это, по-видимому, суждение.

0

Вот еще один возможный подход. Это зависит от трех условий:

  • Уникальный идентификатор должен быть доступен, чтобы отличить дубликаты от не дубликатов полей. В этом случае поле MEMBER # служит для этой цели. В других случаях идентификатор может быть создан как комбинация значений в нескольких полях.Этот идентификатор может быть значением в одном поле или составом значений в нескольких полях.
  • Не более двух дубликатов любого MEMBER #, т. Е. Не три или более многократных "дубликатов" записей.
  • Строки сортируются по идентификатору MEMBER #.

Идея состоит в том, чтобы построить преобразованную таблицу, наиболее удобно справа от существующей таблицы, которая использует формулы для объединения - в одну строку - частичных данных, которые совместно используются двумя дублирующимися строками, оставляя одну заполненную строку и одну пустую строка.

После этого к таблице результатов можно применить фильтр, чтобы исключить пустые строки, оставив заполненные строки для копирования в другое место.

Как показано ниже, я добавил поле флага "DUP" в столбце A: оно равно 1, если MEMBER # в столбце C равно MEMBER # в предыдущей строке, и равно 0 в противном случае. Два набора строк в данных примера с дублирующими номерами MEMBER # выделены желтым цветом.

набор данных с добавленным полем флага "DUP"

Вот как выглядит таблица результатов формул. Как и ожидалось, дополнительная информация, которая была передана между двумя записями, была собрана в одну из записей, а другая запись была заполнена двойными черточками («-»). (Два набора повторяющихся строк в данных примера выделены темно-синим цветом в таблице.)

Если посмотреть на первые две строки таблицы, в которой содержались дубликаты версий для MEMBER # 550061, второй "Gene" в строке 4 столбца MEMBER_FIRST_NAME был заменен на «-»; ранее пустое поле ENROLLMENT_DATE в строке 3 теперь заполнено 3/2/2013, перемещено вверх из строки 4; значения N/A для второго поля DRAWING_ENTRIES (столбец M в исходной таблице, столбец AS в новой) были заменены пробелами.

преобразованная таблица с дублированными строками, помеченными и пустыми

Все, что осталось сделать - это применить фильтр, использовать столбец DUP в качестве столбца критерия, выбрать только те строки, где DUP равен 0 - и скопировать результат в новое место.

отфильтрованный набор данных

Формулы, используемые для объединения дубликатов, по сути идентичны по структуре, поэтому имеет смысл изучить один подробно. Вот первая формула в таблице, из ячейки AH3, для столбца MEMBER_FIRST_NAME (я включаю в конце этого поста полный набор формул для первой строки таблицы результатов).

=IF($A3=1,                               If this is row 2 of a DUP set,
  "--",                                    Set value of the result cell to "--"
                                         Otherwise it's a row 1 (maybe a dup, maybe not)
  IF($A4=0,                                Is the following row its dup?
    IF(IFERROR(B3="",FALSE),"",B3),          No, set result to the value on this row 
    IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)), Yes, but is this row's value blank or error?
      IF(IFERROR(B4="",FALSE),"",B4),          Yes, use the value from the following row
      IF(IFERROR(B3="",FALSE),"",B3))))        No, use the value from this row

Еще один комментарий к коду: несколько обходное определение IFERROR(<cell address>="",FALSE) необходимо для правильного отображения значений ошибок N/A в некоторых строках.

Код для первой строки таблицы результатов

DUP         =IF(D3=D2,1,0)
FNAME       =IF($A3=1,"--",IF($A4=0,IF(IFERROR(B3="",FALSE),"",B3),IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)),IF(IFERROR(B4="",FALSE),"",B4),IF(IFERROR(B3="",FALSE),"",B3))))
LNAME       =IF($A3=1,"--",IF($A4=0,IF(IFERROR(C3="",FALSE),"",C3),IF(OR(IFERROR(C3="",FALSE),ISERROR(C3)),IF(IFERROR(C4="",FALSE),"",C4),IF(IFERROR(C3="",FALSE),"",C3))))
MEMBER#     =IF($A3=1,"--",IF($A4=0,IF(IFERROR(D3="",FALSE),"",D3),IF(OR(IFERROR(D3="",FALSE),ISERROR(D3)),IF(IFERROR(D4="",FALSE),"",D4),IF(IFERROR(D3="",FALSE),"",D3))))
ENTRY DT    =IF($A3=1,"--",IF($A4=0,IF(IFERROR(E3="",FALSE),"",E3),IF(OR(IFERROR(E3="",FALSE),ISERROR(E3)),IF(IFERROR(E4="",FALSE),"",E4),IF(IFERROR(E3="",FALSE),"",E3))))
ENROL_DT    =IF($A3=1,"--",IF($A4=0,IF(IFERROR(F3="",FALSE),"",F3),IF(OR(IFERROR(F3="",FALSE),ISERROR(F3)),IF(IFERROR(F4="",FALSE),"",F4),IF(IFERROR(F3="",FALSE),"",F3))))
MVP_PTS     =IF($A3=1,"--",IF($A4=0,IF(IFERROR(G3="",FALSE),"",G3),IF(OR(IFERROR(G3="",FALSE),ISERROR(G3)),IF(IFERROR(G4="",FALSE),"",G4),IF(IFERROR(G3="",FALSE),"",G3))))
ENTRIES     =IF($A3=1,"--",IF($A4=0,IF(IFERROR(H3="",FALSE),"",H3),IF(OR(IFERROR(H3="",FALSE),ISERROR(H3)),IF(IFERROR(H4="",FALSE),"",H4),IF(IFERROR(H3="",FALSE),"",H3))))
FORM        =IF($A3=1,"--",IF($A4=0,IF(IFERROR(I3="",FALSE),"",I3),IF(OR(IFERROR(I3="",FALSE),ISERROR(I3)),IF(IFERROR(I4="",FALSE),"",I4),IF(IFERROR(I3="",FALSE),"",I3))))
PTS_CORRECT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(J3="",FALSE),"",J3),IF(OR(IFERROR(J3="",FALSE),ISERROR(J3)),IF(IFERROR(J4="",FALSE),"",J4),IF(IFERROR(J3="",FALSE),"",J3))))
PTS_MISSED  =IF($A3=1,"--",IF($A4=0,IF(IFERROR(K3="",FALSE),"",K3),IF(OR(IFERROR(K3="",FALSE),ISERROR(K3)),IF(IFERROR(K4="",FALSE),"",K4),IF(IFERROR(K3="",FALSE),"",K3))))
FINAL_PTS   =IF($A3=1,"--",IF($A4=0,IF(IFERROR(L3="",FALSE),"",L3),IF(OR(IFERROR(L3="",FALSE),ISERROR(L3)),IF(IFERROR(L4="",FALSE),"",L4),IF(IFERROR(L3="",FALSE),"",L3))))
DR_ENTRIES  =IF($A3=1,"--",IF($A4=0,IF(IFERROR(M3="",FALSE),"",M3),IF(OR(IFERROR(M3="",FALSE),ISERROR(M3)),IF(IFERROR(M4="",FALSE),"",M4),IF(IFERROR(M3="",FALSE),"",M3))))
SP_TALON    =IF($A3=1,"--",IF($A4=0,IF(IFERROR(N3="",FALSE),"",N3),IF(OR(IFERROR(N3="",FALSE),ISERROR(N3)),IF(IFERROR(N4="",FALSE),"",N4),IF(IFERROR(N3="",FALSE),"",N3))))
WP_TALON    =IF($A3=1,"--",IF($A4=0,IF(IFERROR(O3="",FALSE),"",O3),IF(OR(IFERROR(O3="",FALSE),ISERROR(O3)),IF(IFERROR(O4="",FALSE),"",O4),IF(IFERROR(O3="",FALSE),"",O3))))
BD          =IF($A3=1,"--",IF($A4=0,IF(IFERROR(P3="",FALSE),"",P3),IF(OR(IFERROR(P3="",FALSE),ISERROR(P3)),IF(IFERROR(P4="",FALSE),"",P4),IF(IFERROR(P3="",FALSE),"",P3))))
DEPT        =IF($A3=1,"--",IF($A4=0,IF(IFERROR(Q3="",FALSE),"",Q3),IF(OR(IFERROR(Q3="",FALSE),ISERROR(Q3)),IF(IFERROR(Q4="",FALSE),"",Q4),IF(IFERROR(Q3="",FALSE),"",Q3))))
EMPL        =IF($A3=1,"--",IF($A4=0,IF(IFERROR(R3="",FALSE),"",R3),IF(OR(IFERROR(R3="",FALSE),ISERROR(R3)),IF(IFERROR(R4="",FALSE),"",R4),IF(IFERROR(R3="",FALSE),"",R3))))
NOTES       =IF($A3=1,"--",IF($A4=0,IF(IFERROR(S3="",FALSE),"",S3),IF(OR(IFERROR(S3="",FALSE),ISERROR(S3)),IF(IFERROR(S4="",FALSE),"",S4),IF(IFERROR(S3="",FALSE),"",S3))))
DLR         =IF($A3=1,"--",IF($A4=0,IF(IFERROR(T3="",FALSE),"",T3),IF(OR(IFERROR(T3="",FALSE),ISERROR(T3)),IF(IFERROR(T4="",FALSE),"",T4),IF(IFERROR(T3="",FALSE),"",T3))))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .