Como posso 'alinhar corretamente' os resultados do recurso "Texto para Colunas" do Excel?

Como posso 'alinhar corretamente' os resultados do recurso "Texto para Colunas" do Excel?

Se eu estiver usando o recurso Texto para Colunas nos dados a seguir, usando ";" como delimitador:

foo;bar;qux;baz;torrada;
quux;geléia;feijão;

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

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

No entanto, quero que eles estejam "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, implicando em vez disso

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

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

Termo aditivo:Como abordagem alternativa, se alguém souber uma maneira de usar o Excel para reorganizar células de forma 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.

Responder1

As fórmulas a seguir permitirão a conversão rápida de seus dados em um formato que o Text-to-Columns analisará prontamente justificado à direita conforme você descreve:

Recorte do Excel

D5fórmula (anexa um ponto e vírgula se estiver ausente):

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

G5fórmula (anexa o número necessário de ponto e vírgula):

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

Copiar os resultados seguido por Colar Especial como Valores deve fornecer matéria-prima adequada para uma conversão de Texto em Colunas.

A solução depende da existência de um número máximo fixo de colunas; aqui, cinco. A fórmula de G5poderia ser generalizada adicionando uma célula 'número de colunas a serem geradas' em outro lugar da planilha e referenciando essa nova célula em vez do valor codificado 5.

Além disso, se você tiver certeza de que os dados sempre terão ponto e vírgula à direita, a etapa intermediária D5:D7será supérflua.

EDITAR:Pela observação de Some_Guy nos comentários, o método também funcionará se todas as linhas forem construídas parafaltaum ponto e vírgula final.

Responder2

Conforme declarado, não, esta não é uma função padrão de texto para colunas ou existe uma maneira inerente de fazer isso no Excel, que eu saiba. 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

Responder3

Aqui está outra rotina VBA para fazer isso. Faça seu Texto para Colunas, selecione o intervalo retangular em que você coloca os dados (ou seja, colunas A- (máximo de campos) × linhas) e execute esta macro. VerComo adiciono VBA no MS Office? para material instrucional.

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

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

informação relacionada