
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:
D5
fórmula (agrega un punto y coma si no está):
=IF(RIGHT(B5,1)<>";",B5&";",B5)
G5
fó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 G5
podrí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:D7
es 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.