我建议使用SPLIT 函数将包含多行的单元格拆分为一个数组。您可以使用换行符(字符代码 10)在每个换行符处进行拆分。
例如,如果您从以下数据开始:
Reproduce this data
然后运行以下命令:
Sub SplitRow()
Dim wb As Workbook
Set wb = Workbooks("MyWorkbook.xlsm")
Dim ws As Worksheet
Set ws = wb.Sheets("MySheet")
Dim rng As Range
Set rng = ws.Range("A1")
Dim MyArray As Variant
MyArray = Split(rng, Chr(10))
'Insert the number of rows needed
If UBound(MyArray) > 0 Then
rng.Offset(1, 0).Resize(UBound(MyArray), 1).EntireRow.Insert xlShiftDown, xlFormatFromLeftOrAbove
End If
'Write the array to sheet
rng.Resize(UBound(MyArray) + 1, 1).Value2 = Application.Transpose(MyArray)
'Copy over the other columns
Dim i As Long, j As Long
For i = 1 To 3
For j = 1 To UBound(MyArray) + 1
rng.Offset(i, j).Value2 = rng.Offset(0, j)
Next j
Next i
End Sub
你会得到这个:
换行的潜在问题
请注意,您的单元格中可能没有任何换行符。在这种情况下,您必须找到另一个角色作为delimiter 进行拆分。
要知道您的单元格是否包含换行符,您可以选择该单元格并运行以下命令:
Sub StringDrillDown(str As String)
Dim ws As Worksheet
With ActiveWorkbook
Set ws = .Sheets.Add(AFTER:=.Sheets(.Sheets.Count))
End With
ws.Range("A1") = "Character"
ws.Range("B1") = "Ascii Code"
Dim i As Long
For i = 1 To Len(str)
ws.Cells(i + 1, 1).Value2 = Mid$(str, i, 1)
ws.Cells(i + 1, 2).Value2 = Asc(Mid$(str, i, 1))
Next i
End Sub
例如,如果我在 Range A1 的原始内容上运行它(拆分前),我会得到:
希望您的 CSV 格式设置为每个元素之间有一个字符,以便您可以正确拆分它们。如果没有,您可能需要查看正则表达式。
注意事项:
- SPLIT 函数是从零开始的,这意味着 MyArray 的第一个元素是 MyArray(0)。
- 如果您计划对多行数据运行此过程,请确保您的循环从底部开始,以避免插入行弄乱行位置的问题。