
本文于2023年10月6日首发于本人同名其他平台,更多文章案例请搜索关注!
内容提要
数据结构转换
一维表转二维表
二维表转一维表
大家好,我是冷水泡茶,今天在某论坛上看到一则求助贴:[求助]厂妹求助客户订单做模板:一维表转二维表

他发了几张表:

看了半天,终于搞清楚他要干什么:
1、表(1),调单表,包括所有库存数量。与表头客户名称对应的是客户下的订单数量,数据来自表(2),SO_TF表,也就是客户订单明细表。
2、表(2),客户订单表,需要把它的客户下单的商品数量,对应到表(1)中,这样做的原因是存在库存不足的情况,需要根据已有库存,跟客户协商调整为其他有库存的商品。这就是所谓的一维表转二维表。
3、调整完之后,再把表(1)中的客户订单信息提取出来,做成表(3),SO_TB表的形式。这就是所谓的二维表转一维表。
正好昨天我们刚刚分享过一个类似的案例【数据结构转换(数组、字典应用)】,但今天的这个比较复杂一点,还有一个反向操作,有点意思,分享给大家:

基本思路与实现过程
一维表转二维表:
1、调单表,A到D列是固定的,存入数组arr(),其中C列基础数量,从WL_TF表中取数,这里方法很多,我们准备在代码中完成。
For i = 3 To UBound(arr) '更新基础数量 If dicQuantity.exists(arr(i, 2)) Then arr(i, 3) = dicQuantity(arr(i, 2)) End IfNext
E列以后,就是要动态扩展的订单号、客户名称,以及订单数量。我们准备用字典的方法,基本跟昨天的案例类似。
2、在最后一个客户名称的右侧,增加3列,“销售合计”,还要添加汇总公式,“辅助列“,这是手工录入的数据,”剩余数量“,这是用前面的“基础数量”减去“销售合计”加上“辅助列”,这也要添加公式。
3、设置3个字典,dicQuantity放品号(key),数量(itme),从表WL_TF中提取基础数量;dicCustomer放订单号(key)与客户名称(item),从表SO_TF中取数;dicOrder,以“品号+订单号"作为key,数量为item ,从表SO_TF中取数。
4、根据dicCustomer,动态扩展arr,把订单号、客户名称写入arr。
'把订单数据存入arrk = UBound(arr, 2) + 1r = UBound(arr)For Each Key In dicCustomer.keys '表头订单号,客户字段 ReDim Preserve arr(1 To r, 1 To k) arr(1, k) = Key arr(2, k) = dicCustomer(Key) k = k + 1Next
5、循环数组arr,把第二列,第一行的品号+订单号作为key到字典dicOrder中去取值,把订单数量存入数组。
For i = 3 To UBound(arr) For j = 5 To UBound(arr, 2) arr(i, j) = dicOrder(arr(i, 2) & "|" & arr(1, j)) NextNext
6、把arr再扩展3列,填上相应字段名称,把arr数组回写到工作表。
7、设置公式。
For i = 3 To r Set sumRng = Range(Cells(i, 5), Cells(i, k)) .Cells(i, k + 1).Formula = "=SUM(" & sumRng.Address & ")" .Cells(i, k + 3).Formula = "=" _ & .Cells(i, 3).Address & "-" _ & .Cells(i, k + 1).Address & "+" _ & .Cells(i, k + 2).AddressNext
二维表转一维表:
1、把调单表数据读入数组arr()。
2、设置一个6行,1列的数组arrSO_TB,是表SO_TB格式的转置,以便动态扩展。填写第一列表头字段。
ReDim arrSO_TB(1 To 6, 1 To 1)For i = 1 To 4 arrSO_TB(i, 1) = arr(2, i)NextarrSO_TB(3, 1) = "数量"arrSO_TB(5, 1) = "订单单号"arrSO_TB(6, 1) = "客户"
3、循环数组arr,把数量区域有数字的元素所对应的行、列相关字段写入arrSO_TB。
For i = 5 To UBound(arr, 2) - 3 For j = 3 To UBound(arr) If Val(arr(j, i)) <> 0 Then ReDim Preserve arrSO_TB(1 To 6, 1 To k) arrSO_TB(1, k) = arr(j, 1) arrSO_TB(2, k) = arr(j, 2) arrSO_TB(3, k) = arr(j, i) arrSO_TB(4, k) = arr(j, 4) arrSO_TB(5, k) = arr(1, i) arrSO_TB(6, k) = arr(2, i) k = k + 1 End If NextNext
4、把数组arr数据写入工作表SO_TB。
打完收功!完整代码见第二条推文。
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留言评论、分享一下呗!感谢支持!