Como posso 'alinhar corretamente' os resultados do recurso “Text to Columns” do Excel?

4

Se eu estiver usando o recurso "Texto para colunas" nos seguintes dados, usando ";" como um delimitador:

foo;bar;qux;baz;toast;
quux;jam;beans;

Acabarei com os resultados "alinhados à esquerda" na grade resultante de células:

 |foo   |bar   |qux   |baz   |toast |
 |quux  |jam   |beans |      |      |

No entanto, quero que eles fiquem "alinhados à direita":

 |foo   |bar   |qux   |baz   |toast |
 |      |      |quux  |jam   |beans |

Como posso fazer isso?

OBSERVAÇÃO: Eu sei que "alinhado à direita" pode não ser o termo correto, em vez disso, implicando

|   foo|   bar|   qux|   baz| toast| 
|  quux|   jam| beans|      |      |

mas isso não é o que estou procurando. Então, se alguém puder sugerir um termo melhor para o que estou descrevendo, faça isso.

Adendo: Como uma abordagem alternativa, se alguém souber uma maneira de usar o Excel para reorganizar as células de modo que

 |a   |b   |c   |d   |    |    |    |    |    |
 |n   |m   |o   |p   |q   |    |    |    |    |
 |e   |f   |g   |h   |i   |j   |k   |l   |    |
 |n   |m   |o   |p   |q   |    |    |    |    |
 |x   |    |    |    |    |    |    |    |    |

torna-se

 |    |    |    |    |    |a   |b   |c   |d   |
 |    |    |    |    |n   |m   |o   |p   |q   |
 |    |e   |f   |g   |h   |i   |j   |k   |l   |
 |    |    |    |    |n   |m   |o   |p   |q   |
 |    |    |    |    |    |    |    |    |x   |

então isso também funcionaria.

    
por Some_Guy 10.06.2015 / 12:07

3 respostas

4

As fórmulas a seguir permitem a conversão rápida de seus dados em um formulário que Text-to-Columns prontamente analisa justificado à medida que você descreve:

D5formula(acrescentaumpontoevírgula,seausente):

=IF(RIGHT(B5,1)<>";",B5&";",B5)

G5 formula (preende o número necessário de ponto e vírgula):

=REPT(";",5-(LEN(D5)-LEN(SUBSTITUTE(D5,";",""))))&D5

Copiar os resultados seguidos por um Paste-Special-as-Values deve fornecer a matéria-prima adequada para uma conversão de texto em colunas.

A solução depende de haver um número máximo fixo de colunas; aqui cinco. A fórmula de G5 poderia ser generalizada adicionando um "número de colunas para gerar" a célula em outro lugar da planilha e fazendo referência a essa nova célula em vez do valor 5 codificado.

Além disso, se você tiver a garantia de que os dados sempre terão o ponto-e-vírgula final, a etapa intermediária de D5:D7 será supérflua.

EDIT: Pela observação de Some_Guy nos comentários, o método também funcionará se todas as linhas forem construídas para falta um ponto e vírgula à direita

    
por 10.06.2015 / 19:52
2

Como dito, não, isso não é uma função padrão de texto para colunas ou existe uma maneira inerente de fazer isso no Excel, que eu conheço. No entanto, este VBA fará isso por você ( supondo que você não tenha espaços em branco entre as células preenchidas ) -

Sub test()
Dim lrow As Integer
lrow = Cells(Rows.Count, "A").End(xlUp).Row

Dim lcol As Integer
lcol = Cells("1", Columns.Count).End(xlToLeft).Column

Dim lfcol As Integer
Dim dif As Integer
For i = 1 To lrow
    lfcol = Cells(i, Columns.Count).End(xlToLeft).Column
    dif = lcol - lfcol
    For j = lfcol To 1 Step -1
        If dif = 0 Then Exit For
        If Not Cells(i, j) Is Nothing Then
            Cells(i, j + dif) = Cells(i, j)
            Cells(i, j) = vbNullString
        End If
    Next
Next
End Sub
    
por 10.06.2015 / 14:00
2

Veja outra rotina do VBA para fazer isso. Faça o seu texto para colunas, em seguida, selecione o intervalo retangular em que você coloca os dados (ou seja, colunas A - (campos máximos) × linhas) e execute essa macro. Consulte Como adiciono o VBA no MS Office? para material didático.

Sub Copy_Right()
    For Each rr In Selection.Rows
        For cn = Selection.Columns.Count To 1 Step -1
            If Len(rr.Cells(1, cn)) > 0 Then Exit For
        Next cn
        ' cn is now the (relative) column number of the last cell in this row
        ' that contains (non-blank) data.
        my_offset = Selection.Columns.Count - cn
        ' my_offset is how many columns to the right we need to move.
        ' If my_offset = 0, the row is full of data (or, at least,
        ' the last column contains data; there may be blank cells
        ' to its left), so there’s nowhere to move it.
        ' If cn = 0, the row is empty, so there’s nothing to move.
        If cn = 0 Or my_offset = 0 Then
            ' Nothing to do.
        Else
            For cn = Selection.Columns.Count To 1 Step -1
                If cn > my_offset Then
                    ' Copy data to the right.
                    rr.Cells(1, cn) = rr.Cells(1, cn - my_offset)
                Else
                    ' Set the cells on the left to blank.
                    rr.Cells(1, cn) = ""
                End If
            Next cn
        End If
    Next rr
End Sub

Este irá processar as células em branco incorporadas (por exemplo, the;quick;;fox; ) corretamente. Caso contrário, diferenças entre esta resposta e a outra são apenas preferências pessoais arbitrárias, e o outro pode ser superior de maneiras que eu não entendo.

    
por 10.06.2015 / 14:54