使用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函数公式启蒙课程》吧!

(0)

相关推荐