Unificação de regis...
 
Notifications
Clear all

Unificação de registros em linhas diferentes

5 Posts
2 Usuários
0 Reactions
533 Visualizações
(@flprm)
Posts: 0
New Member
Topic starter
 

Olá pessoal!

Estou depurando um banco de dados para algumas análises estatísticas e o primeiro passo é garantir que cada linha corresponda a um registro único, que refere-se a um cliente. Ocorre que no arquivo de trabalho existem mais de uma linha para um mesmo cliente, mas contendo algumas informações distintas. Para dar o passo seguinte, preciso fazer com que todas as informações do mesmo cliente esteja em uma única linha, acrescentando as informações de outras linhas em novas colunas.

Exemplifico. O cliente códio 1234 realizou uma compra no dia 10/06 no valor de R$100,00 e uma compra no dia 22/06 no valor de R$80,00. Ao invés de todas estas informações estarem na mesma linha, estão em linhas diferentes, repetindo o código do cliente. Em anexo incluo uma planilha de exemplo, com o resultado esperado em vermelho.

Pelo volume dos dados acredito que uma macro seja a melhor alternativa. Poderiam me ajudar ao menos com um ponta-pé inicial?

Desde já obrigado! :D

F.

 
Postado : 10/05/2016 9:42 pm
(@osvaldomp)
Posts: 857
Prominent Member
 

Olá.

Veja se entendi corretamente o que você precisa.

Sub CadaClienteEmUmaLinha()
 Dim rg As Range, k As Long, v() As Variant, LR As Long
 Dim i As Long, j As Long, x As Long, m As Long, cc As Long
  LR = Cells(1, 1).End(4).Row
   For cc = 2 To LR
    x = Application.CountIf(Range("A2:A" & LR), Cells(cc, 1))
    Set rg = Range(Cells(cc, 1), Cells(cc + x - 1, 1)).Resize(, 7)
    v = rg.Value
     For i = LBound(v) To UBound(v)
      For j = LBound(v, 2) To UBound(v, 2)
       Cells(m + 21, k + 1) = v(i, j)
        k = k + 1
      Next j
     Next i
     cc = cc + x - 1
     m = m + 1: k = 0
   Next cc
End Sub
 
Postado : 12/05/2016 1:43 pm
(@flprm)
Posts: 0
New Member
Topic starter
 

Olá Oslvado! NO arquivo que enviei como exemplo funcionou perfeitamente. VOu testar no meu arquivo de trabalho (17mil linhas) e ver como se comporta. De antemão deixo meu muito obrigado! Qualquer coisa eu retorno.

Valeu!

F.

 
Postado : 12/05/2016 8:51 pm
(@flprm)
Posts: 0
New Member
Topic starter
 

Olá novamente!

Apliquei as linhas em VBA em um dos bancos e funcionou perfeitamente. Fui realizar a mesma operação em um outro banco e me deparei apenas com uma dificuldade para a qual solicito novamente ajuda. Neste segundo banco (exemplo em anexo) a única diferença para o anterior é que ao transferir o conteúdo de múltiplas linhas com um mesmo identificador não há a necessidade de copiar todas as colunas, simplificando o resultado.

No arquivo, em verde ou azul estão as informações que precisam aparecer uma única vez. Em vermelho os campos que precisam ser transferidos para a mesma linha a qual o código de identificação se refere (co_usuario_farmacia). Ao final, cada linha deve referir-se apenas a um usuário identificado por seu código (co_usuario_farmacia).

Neste arquivo estão apenas dois usuários (11 e 20), mas o banco completo totaliza 17mil usuários, devendo a "linearização" ser realizada em todos eles.

Mais uma vez agradeço o conhecimento e ajuda de vocês! ;)

F.

 
Postado : 28/05/2016 9:00 pm
(@osvaldomp)
Posts: 857
Prominent Member
 

Experimente o código abaixo no seu segundo arquivo.

O resultado será colocado a partir da quinta linha vazia abaixo da tabela existente.

Sub CadaUsuárioEmUmaLinha()
Dim rg As Range, k As Long, v() As Variant, LR As Long
Dim i As Long, j As Long, x As Long, m As Long, cc As Long
  LR = Cells(1, 1).End(4).Row
   For cc = 2 To LR
    Set rg = Cells(cc, 1).Resize(, 17)
    Cells(m + LR + 5, k + 1).Resize(, 17).Value = rg.Value
    x = Application.CountIf(Range("A2:A" & LR), Cells(cc, 1))
    Set rg = Cells(cc, 18).Resize(x, 5)
     v = rg.Value
     For i = LBound(v) To UBound(v)
      For j = LBound(v, 2) To UBound(v, 2)
       Cells(m + LR + 5, k + 18) = v(i, j)
        k = k + 1
      Next j
     Next i
     cc = cc + x - 1
     m = m + 1: k = 0
    Next cc
End Sub

 
Postado : 29/05/2016 5:08 pm