Como combinar valores de várias linhas em uma única linha

1

Eu tenho uma planilha do Excel 2007 com 2250 linhas e 19 colunas. Nessas linhas, posso ter duas linhas de informações de clientes duplicadas que precisam ser combinadas, mas apenas se a célula acima estiver vazia. Também posso ter linhas de dados do cliente que não precisam de combinação. Um único número de membro do cliente pode ser usado para identificar as linhas que precisam ser combinadas. Estou lutando para desenvolver o script VBA correto para combinar os dados exclusivos do cliente na linha (no topo) e excluir a linha restante após a combinação. Alguém está disposto a ajudar? Vai me poupar horas / dias de mão combinando essas linhas e estamos no meio de uma auditoria sensível ao tempo.

Exemplo dos nossos dados:

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

Editar (não do OP) para adicionar versão delimitada por pipe / parágrafo com sublinhados para espaços em títulos:

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 | EMPREGADOS | NOTÍCIAS | DLR
Gene | S | 550061 | 03/02/2013 || 0 | 0 |||| 0 | # N / A |||||||
Gene | S | 550061 || 03/02/2013 |||||||| 1539 | 137 || MC | MJ || SP
Steve | G | 550087 || 03/02/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

    
por Marcy 04.06.2013 / 22:54

2 respostas

0

Não tenho muita certeza do esclarecimento que você forneceu, mas aqui está mesmo assim:

Ponto-chave - o seguinte assume que dentro do MEMBRO # A DATA DE ENTRADA DO SISTEMA MVP sempre apresentará acima de ENROLL DATE.

Por segurança, trabalhe em uma cópia e adicione um número de índice a cada linha (digite ColumnA , coloque 1 em A1 , =A1+1 em A2 e copie a fórmula para Row2250. Copiar ColumnA e colar especial / valores acima.

Selecione D2 , Principal > Estilos - Formatação condicional, Nova regra, Use uma fórmula para determinar quais células devem ser formatadas. Formate os valores em que essa fórmula é verdadeira: insira =AND(NOT(ISBLANK(D2)),OR(D1=D2,D2=D3)) , Formatar, Preencher, selecione amarelo, OK, OK. Na formatação condicional - Gerenciar regras, em Aplica-se a inserir =$D$2:$D$2250 , Aplicar. ESTÁ BEM.

Selecione uma planilha inteira (clique no triângulo à esquerda de A e acima de 1 nos títulos), Dados > Ordenar & Filter –Filter e para ColumnD Filtrar por cor, selecione amarelo.

Copie a Linha1 até a última linha numerada em azul e cole em A1 de uma folha diferente (digamos, Folha2).

Na Planilha2, exclua F1 , mova as células para cima e clique em OK. Também N1:T1 . (Este é o lugar onde alguns olhos adicionais podem ser necessários.)

Adicione um novo ColumnA à Folha2. Coloque 1 em A1 , 2 em A2 , selecione A1:A2 , pegue o canto inferior direito da seleção, mantenha o botão esquerdo do mouse pressionado enquanto arrasta para baixo o quanto for necessário e até depois de pressionar e segurar Ctrl .

Selecione Folha2, Dados > Ordenar & Filtro - Classificar, verificar Meus dados tem cabeçalhos, Classificar por ColumnA (o primeiro dos 1 s!), Classificar em valores, Ordenar do menor ao maior, OK.

Anote o número da linha mais baixa que contém 2 em ColumnA da Planilha2 e o número da maior linha ocupada. Apagar ColumnA .

Volte para sua primeira planilha e exclua todas as linhas que contêm destaque amarelo.

Na Planilha2, selecione o número da linha inferior e todas as outras linhas ocupadas com um número maior de cópias e voltem para ColumnA na parte inferior da sua primeira planilha.

Espero que consiga a maior parte do que você precisa - ou, se não, que seja "um passo na direção certa"! Para verificar, sua última linha ocupada deve agora ser 2250 + 1 a menos a diferença entre os dois números indicados acima.

Para verificar MEMBRO PRIMEIRO NOME, sugiro criar uma tabela de pesquisa de MEMBRO # e que, em seguida, compare o MEMBRO FIRST NAME com base na planilha da qual você tirou uma cópia. Curt ou Curtis é presumivelmente um julgamento.

    
por 05.06.2013 / 00:12
0

Aqui está uma outra abordagem possível. Depende de três condições:

  • Um identificador único deve estar disponível para distinguir campos duplicados de não duplicados. Nesse caso, o campo MEMBER # serve a esse propósito. Em outras instâncias, o identificador pode ser construído como a combinação dos valores em vários campos. Esse id pode ser o valor em um único campo ou uma composição dos valores em vários campos.
  • Não mais do que duas duplicatas de qualquer número de MEMBRO #, ou seja, nenhum registro duplicado múltiplo triplo ou superior.
  • As linhas são classificadas no identificador MEMBER #.

A ideia é construir uma tabela transformada, mais convenientemente à direita da tabela existente, que use fórmulas para consolidar - em uma única linha - os dados parciais que são compartilhados entre duas linhas duplicadas, deixando uma linha preenchida e uma linha em branco.

Depois disso, um filtro pode ser aplicado à tabela de resultados para excluir as linhas em branco, deixando as linhas preenchidas para serem copiadas para outro local.

Como mostrado abaixo, adicionei um campo de flag "DUP" na coluna A: É igual a 1 se um MEMBER # na coluna C for igual a MEMBER # na linha precedente e for igual a 0 caso contrário. Os dois conjuntos de linhas nos dados de exemplo com MEMBER #s duplicados são destacados em amarelo.

conjuntodedadoscomocampodeflag"DUP" adicionado

Veja como é a tabela de resultados das fórmulas. Como esperado, as informações complementares que foram compartilhadas entre dois registros foram reunidas em um dos registros, deixando o outro registro preenchido com traços duplos ("-"). (Os dois conjuntos de linhas duplicadas nos dados do exemplo são destacados em azul mais escuro na tabela.)

Observando as duas primeiras linhas da tabela, que continham versões duplicadas para o MEMBRO # 550061, o segundo "Gene" na linha 4 da coluna MEMBER_FIRST_NAME foi substituído por "-"; O ENROLLMENT_DATE, anteriormente vazio, na linha 3, agora está preenchido com 3/2/2013, movido da linha 4; os valores N / A para o segundo campo DRAWING_ENTRIES (coluna M na tabela original, coluna AS no novo) foram substituídos por espaços em branco.

Tudooquerestaafazeréaplicarumfiltro,usaracolunaDUPcomocolunadecritério,selecionarapenasaslinhasondeDUPéiguala0-ecopiaroresultadoparaumnovolocal.

As fórmulas usadas para consolidar as duplicatas são essencialmente idênticas em estrutura, portanto, faz sentido examinar uma delas em tamanho. Aqui está a primeira fórmula na tabela, da célula AH3, para a coluna MEMBER_FIRST_NAME (estou incluindo no final deste post o conjunto completo de fórmulas para a primeira linha da tabela de resultados).

=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

Um comentário adicional sobre o código: a locação um pouco indireta IFERROR(<cell address>="",FALSE) é necessária para selecionar corretamente os valores de erro N / A em algumas linhas.

Código para a primeira linha da tabela de resultados

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))))
    
por 05.06.2013 / 03:18