Como divido uma linha em várias linhas com o Excel?

9

Eu tenho um banco de dados de produtos no Excel com várias centenas de entradas, cada uma com 1 a 3 "camadas" de preço: Standard, Deluxe e Premium. Cada camada tem seu próprio SKU (A, B ou C adicionado ao final do SKU base) e preço. Meus dados são assim:

Name, Description, Price A, Price B, Price C, SKU A, SKU B, SKU C
name1,      desc1,   14.95,   19.95,        , sku1A, sku1B, 
name2,      desc2,    4.95,    9.95,   12.95, sku2A, sku2B, sku2C
name3,      desc3,   49.95,        ,        , sku3A,      ,

Como eu faria para que os dados ficassem assim:

Name, Description,   SKU, Price
name1,      desc1, sku1A, 14.95
name1,      desc1, sku1B, 19.95
name2,      desc2, sku2A,  4.95
name2,      desc2, sku2B,  9.95
name2,      desc2, sku2C, 12.95
name3,      desc3, sku3A, 49.95

Se ajudar, vou importar esses produtos para uma instalação do Magento.

Agradeço antecipadamente.

GreysonD
fonte
Existe a possibilidade de existirem vários nomes e descrições semelhantes? Por exemplo, duas linhas têm name1e desc1com preços diferentes para o preço A, preço B, preço C, etc.
Jerry
Nos dados originais? Não, tenho certeza que eles são únicos. Mas, nos novos dados, definitivamente haverá repetições.
GreysonD
Ok, eu tinha algo em mente, mas acabou que não funcionará, a menos que haja mais manipulação para corrigir alguns resultados. Se você estiver curioso, eu estava tentando uma Tabela Dinâmica Consolidada, mas o campo Descrição e os campos SKU teriam que ser extraídos separadamente usando index / match / vlookup, o que o torna bastante longo no final.
21413 Jerry

Respostas:

8

Essas tarefas geralmente são mais rápidas com o VBA. De fato, levei cerca de 10 minutos para configurá-lo.
Presumo que seus dados estejam na coluna A à coluna H.

Vá para Excel » Developer » Visual Basic»No painel esquerdo, abra sheet1(ou) a planilha em que seus dados residem» Insira o código na janela direita »Execute o código

Código VBA

1 |Sub NewLayout()
2 |    For i = 2 To Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
3 |        For j = 0 To 2
4 |        If Cells(i, 3 + j) <> vbNullString Then
5 |            intCount = intCount + 1
6 |            Cells(i, 1).Copy Destination:=Cells(intCount, 10)
7 |            Cells(i, 2).Copy Destination:=Cells(intCount, 11)
8 |            Cells(i, 3 + j).Copy Destination:=Cells(intCount, 12)
9 |            Cells(i, 6 + j).Copy Destination:=Cells(intCount, 13)
10|        End If
11|        Next j
12|    Next i
13|End Sub

Explicação

Minha intenção era manter o código o mais curto possível para explicá-lo melhor. Basicamente, usamos dois loops. O loop externo ( i) é para as linhas e o loop interno ( j) para as colunas de preço.

Nós usamos muito cells(rowNumber,columnNumber)para ler / gravar células.

  • Linha 2 | Inicie um loop da linha 2 para sua última linha. Repetimos todas as linhas usadas

  • Linha 3 | Inicie um segundo loop de 0 a 2 (na verdade, são 3 loops, um para cada coluna Preço)

  • Linha 4 | Usamos esse loop interno para verificar os valores em nossa linha e coluna atuais Preço A, depois Preço B e no último loop Preço C. Se encontrarmos um valor na coluna Preço, continuaremos copiando as células. Se nenhum preço for inserido, nada faremos e passaremos para a próxima coluna Preço

  • Linha 5 | Contar um contador para saber quantas linhas já copiamos,
    para sabermos depois de qual linha podemos copiar nossa linha atual

  • Linha 6 | Copie a coluna de nome

  • Linha 7 | Copie a coluna de descrição

  • Linha 8 | Copie a coluna Preço A ou B ou C, dependendo do loop interno que estamos atualmente

  • Linha 9 | Copie a coluna SKU A ou B ou C, dependendo do loop interno que atualmente somos

Captura de tela do resultado

insira a descrição da imagem aqui

nixda
fonte
1
Isto é fantástico! Exatamente o que eu preciso. Meus dados são realmente um pouco mais complexos que o meu exemplo, e eu sou novo no VBA, então sua explicação ajuda tremendamente. Obrigado!
GreysonD
2

Aqui está uma solução de função de planilha. As fórmulas são um pouco densas, portanto, esteja avisado, mas isso dará o que você deseja.

Passos:

  1. Na primeira linha da sua nova tabela, em Name, insira uma referência direta à primeira Nameem seus dados. No seu exemplo, você digitaria =A2onde A2 é o primeiro nome listado em seus dados. Na captura de tela de exemplo que forneci abaixo, esta fórmula entra A8. Todas as fórmulas a seguir seguirão o layout usado na captura de tela. Obviamente, você precisará atualizar todas as referências de intervalo para corresponder às suas folhas.
  2. Na célula abaixo disso, insira a seguinte fórmula:
    = SE (COUNTIF ($ A $ 9: A9, A9) = COUNTA (OFFSET ($ C $ 1: $ E $ 1, CORRESPONDÊNCIA (A9, $ A $ 2: $ A $ 5,0), 0)), ÍNDICE ($ A $ 2 : $ A $ 5, JOGO (A9, $ A $ 2: $ A $ 5,0) +1), A9)
    
    Isso basicamente verifica quantas linhas devem existir para o nome listado acima (em A9) e, se o número de linhas já existentes na sua nova tabela corresponder a isso, ele passará para o próximo nome. Caso contrário, outra linha para o nome acima será adicionada.
    Preencha esta fórmula o quanto for necessário (até retornar um 0 em vez de um nome).
  3. Na primeira linha abaixo, Descriptiondigite a seguinte fórmula e preencha.
    = ÍNDICE ($ B $ 2: $ B $ 5, CORRESPONDÊNCIA (A9, $ A $ 2: $ A $ 5,0))
  4. Na primeira linha abaixo SKU, cole a fórmula a seguir na barra de fórmulas e pressione Ctrl+ Shift+ Enter.
    = ÍNDICE (OFFSET ($ A $ 1: $ H $ 1, CORRESPONDÊNCIA (A9, $ A $ 2: $ A $ 5,0)), 0), PEQUENO (SE (OFFSET ($ F $ 1: $ H $ 1, CORRESPONDÊNCIA (A9, $ A $ 2: $ A $ 5,0), 0) <> "", COLUNA ($ F $ 1: $ H $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Esta é uma fórmula de matriz; se inserida corretamente, a fórmula aparecerá na barra de fórmulas entre colchetes. Preencha esta fórmula na sua tabela (cada instância também deve aparecer entre colchetes).
  5. Da mesma forma, na primeira linha abaixo Price, cole a fórmula a seguir na barra de fórmulas e insira-a como uma fórmula de matriz (pressionando Ctrl+ Shift+ Enter).
    = ÍNDICE (OFFSET ($ A $ 1: $ H $ 1, CORRESPONDÊNCIA ($ A9, $ A $ 2: $ A $ 5,0)), 0), PEQUENO (SE (OFFSET ($ C $ 1: $ E $ 1, CORRESPONDÊNCIA ($ A9 , $ A $ 2: $ A $ 5,0), 0) <> "", COLUNA ($ C $ 1: $ E $ 1)), COUNTIF ($ A $ 9: $ A9, $ A9)))
    Preencha e isso deve completar sua tabela.

Captura de tela da tabela

Excellll
fonte
Fórmulas impressionantes! Entre isso e a resposta do VBA, estou pronto para praticamente tudo. Obrigado!
GreysonD