我在1个单元格中有一个包含多个数据的工作表,这在几列中发生。我需要做的是将单元格分成单独的行,同时仍保留其他列的详细信息
屏幕1显示我得到的数据
http://imageshack.com/a/img845/1783/wxc8.png(屏幕1)
屏幕2是我希望输出的宏。
http://imageshack.com/a/img842/7356/7yra.png(第2页)
我找到并编辑的宏只允许我拆分1列,我无法正确编辑范围。需要拆分的列是“J”“K”“N”和“O”。列“A” - “I”和“L”“M”只需将其内容复制到新行。
提前感谢您的帮助。
这里的宏我正在使用
Sub Splt1()
Dim LR As Long, i As Long
Dim X As Variant
Application.ScreenUpdating = False
LR = Range("J" & Rows.Count).End(xlUp).Row
Columns("J").Insert
For i = LR To 1 Step -1
With Range("K" & i)
If InStr(.Value, Chr(10)) = 0 Then
.Offset(, -1).Value = .Value
Else
X = Split(.Value, Chr(10))
.Offset(1).Resize(UBound(X)).EntireRow.Insert
.Offset(, -1).Resize(UBound(X) - LBound(X) + 1).Value = Application.Transpose(X)
End If
End With
Next i
Columns("K").Delete
LR = Range("J" & Rows.Count).End(xlUp).Row
With Range("L1:M" & LR)
On Error Resume Next
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
On Error GoTo 0
.Value = .Value
End With
Application.ScreenUpdating = True
End Sub
答案 0 :(得分:0)
问题似乎是with
运算符。它限制了你的选择。尝试在没有with
的情况下重新构造宏,并直接参考范围。例如,用以下内容替换您的第一个for
循环:
For i = LR To 1 Step -1
If InStr(Range("K" & i).Value, Chr(10)) = 0 Then
Range("K" & i).Offset(, -1).Value = Range("K" & i).Value
'Range("J" ...
'Range("N" ...
'Range("O" ...
Else
K_collection = Split(Range("K" & i).Value, Chr(10))
Range("K" & i).Offset(1).Resize(UBound(K_collection)).EntireRow.Insert
Range("K" & i).Offset(, -1).Resize(UBound(K_collection) - LBound(K_collection) + 1).Value = Application.Transpose(K_collection)
'J_collection = Split(Range("J"...
'N_collection = Split(Range("N"...
'O_collection = Split(Range("O"...
End If
Next i
一般来说,我避免with
,因为它往往会模糊代码的视觉模式。
您可能还会考虑删除.INSERT
和.DELETE
列,并直接覆盖单元格。当一次使用多个列时,很难跟踪哪个列是临时的,哪个列是源。但这一切都取决于你的偏好。
与此相比,复制其他列的值应该很容易。