
本文于2023年8月30日首发于本人同名公众号,更多文章案例请搜索关注!
内容提要
字典的用法
明细数据按指定格式排版
大家好,我是冷水泡茶,今天在网上论坛看到一个求助贴,他的问题是:能否把明细数据源按指定格式排版?

他的数据表是这样的,左边6列是明细数据,右边几列是分省的数据列表:

他的具体要求是:
1、左边表一(A至F列数据源),数据有时多有时少,即是动态的。现在把它转换成表二 (J至Z列)那样格式排车。
2、右边表二 黄色的省份是根据表一的数据源的省份,有时多有时少,即是动态的。
3、每个省份下,先客户排,客户下再跟着它采购的商品和数量,接着下一个客户,商品和数量一直下去。
4、客户靠左对齐,且加粗。
这跟我们昨天分享的案例【Excel VBA 学校考场座位安排/随机调整】有点类似,都是把明细数据转换格式,但今天这个要稍微复杂一些,经过一番烧脑的操作,终于达成目标,我们一起来看一下:

基本思路
1、把数据读入数据,定义两个字典,一个存省份,一个存客户。
2、循环省份、客户、明细数据,取得相应的商品名称、数量,对应写入相应的数据区域。
程序代码
1、模块1,Arrange过程,排版:
Sub Arrange() Dim ws As Worksheet Dim lastRow As Integer Dim lastCoa As Integer Dim arr(), arrTem(), arrProvince() Dim dic As Object, dicProvince As Object Set ws = ThisWorkbook.Sheets("数据源") Set dic = CreateObject("Scripting.Dictionary") Set dicProvince = CreateObject("Scripting.Dictionary") With ws lastRow = .UsedRange.Rows.Count lastcol = .UsedRange.Columns.Count arr = .Range("A1:F" & lastRow).Value For i = 2 To UBound(arr) If arr(i, 3) <> "" Then dic(arr(i, 3) & "|" & arr(i, 4)) = arr(i, 4) dicProvince(arr(i, 3)) = 1 End If Next arrTem = dic.keys arrProvince = dicProvince.keys With .Range(Cells(1, 10), Cells(lastRow, lastcol)) .Clear .Font.Size = 10 .HorizontalAlignment = xlCenter End With For i = 0 To UBound(arrProvince) k = 0 m = 0 .Cells(1, 10 + i * 3) = arrProvince(i) .Cells(1, 10 + i * 3).Interior.Color = RGB(255, 255, 0) For j = 0 To UBound(arrTem) If InStr(arrTem(j), arrProvince(i)) Then Cells(2 + k + m, 10 + i * 3) = dic(arrTem(j)) Cells(2 + k + m, 10 + i * 3).Font.Bold = True Cells(2 + k + m, 10 + i * 3).HorizontalAlignment = xlLeft m = m + 1 For h = 2 To UBound(arr) If arr(h, 3) & "|" & arr(h, 4) = arrTem(j) Then Cells(2 + k + m, 10 + i * 3) = arr(h, 5) Cells(2 + k + m, 10 + i * 3 + 1) = arr(h, 6) k = k + 1 End If Next End If Next Next End WithEnd Sub
代码解析:
(1)定义一些变量,工作表对象ws,数组,字典等。
(2)line11~19,把“数据源”表明细数据装入数组;循环数组,把省份装入字典dicProvince,把省份+客户装入字典dic,item为客户。
(3)line20~11,把字典的key存入数组,以便进行循环。
(4)line22~26,把排版区域清空,设置字体=10,单元格水平居中。
(5)line27~47,循环省份、客户数组,再循环arr明细数据,把对应省份、客户的商品名称、数量写入右边的排版区域,这里有两个计数器,省份变动一次,m加1,客户变动一次,k加1,并把它们增加到单元格行变量。在写入省份、客户的时候,把对应单元格的格式也一并设置。
2、其他过程,CmdClear命令按键,清空排版数据:
Private Sub CmdClear_Click() With Sheets("数据源") .Range("J1").Resize(.UsedRange.Rows.Count, .UsedRange.Columns.Count).ClearContents End WithEnd Sub
代码解析:把“数据源”表J1单元格起向右向下的数据区域清空。这段代码楼主并未要求,主要是为了能看清楚演示过程的需要。
Tips
1、字典的用法。
2、通过增加计数变量的方式,使得数据能准确写入对应单元格。
3、单元格区域格式设置。
......
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留个言呗!分享一下更给力!感谢!