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

Name      Email       Likes   Dislikes
herpina   something   Cake    Excel
derpina   something   Cake    Excel

GroupID
5

Name      Email       Likes   Dislikes
roflmao   something   Cake    Hmm
roflomg   something   Baking  test
testtttt  something   Sleep   22

GroupID
1

Name      Email       Likes   Dislikes
OAG       something   OAB     N/A
OAB       something   N/A     N/A

desejado:

Name      Email       Likes   Dislikes  GroupID
herpina   something   Cake    Excel     4
derpina   something   Cake    Excel     4
roflmao   something   Cake    Hmm       5
roflomg   something   Baking  test      5
testtttt  something   Sleep   22        5
OAG       something   OAB     N/A       1
OAB       something   N/A     N/A       1

Esta entrada de amostra também está localizada no link

    
por Christian Neverdal 06.01.2013 / 00:59

1 resposta

2

Aqui está a macro o mais curta possível

  • abra o Excel e pressione ALT + F11
  • insira o código abaixo em sheet1 ou onde quer que seus dados estejam
  • Feche o editor do VBA e pressione ALT + F8 e execute 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).Row determina 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: veja 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 o nosso contador howmanydeletedlines
  • Linha 10-12: Se a condição for falsa, essa deve ser uma boa linha de dados que queremos preservar
  • Linha 13: faz um loop para o próximo i , que representa nossa linha atual
por 06.01.2013 / 01:32