excel学习库

excel表格_excel函数公式大全_execl从入门到精通

Excel VBA 数据源明细数据按指定格式排版

本文于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~~~~~~

喜欢就点个、点在看留个言呗!分享一下更给力!感谢!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接