Combinar linhas no Excel

0

Eu tenho dados na coluna 1 e dados na coluna 2 da seguinte forma:

1234      eggs
1234      bacon
1234      toast
4321      Orange Juice

Eu quero que ele apareça da seguinte forma:

1234      eggs-bacon-toast
4321      orange juice

Também gostaria de excluir automaticamente as linhas duplicadas para que eu tenha números exclusivos na coluna 1 com apenas os dados combinados.

    
por Laua 12.01.2014 / 01:41

3 respostas

0

Você precisará escrever um programa ou script para unir as linhas com a chave comum (coluna 1).

Se você não conhece o VBA, pode usar um script Ruby simples para fazer a junção nos dados de uma exportação de CSV da planilha.

Siga estas etapas:

  1. Exporte sua planilha no formato CSV.
  2. Em seguida, execute o script abaixo nos dados, produzindo um novo Arquivo de saída formatado em CSV.
  3. Importe o arquivo de saída CSV para o Excel.

Os dados devem ser parecidos com isto:

$ cat joiner-data.csv
Key,Data
"1234",eggs
"1234",bacon
"1234",toast
"4321","Orange Juice"

Abaixo está o script ruby para unir os dados pela chave da coluna 1.

By the way, este código não se importa se os dados-chave é numérico ou não - ele irá juntar dados com base em qualquer valor-chave.

#!/usr/bin/env ruby
# joiner.rb input >output
# read CSV data, with key in column one
# output each key once, with all associated data joined by '-'

require 'csv'

records = {}

input = ARGV.shift

CSV.foreach(input, :headers => true, :return_headers => false) do |row|
  data = row.fields
  key = data.shift
  records[key] ||= []       # ensure new keys start with an empty array
  records[key] += [data]    # append the record data
end

# output the record keys in ascending order, with the data associated with each key
CSV { |csv| records.keys.sort.each{|k| csv << [k,records[k].join('-')]}}

exit

Veja a amostra, usando os dados formatados em CSV acima:

$ ./joiner.rb joiner-data.csv
1234,eggs-bacon-toast
4321,Orange Juice

Esta saída deve ser colocada em um arquivo que pode ser importado de volta para o Excel. Assim:

$ ./joiner.rb joiner-data.csv >joined-data.csv

Agora importe o arquivo joined-data.csv .

Espero que isso ajude.

    
por 12.01.2014 / 05:37
0

O uso de vba é provavelmente a solução mais apropriada para esse problema, mas se você não usou uma linguagem de programação antes, poderá ter alguns erros e não saber o que fazer. O mesmo vale para a solução aks, e essa solução também requer a saída do excel. Dito isto, é bom saber como manipular arquivos csv fora do Excel, e você deve ser capaz de obter o que deseja, se seguir os passos indicados no aks.

Se você quiser apenas uma solução plug-in-play, criei uma planilha com todas as fórmulas para você aqui . Para usá-lo, cole seus dados na coluna A e B sob os rótulos, baixe as fórmulas em C2-F2 e, em seguida, filtre a coluna F por não-espaços em branco. Os resultados serão em "FINAL A" e "FINAL B".

    
por 12.01.2014 / 06:49
0

Ok, isso não é muito difícil. Primeiras coisas primeiro, mostre a guia do desenvolvedor clicando no botão office, indo para Opções do Excel e selecionando show developer tab . Isso permite que você edite e execute macros.

Na faixa de opções, você tem uma guia de desenvolvedor agora. Clique e vá para o "visual basic". Agora, no topo do editor do VBA, clique em insert - module . No módulo, cole o código abaixo:

Sub Macro1()
Application.ScreenUpdating = False
'sort columns
    Columns("A:B").Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:B150440")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Dim c As Range
Dim strValue As String

'only non-blank cells
For Each c In Range("A:A")
    If c <> "" Then
Again:
        'check for matches and combine
        If c.Value = c.Offset(1).Value Then
           strValue = c.Offset(, 1).Value & "-" & c.Offset(1, 1).Value
           c.Offset(, 1) = strValue
           c.Offset(1).EntireRow.Delete
           GoTo Again
        End If
    End If
Next c


Application.ScreenUpdating = True
End Sub

Corra e você estará pronto para ir.

Eu recomendaria fazer uma cópia dos seus dados antes de executar a macro e executar a macro na cópia, caso ela não faça o que você quer

    
por 12.01.2014 / 14:22