这是一种使用用户定义类型,集合和数组的方法。我最近一直在使用它,并认为它可能适用。一旦你习惯了它,它确实使代码更容易编写。
用户定义类型在类模块中设置。我打电话给“CodeData”类型,并给了它两个属性 - 代码和数据
我假设你的数据在列A & B从第1行开始;我把结果放在同一张工作表上,但是列D & E.这可以很容易地更改,如果更好的话,可以放在不同的工作表上。
首先,输入以下代码到您已更名为“CodeData”
Option Explicit
Private pData As String
Private pCode As String
Property Get Data() As String
Data = pData
End Property
Property Let Data(Value As String)
pData = Value
End Property
Property Get Code() As String
Code = pCode
End Property
Property Let Code(Value As String)
pCode = Value
End Property
然后把下面的代码放到一个普通模块类模块:
Option Explicit
Sub ParseCodesAndData()
Dim cCodeData As CodeData
Dim colCodeData As Collection
Dim vSrc As Variant, vRes() As Variant
Dim V As Variant
Dim rRes As Range
Dim I As Long, J As Long
'Results start here. But could be on another sheet
Set rRes = Range("D1:E1")
'Get Source Data
vSrc = Range("A1", Cells(Rows.Count, "B").End(xlUp))
'Collect the data
Set colCodeData = New Collection
For I = 1 To UBound(vSrc, 1)
V = Split(vSrc(I, 1), " ")
For J = 0 To UBound(V)
Set cCodeData = New CodeData
cCodeData.Code = Trim(vSrc(I, 2))
cCodeData.Data = Trim(V(J))
colCodeData.Add cCodeData
Next J
Next I
'Write results to array
ReDim vRes(1 To colCodeData.Count, 1 To 2)
For I = 1 To UBound(vRes)
Set cCodeData = colCodeData(I)
vRes(I, 1) = cCodeData.Data
vRes(I, 2) = cCodeData.Code
Next I
'Write array to worksheet
Application.ScreenUpdating = False
rRes.EntireColumn.Clear
rRes.Resize(rowsize:=UBound(vRes, 1)) = vRes
Application.ScreenUpdating = True
End Sub
因为您将插入新的行,可能从最后一行开始,然后继续工作。简单的迭代。对单元格的值使用“Split”函数将其转换为数组,然后为每个数组元素插入一行。 –
我建议你使用*作为字典* *使B作为键,然后倾倒拆分(使用@DavidZemens建议的“拆分”功能)A作为其项目。然后将其返回到范围。 – L42