Excel - Dividir coluna longa em várias colunas por célula vazia

2

Então, eu tenho dados que, uma vez importados para o Excel, se parecem com isso:

1
2
3
4

A
B
C
D

!
@
#
$

Eu quero que os dados tenham esta aparência:

1 A !
2 B @
3 C #
4 D $

Todos os dados estão em uma coluna e cada novo conjunto de dados é compensado por uma célula vazia. Tudo o que quero fazer é dividir essa coluna em várias colunas, criando uma nova coluna em cada célula vazia. Cada vez que gravar dados, haverá um número igual de entradas de dados em cada conjunto, mas eles não são do mesmo tipo e, entre gravações, pode haver diferentes números de entradas em cada conjunto. Basicamente, tudo o que quero que aconteça é que o excel desce pela coluna e, quando encontra uma célula vazia, copia todos os dados restantes para a próxima coluna e depois procura a próxima célula vazia, altura em que fará o mesmo. coisa até que haja 2 células vazias em uma linha.

A pesquisa de como fazer isso é extremamente irritante porque eu continuo recebendo texto nos resultados da coluna, o que não é o que eu quero.

Obrigado antecipadamente.

    
por anonymous 18.01.2015 / 01:03

2 respostas

0

Eu recomendaria o pré-processamento dos dados antes de importá-los para o Excel.

No entanto, criei um procedimento no VBA que faz o que você quer:

Para instalar a macro

Abra o Excel - > Alt + F11 - > Inserir - > Módulo - > cole o seguinte código - > Ctrl + S - > e selecione 'Pasta de trabalho habilitada para macro do Excel (* .xlsm)' na lista suspensa

Sub ToManyColumns()
    Dim firstCellRow As Long
    firstCellRow = 1              'change this if you don't want to start at A1
    Dim firstCellColumn As Long
    firstCellColumn = 1           'change this if you don't want to start at A1

    Application.ScreenUpdating = False
    ActiveSheet.Cells(firstCellRow, firstCellColumn).Activate
    Dim column As Long
    column = firstCellColumn
    Dim startIndex As Long
    Dim endIndex As Long
    Dim lastRow As Long
    lastRow = firstCellRow

    Do While True
        'find the range to copy
        startIndex = ActiveCell.row
        Do While ActiveCell.Value <> ""
            endIndex = ActiveCell.row
            ActiveCell.Offset(1).Activate
        Loop

        lastRow = ActiveCell.row

        Range(Cells(startIndex, firstCellColumn), Cells(endIndex, firstCellColumn)).Select
        Selection.Copy
        Cells(firstCellRow, column).Select
        Selection.PasteSpecial Paste:=xlPasteValues

        'get back to last rowIndex
        Cells(lastRow, firstCellColumn).Activate
        ActiveCell.Offset(1).Activate

        If ActiveCell.Value = "" Then Exit Do

        column = column + 1
    Loop

    'cleanUp -------------------------------------------
    Dim deleteFrom As Long
    Dim deleteTo As Long
    deleteTo = ActiveCell.row

    ActiveSheet.Cells(firstCellRow, firstCellColumn).Activate
    Do While ActiveCell.Value <> ""
        ActiveCell.Offset(1).Activate
    Loop
    deleteFrom = ActiveCell.row

    Range(Cells(deleteFrom, firstCellColumn), Cells(deleteTo, firstCellColumn)).Select
    Selection.ClearContents

    ActiveSheet.Cells(firstCellRow, firstCellColumn).Activate
    'cleanUp -------------------------------------------

    Application.ScreenUpdating = True
End Sub

Para executar a macro:

  1. Verifique se você está na planilha que deseja ser! E clique em qualquer lugar na planilha! (Porque esta macro é executada na Planilha Ativada)
  2. Alt + F11 - > Clique em qualquer lugar no código - > pressione F5

Você também pode criar um botão na planilha e atribuir a macro a ele - é mais fácil de usar e você não precisa verificar se está na planilha certa.

Notas

Se você não quiser que a macro inicie na célula A1 (por exemplo: iniciar na coluna diferente), altere os números na terceira e na quinta linha.

Para este propósito, é melhor pré-processar os dados do que usar macros ...

    
por 18.01.2015 / 14:38
0

Supondo que o primeiro dado está em A1 de Sheet1. digite:

B1 ---> 1
C1 ---> 1

então

B2 ---> =IF(A2="",0,B1+1)
C2 ---> =IF(B2=0,C1+1,C1)

e arraste até o final dos dados. Na Folha2, célula A1, digite:

=IFERROR(INDEX(Sheet1!$A:$A,MATCH(1,INDEX((CELL("row",Sheet2!A1)=Sheet1!$B:$B)*(CELL("col",Sheet2!A1)=Sheet1!$C:$C),0,1),0)),"")

arraste até C6. Resolvido.

Espero que ajude. (:

p / s: minha referência é aqui .

    
por 06.08.2018 / 12:10