使用VBA进行数据逆转换

162 篇文章 16 订阅
56 篇文章 4 订阅

        通常使用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关键字,保留已有的数组元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值