VBA039-动态生成看板聚合报告

B站影视 内地电影 2025-08-11 22:46 1

摘要:用户的日常运营监控模板中有个发到站的数据监控,虽然已经设置了公式,但每天因为发站和到站的名称和数量会产生变化,所以需要增加/删除行--》复制公式。因此需要动态生成这个模块的数据,消除手动增加/删除数据的环节

用户的日常运营监控模板中有个发到站的数据监控,虽然已经设置了公式,但每天因为发站和到站的名称和数量会产生变化,所以需要增加/删除行--》复制公式。因此需要动态生成这个模块的数据,消除手动增加/删除数据的环节

场地名称=发站+到站(剔重)

待返空:发运方式=重箱,到站=场地名称,发运状态=货物已交付

返空在途:发运方式=返空,发站=场地名称,发运状态=在途

返空到达:发运方式=返空,发站=场地名称,发运状态=已到达

返空卸车:发运方式=返空,发站=场地名称,发运状态=已卸车

待发重箱:发运方式=返空,到站=场地名称,发运状态=货物已交付

重箱在途:发运方式=重箱,到站=场地名称,发运状态=在途

重箱到达:发运方式=重箱,到站=场地名称,发运状态=已到达

重箱卸车:发运方式=重箱,到站=场地名称,发运状态=已卸车

合计:该列求和

1.聚合分2个组:返空和重箱

2.返空:依据发运方式来判定,但有个特殊情况,就是返空组中的待返空,它的数据=重箱组的货物已交付

3.重箱:同理。重箱组的待发重箱=返空组的货物已交付

4.重箱特殊说明:重箱分组中,如果场地名称={将军庙,红柳河,准东北,鄯善},那么只统计它们的待发重箱,其他数据不统计。如果场地名称不是上述,则只统计其他部分,不统计待发重箱。因为待发重箱只会出现在上述4个站点

5. 返空组的场地名称需剔除 “将军庙、红柳河、准东北、鄯善”

6. 智能行数调整:

自动计算所需行数(返空组 + 重箱组 + 2 行间隔:返空和重箱组之间间隔1行,重箱合计下方间隔1行)

比较当前区域行数与需求行数:

不足时:插入缺失行数(从 B18 下方开始)

过多时:删除多余行数(从 B18 下方开始)

本次项目的核心目标是开发一个ExcelVBA宏,该宏能够自动从一个名为《3_在途表每日明细3天》的源数据表中,根据一系列复杂的业务规则,计算聚合数据,并将结果动态生成到一个名为《日度看板》的目标工作表中。具体需求分解如下:

数据聚合:数据需分为“返空”和“重箱”两大组,每组根据不同的状态(如在途、已交付)和维度(发站、到站)进行统计。复杂规则:存在跨组计算(如“待返空”的数据源自“重箱”组)和针对特定站点(如“将军庙”等)的特殊统计逻辑。动态布局:报告的输出区域行数不固定,需要代码能“智能”地根据数据结果,自动插入或删除行,以确保布局的完美对齐。美化与格式:最终生成的报告需要有清晰的格式,包括标题加粗、对齐、边框以及统一的背景色,并且每次生成时都能清除旧格式,避免残留。

为了实现一个高效、稳健且易于维护的解决方案,我们采用了以下技术方案和逻辑思路:

性能优化:为避免VBA频繁读写单元格导致的性能瓶颈,我们首先将源数据一次性读入内存中的二维数组,所有计算都在内存中完成,最后才将结果一次性写回目标工作表。高效聚合:使用Scripting.Dictionary(字典对象)作为核心数据结构。字典提供了极高的查找效率,我们通过一次遍历内存数组,就将所有复杂的聚合计算同步完成,算法复杂度为O(n),确保了即使面对海量数据也能快速响应。逻辑模块化:我们将核心功能拆分为两个独立的模块:主过程GenerateDailyDashboard负责数据的读取、计算和写入;一个独立的私有过程FormatReport专门负责所有的美化工作。这种设计使得代码结构清晰,数据逻辑和表现样式分离,便于后期维护。健壮的布局管理:我们通过定位报告区域的起始单元格(B18)和结束标记文本,精确计算出每次报告所需的准确行数。然后,通过比较所需行数与当前行数的差异,动态地执行.EntireRow.Insert或.EntireRow.Delete操作,确保布局的精确性。在写入数据前,使用.Clear方法彻底清除目标区域的内容和所有格式,从根本上解决了格式残留的问题。

以下是实现本项目最关键的几个代码片段,它们分别展示了性能、复杂业务逻辑和模块化设计的核心思想。

1. 单次遍历聚合数据 (性能核心)

' --- 3. 单次遍历聚合数据 ---For i = 2 To UBound(arrData, 1)dispatchStation = arrData(i, 3)arrivalStation = arrData(i, 4)shippingMethod = arrData(i, 5)shippingStatus = arrData(i, 7)If shippingMethod = "重箱" ThenSelect Case shippingStatusCase "货物已交付"' 规则: 待返空 = 重箱的货物已交付 (按到站聚合)If dictEmptyData.Exists(arrivalStation) ThentempEmpty = dictEmptyData(arrivalStation)tempEmpty(0) = tempEmpty(0) + 1 ' 累加待返空dictEmptyData(arrivalStation) = tempEmptyEnd If' ... 其他Case ...End SelectElseIf shippingMethod = "返空" ThenSelect Case shippingStatusCase "货物已交付"' 规则: 待发重箱 = 返空的货物已交付 (按到站聚合)If dictHeavyData.Exists(arrivalStation) ThentempHeavy = dictHeavyData(arrivalStation)tempHeavy(0) = tempHeavy(0) + 1 ' 累加待发重箱dictHeavyData(arrivalStation) = tempHeavyEnd If' ... 其他Case ...End SelectEnd IfNext i

2. 特殊站点规则处理 (业务逻辑核心)

' --- 重箱组 (第3次修正版) ---' 首先,直接在主字典中应用业务规则For Each key In dictHeavyData.KeystempHeavy = dictHeavyData(key)If Not IsError(Application.Match(key, specialSites, 0)) Then ' 是特殊站点tempHeavy(1) = 0: tempHeavy(2) = 0: tempHeavy(3) = 0 ' 只保留待发重箱Else ' 不是特殊站点tempHeavy(0) = 0 ' 清除待发重箱End IfdictHeavyData(key) = tempHeavy ' 将修改后的数组存回字典Next key' 其次,统计需要显示的行数(特殊站点无论有无数据都显示,其他站点有数据才显示)heavyCount = 0For Each key In dictHeavyData.KeysIf Not IsError(Application.Match(key, specialSites, 0)) ThenheavyCount = heavyCount + 1 ' 特殊站点总是计数ElseIf Application.WorksheetFunction.Sum(dictHeavyData(key)) > 0 ThenheavyCount = heavyCount + 1 ' 其他站点有数据才计数End IfEnd IfNext key

3. 智能行管理与格式清理 (布局核心)

' --- 智能调整行数 ---Dim requiredRows As Long, currentRows As Long, diffRows As Long' 计算所需总行数: 标题(1)+表头(1)+数据行+合计(1) per group, + 1 spacer between, + 1 spacer afterrequiredRows = (1 + 1 + emptyCount + 1) + 1 + (1 + 1 + heavyCount + 1) + 1currentRows = rngEndMarker.Row - rngTarget.RowdiffRows = requiredRows - currentRowsIf diffRows > 0 Then' 插入不足的行rngTarget.Offset(1, 0).Resize(diffRows).EntireRow.InsertElseIf diffRows 四、迁移场景

这套解决方案的核心思想(内存计算 + 字典聚合 + 动态布局 + 格式化模块)具有很强的通用性,可以轻松迁移到其他类似的数据处理任务中:

场景一:生成月度销售报告
可以将本项目的场地名称替换为销售人员或产品类别,将运输状态替换为订单状态(如下单、已付款、已发货、已完成),通过修改聚合逻辑,快速生成按销售、按产品的月度业绩汇总报告。场景二:处理学生成绩单
可以将场地替换为班级,将运输方式替换为考试科目(如语文、数学),将状态替换为分数段(如优秀、良好、及格、不及格),用于快速统计各班级、各科目的成绩分布情况。场景三:库存物料盘点
可以将场地替换为仓库位置,将运输方式替换为物料类别,将状态替换为库存状态(如在库、待检、已出库),用于生成每日或每周的库存动态盘点报告,并自动美化格式,便于仓管人员阅读。实际演示

执行前

执行后

来源:终南藏

相关推荐