|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
Sub SplitData()
Const sSep$ = "," ' 分隔符,可以改为其它字符
Dim vArrData, vArrRslt(), vArrSnglRow, iC&, iR&, sArr$(), i&, iCol&
Dim iSnglRows&, iRows&, iCols&, iSR&, iSRTmp&, iSC&
' 获取当前工作表的数据区域,并将数据存入数组中
With Me.[a1].CurrentRegion
vArrData = Range(Me.[a2], .Cells(.Count))
End With
' 计算数据的行数和列数
iRows = UBound(vArrData, 1)
iCols = UBound(vArrData, 2)
' 定义一个空的一维数组
ReDim vArrSnglRow(1 To iCols, 1 To 1)
For iR = 1 To iRows ' 遍历每一行
iSnglRows = 1
' 将当前行的每一个单元格按照分隔符拆分成多个子串,存储到一维数组vArrSnglRow中
For iCol = 1 To iCols
vArrSnglRow(iCol, 1) = Split(vArrData(iR, iCol), sSep)
' 计算一维数组vArrSnglRow中元素的总数,即新数组的行数
iSnglRows = iSnglRows * (UBound(vArrSnglRow(iCol, 1)) + 1)
Next 'iCol
If ((Not vArrRslt) = -1) Then ' 判断是否是空数组
iSR = 1
ReDim vArrRslt(1 To iCols, 1 To iSnglRows)
Else
' 不是空数组,计算新数组的起始行数和总行数,并将原数组扩展为新数组大小
iSR = UBound(vArrRslt, 2) + 1
ReDim Preserve vArrRslt(1 To iCols, 1 To UBound(vArrRslt, 2) + iSnglRows)
End If
' 将每一行的单元格子串按照笛卡尔积合并成一维数组,并存入新数组中
For iCol = 1 To iCols
sArr = vArrSnglRow(iCol, 1)
iSRTmp = iSR
For i = 0 To UBound(sArr)
For iSC = iSRTmp To (iSRTmp + iSnglRows - (UBound(sArr) + 1)) Step (UBound(sArr) + 1)
vArrRslt(iCol, iSC) = sArr(i)
Next 'iSC
iSRTmp = iSRTmp + 1
Next 'i
Next 'iCol
Next 'iR
' 将新数组转置
vArrRslt = WorksheetFunction.Transpose(vArrRslt)
' 将新数组写入sheet2工作表,清除当前数据区域中的内容
With ThisWorkbook.Worksheets("sheet2")
.UsedRange.Offset(1).Clear
.[a2].Resize(UBound(vArrRslt, 1), UBound(vArrRslt, 2)) = vArrRslt
.Activate
End With
End Sub
这个 VBA 子过程的作用是将当前工作表中的每一行按照分隔符分割成多个单元格,并将拆分后的结果重新排列生成一个新的二维数组,并将该数组写入到另一个工作表中。 |
|