如果我对以下数据使用“文本到列”功能,则使用“;”作为分隔符:
foo;酒吧;qux;baz;吐司;
quux;果酱;豆子;
我最终会在单元格网格中得到“左对齐”的结果:
|foo |bar |qux |baz |toast |
|quux |jam |beans | | |
但是,我希望它们“右对齐”:
|foo |bar |qux |baz |toast |
| | |quux |jam |beans |
我怎样才能做到这一点?
笔记:我知道“右对齐”可能不是正确的术语,而是意味着
| foo| bar| qux| baz| toast|
| quux| jam| beans| | |
但这不是我想要的。所以,如果有人能为我所描述的内容提出一个更好的术语,请这样做。
附录:作为替代方法,如果有人知道如何使用 Excel 重新排列单元格,
|a |b |c |d | | | | | |
|n |m |o |p |q | | | | |
|e |f |g |h |i |j |k |l | |
|n |m |o |p |q | | | | |
|x | | | | | | | | |
变成
| | | | | |a |b |c |d |
| | | | |n |m |o |p |q |
| |e |f |g |h |i |j |k |l |
| | | | |n |m |o |p |q |
| | | | | | | | |x |
那么这也行得通。
答案1
以下公式将允许您将数据快速转换为文本到列可以轻松解析右对齐的形式,如您所述:
D5
公式(若不存在则添加分号):
=IF(RIGHT(B5,1)<>";",B5&";",B5)
G5
公式(在前面添加必要数量的分号):
=REPT(";",5-(LEN(D5)-LEN(SUBSTITUTE(D5,";",""))))&D5
复制结果然后将其作为值选择性粘贴,应该可以提供适合文本到列转换的原始材料。
解决方案取决于是否有固定的最大列数;这里是五列。G5
可以通过在工作表的其他位置添加“要生成的列数”单元格并引用这个新单元格而不是硬编码5
值来推广公式。
此外,如果您保证数据始终带有尾随分号,则中间步骤D5:D7
是多余的。
编辑:根据 Some_Guy 在评论中的观察,如果所有行都构造为缺少尾随分号。
答案2
如上所述,这不是文本到列的标准功能,或者在 excel 中是否存在固有方法可以做到这一点,据我所知。但是,这个 VBA 可以为您完成 (假设填充的单元格之间没有空格)-
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
答案3
这是另一个 VBA 例程。执行“文本到列”操作,然后选择要放入数据的矩形范围(即,列A
-(最大字段数)× 行)并运行此宏。请参阅如何在 MS Office 中添加 VBA?
作为教学材料。
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
这将要正确处理嵌入的空白单元格(例如the;quick;;fox;
)。否则,这个答案和另一个答案之间的差异只是任意的个人偏好,而另一个答案可能在某些我无法理解的方面更胜一筹。