使用VBA进行数据逆转换
通常使用VBA进行处理数据的时候,是实现聚合功能,即:求和、计数等等。但是有些应用场景,需要将汇总记录还原为原始记录。如下图,需要根据左侧数据记录表中“数量”列的数值将记录扩展为右侧的表格。
Private Sub CommandButton1_Click()
Dim aData, i, j, k, m, n, aRes()
aData = Sheets('原数据').[a1].CurrentRegion.Value
i= 1
ReDim Preserve aRes(1 To 5, 1 To i)
aRes(1, 1) = '序号'
aRes(2, 1) = '类别'
aRes(3, 1) = '颜色'
aRes(4, 1) = '价格'
aRes(5, 1) = '数量'
For m = 2 To UBound(aData, 1)
k = CInt(aData(m, 5))
ReDim Preserve aRes(1 To 5, 1 To i + k)
For j = 1 To k
aRes(1, i + j) = i + j - 1
aRes(2, i + j) = aData(m, 2)
aRes(3, i + j) = aData(m, 3)
aRes(4, i + j) = aData(m, 4)
aRes(5, i + j) = 1
Next j
i = i + k
Next m
With Sheets('结果')
.Cells.Clear
.[a1].Resize(i, 5).Value = Application.Transpose(aRes)
.Activate
End With
MsgBox 'done'
End Sub
代码主要使用数组进行处理,首先将原始数据表加载到数组aData中,然后循环处理每行记录,并将结果保存在数组aRes中,最终将结果数组写入“结果”工作表中。
代码中使用了动态数组aRes,由截图可以看出,转换后的结果数据的列数是固定的(5列),但是为什么代码中没有使用 Nx5的二维数组,而是使用5xN的二维数组呢?其原因在于,VBA的动态数组只能修改最后一个维度的上限和下限,对于二维数组来说,第一个维度无法修改。所以在转换数据过程中使用5xN的二维数组,最终写入工作表时,进行行列转置成为 Nx5的二维数组。
另外,在代码处理过程中需要逐个追加结果数组元素,因此在Redim语句中,需要增加Preserve关键字,保留已有的数组元素。
还在发愁Excel函数公式如何入门?赶快长按扫码,来报名学习《Excel函数公式启蒙课程》吧!