我在Excel文件中有一个带有名称和地址的数据集,格式如下。
Name1
134/47/1,
adrs1, adr2, country
Name2
adrs1, adrs2, country
Name3
107/c,
adrs3, adrs3, country
etc…
我想以下列格式将这些数据拆分成多行
Name1
134/47/1,
adrs1,
adrs2,
country
Name2
No 134/63,
adrs1,
adrs2,
country
etc…
我试过了,但它仅适用于一行电池。
Sub tst()
Dim X As Variant
X = Split(Range("A1").Value, ",")
Range("A1").Resize(UBound(X) - LBound(X) + 1).Value = Application.Transpose(X)
End Sub
答案 0 :(得分:1)
我不确定您的样本数据是否将单个值上的逗号逗号作为拼写错误,或者是否恰好代表您的数据,但应该考虑到这一点。作为后缀的流氓逗号将为变量数组创建一个额外的元素,从而抛弃通过引用UBound function创建的维度。
Sub split_from_below_space()
Dim rw As Long, v As Long, vVALs As Variant
With Worksheets("Sheet1") 'set this worksheet reference properly!
For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
.Cells(rw, 1) = Trim(.Cells(rw, 1).Value2)
If CBool(InStr(1, .Cells(rw, 1).Value2, Chr(44) & Chr(32))) Then
vVALs = Split(.Cells(rw, 1).Value2, Chr(44) & Chr(32))
.Cells(rw + 1, 1).Resize(UBound(vVALs), 1).EntireRow.Insert
.Cells(rw, 1).Resize(UBound(vVALs) + 1, 1) = _
Application.Transpose(vVALs)
For v = UBound(vVALs) - 1 To LBound(vVALs) Step -1
.Cells(rw, 1).Offset(v, 0) = _
Trim(.Cells(rw, 1).Offset(v, 0).Value2) & Chr(44)
Next v
End If
Next rw
End With
End Sub
您需要插入行以容纳数据,并且该方法几乎总是(如本例所示)从底部到顶部更好地执行。
答案 1 :(得分:1)
以下宏可能会对您有所帮助。您必须在包含多部分地址的表中选择最后单元格。当你启动宏时,它将向上移动到顶部并在需要的地方插入地址行(仅在当前列中),然后退出。
Option Base 1
Sub trnsfrm()
Dim i%, n%, ret(3, 1)
Set r = Selection
Do
a = Split(r, ",")
ret(1, 1) = Trim(a(0))
ret(2, 1) = Trim(a(1))
ret(3, 1) = Trim(a(2))
r.Range([a2], [a3]).Insert Shift:=xlDown
r.Range([a1], [a3]) = ret
If r.Row <= 4 Then Exit Do
Set r = r.Offset(-4)
Loop
End Sub
如果要在整个表格中插入行,则应替换行(10)
r.Range([a2], [a3]).Insert Shift:=xlDown
通过
r.Range([a2], [a3]).EntireRow.Insert Shift:=xlDown
假设/警告
由于宏实际上会更改当前表,并且“撤消”不适用于宏,因此在尝试之前一定要保存所有内容。
宏假设每个地址块由正好4行组成。如果地址的行数越来越少,那么maro就会失去同步,很可能会输出垃圾或停止。