¿Cómo puedo 'alinear correctamente' los resultados de la función "Texto a columnas" de Excel?

¿Cómo puedo 'alinear correctamente' los resultados de la función "Texto a columnas" de Excel?

Si estoy usando la función Texto a columnas en los siguientes datos, uso ";" como delimitador:

foo;bar;qux;baz;tostada;
quux;mermelada;frijoles;

Terminaré con los resultados "alineados a la izquierda" en la cuadrícula de celdas resultante:

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

Sin embargo, quiero que estén "alineados a la derecha":

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

¿Cómo puedo hacer esto?

NOTA:Sé que "alineado a la derecha" podría no ser el término correcto, sino que implica

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

pero esto no es lo que estoy buscando. Entonces, si alguien puede sugerir un término mejor para lo que estoy describiendo, que lo haga.

Apéndice:Como enfoque alternativo, si alguien conoce una manera de usar Excel para reorganizar celdas de manera que

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

se convierte

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

entonces eso también funcionaría.

Respuesta1

Las siguientes fórmulas permitirán una conversión rápida de sus datos a un formulario que Text-to-Columns analizará fácilmente justificado a la derecha como lo describe:

recorte de excel

D5fórmula (agrega un punto y coma si no está):

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

G5fórmula (antepone el número necesario de punto y coma):

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

Copiar los resultados seguido de un Pegado especial como valores debería proporcionar materia prima adecuada para una conversión de texto a columnas.

La solución depende de que haya un número máximo fijo de columnas; aquí, cinco. La fórmula de G5podría generalizarse agregando una celda de 'número de columnas para generar' en otra parte de la hoja y haciendo referencia a esta nueva celda en lugar del valor codificado 5.

Además, si tiene la garantía de que los datos siempre tendrán el punto y coma al final, el paso intermedio D5:D7es superfluo.

EDITAR:Según la observación de Some_Guy en los comentarios, el método también funcionará si todas las filas se construyen parafaltaun punto y coma al final.

Respuesta2

Como se indicó, no, esta no es una función estándar de texto en columnas o, que yo sepa, existe una forma inherente de hacerlo en Excel. Sin embargo, este VBA lo hará por usted (asumiendo que no tienes espacios en blanco entre las celdas pobladas)-

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

Respuesta3

Aquí hay otra rutina de VBA para hacerlo. Haga su texto en columnas, luego seleccione el rango rectangular en el que coloca los datos (es decir, columnas A- (campos máximos) × filas) y ejecute esta macro. Ver¿Cómo agrego VBA en MS Office? para material didáctico.

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

Estevoluntadthe;quick;;fox;manejar correctamente las celdas en blanco incrustadas (p. ej., ). De lo contrario, las diferencias entre esta respuesta y la otra son simplemente preferencias personales arbitrarias, y la otra puede ser superior en formas que no entiendo.

información relacionada