Excel: convertendo entre layouts de dados

1

Eu tenho a situação como mostrado abaixo. Existem grupos de linhas. Acima de cada grupo há um pequeno "cabeçalho" descrevendo um campo de dados que todas as linhas do grupo têm em comum. Eu quero criar uma tabela dinâmica de tudo e incluir esse campo (GroupID), portanto, eu quero a segunda versão da tabela. Existe uma maneira de fazer isso aquém de gravar uma macro? Ou talvez haja uma maneira de criar a tabela dinâmica diretamente?

Eu tenho:

GroupID
4

Nome Email Likes Não gosta
herpina algo bolo Excel
derpina algo Cake Excel

GroupID
5

Nome Email Likes Não gosta
roflmao algo bolo Hmm
roflomg algo Teste de cozimento
testtttt algo dormir 22

GroupID
1

Nome Email Likes Não gosta
OAG algo OAB N / A
OAB alguma coisa N / AN / A

Desejado:

Nome Email Likes Não gosta de GroupID
herpina algo Cake Excel 4
derpina algo Cake Excel 4
roflmao algo bolo Hmm 5
roflomg algo Baking test 5
testtttt algo dormir 22 5
OAG algo OAB N / A 1
OAB alguma coisa N / AN / A 1

Esta entrada de amostra também está localizada em https://dl.dropbox.com/u/736090/Book1.xlsx

Christian Neverdal
fonte

Respostas:

2

Aqui está a macro o mais curta possível

  • abra o Excel e pressione ALT+F11
  • insira o código abaixo na planilha1 ou onde seus dados estiverem
  • Feche o editor VBA e pressione ALT+ F8e ececute a macro

    Sub deletelines()    
      Range("A4:D4").Copy
      Range("A1").Insert Shift:=xlToRight
      For i = 2 To Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        c = Cells(i - counter, 1)
        if IsNumeric(c) And c <> "" Then groupID = c
        If c = "" Or c = "Name" Or c = "GroupID" Or IsNumeric(c) Then
          Rows(i - counter).Delete
          counter = counter + 1
        Else
          Cells(i - counter, 5) = groupID
        End If
      Next i   
    End Sub
    

Como este é um site de perguntas e respostas, eu descrevo o código. Dessa forma, pode ser útil para outras pessoas que podem adaptar e personalizar facilmente o código.

  • Linha 1 + 14: inicia e termina uma macro (sub-rotina)
  • Linha 2 + 3: copie o intervalo [A4: D4] e insira-o antes de [A1]. Isso forma sua linha de cabeçalho
  • Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Rowdetermina a última célula usada. Em seu eample seus 22
  • Linha 4: é um loop que começa em 2 e termina em 22. O ié usado como índice de linha
  • Linha 5: salva a primeira célula da linha atual. A sintaxe geral é cells(rownumber,columnnumber)
    Atenção: Como excluímos linhas, temos que subtrair quantas linhas já deletamos.
  • Linha 6: Olhe se cé um número e salve-o como nosso groupID de curreto até encontrarmos outro número
  • Linha 7: É uma condição que verifica se o valor da célula atual é "Nome", "GroupID", em branco ou um número.
  • Linha 8: Se a condição for verdadeira, isso exclui toda a linha
  • Linha 9: Se a condição for verdadeira, isso conta nosso contador howlines
  • Linha 10-12: Se a condição for falsa, isso deve ser uma boa linha de dados que queremos preservar
  • Linha 13: volta para a próxima ique representa nossa linha atual
nixda
fonte
É um começo, mas não exatamente aí. Por favor, dê uma olhada na entrada de amostra em dl.dropbox.com/u/736090/Book1.xlsx - e deixe-me saber se você precisar em outro formato.
Christian Neverdal
Eu editei minha resposta. Eu testei com o seu book1.xlsx e funcionou para mim.
nixda