本文首发于2024年10月10日,收录于我的同名***Excel Live Learning and Practical Use (VBA Programming Practice),更多文章和案例,请搜索关注!数组、字典。
工作表复制。
行将动态插入到工作表中。
合并工作表中的单元格。
哈喽大家好,我是冷水泡茶,这两天在论坛上看到一篇求助帖,要求按照出库时间表,按照模板生成一张送货单,同一个地址合并成一张送货单。
关于生成发货单的情况,我们分享了一个【批量生成发货单,根据订单汇总表生成客户发货单】,不过今天这个略有不同,一起来看看吧:
这是出站计划,它是一个单独的文件:
这是要生成的交货单模板,也是一个单独的文件:
他给的模板里有很多行,我删掉了一部分,只留下一行,作为模板,格式是固定的。 当有不止一行数据时,我们会根据需要插入行,以避免空白行。
他的要求是:根据出库计划中的地址,根据交货单的信息,汇总出库数据,然后以出库单号命名,多个出库单号与-连接。
花了一点时间,终于完成了,所以我分享给大家:
基本思路和实施过程。
1. 设置用户窗体 userform1,用于选择出库计划、选择工作表、选择生成的交货单存储文件夹。
2.将启动表单的命令按钮放入菜单栏“加载项”中,主要原因是如果在模板表中添加命令按钮,那么在复制工作表时需要将其删除,如果添加工作表并放置命令按钮,则有点松动。 所以,这一次我们将尝试另一种方式。
3.我们点击“附加组件”选项卡,点击“交货单”,点击“生成”,然后启动用户表单userform1。
4. userform1 启动后,我们选择文件,打开出站详细信息文件,然后选择正确的工作表。 为了不影响后续操作,我们隐藏打开的工作表。
set wb = workbooks.open(filepath)wb.windows(1).visible = false5.选择保存路径,我们点击“生成”按钮,根据既定要求生成交货单。
1) 将数据读入数组 arr。
2)循环数组arr,以地址为键,数组arrtem作为itme添加到字典dic中。ARRTEM 存储详细数据。
3)循环字典的键,取出项目到arrtem,用“-”作为保存文件名连接“出库单号”的第四列。
4)将“交货单”模板表复制到新的工作簿中,这里我们直接复制工作表并保存文件。
ws.copyset wb = activeworkbookwb.s**eas s**efolder & "\" & filename(5)根据ARNTEM中的列数插入相应的行,并将ARRTEM数据写入工作表。
6)设置总计行的汇总公式。
.cells(5 + u + 1, 3).formula = "=sum(" & rng.address & ")"(7)设置出库订单编号列的格式,并将相同的编号单元格合并到中心。
for i = 5 to 5 + u if .单元格(I, 4) 6.工作表排序:在上述单元格合并居中操作中,我们需要连续排列相同的出库订单号,否则合并居中的结果可能不符合我们的预期(虽然不会错),所以在提取数据之前,我们按照出库订单号升序对出库计划进行排序。我们需要在两个地方进行排序操作(一个是当我们选择一个文件时,会自动选择第一个表,另一个是 cmbsheets 的 change 事件,它选择工作表),所以我们对多个调用做了一个单独的排序过程:不要看他的内容,其实可以录制一个自定义排序的宏。 可以将一些属性添加到自定义过程的参数中,以使其更适用。private sub sortsheet(ws as worksheet) with ws.sort .sortfields.clear .sortfields.add key:=ws.cells(1, 9), sorton:=xlsortonvalues, order:=xlascending, _dataoption:=xlsortnormal .setrange ws.usedrange .header = xlyes .matchcase = false .orientation = xltoptobottom .sortmethod = xlpinyin .apply end withend sub
7、数据校验:我们保存文件的时候,是以出库单号为文件名,数据采集的标准是以地址为依据的,同一个出库单可以有不同的地址吗?然后,文件可能会被覆盖,从而导致数据丢失。 因此,在生成交货单之前,会进行数据检查,如果同一出库订单有多个地址,则该程序将被撤销。
虽然这种情况不太可能发生,但从写作的角度来看,必须考虑。 这看起来有点慌乱,但它应该帮助我们扩展思维,让我们更全面地思考。 当然,这肯定会增加工作量。
实际上,出现此问题的原因是他要求以不是 100% 确定它是唯一文件名的方式保存文件。
为了解决这个问题,我们可以使用 DIC 的键,也就是“地址”,作为文件名,或者在文件名后添加一个不能重复的随机数,比如当前时间等。 但是,话又说回来,使用地址作为文件名可能包含不符合文件名要求的字符,这是另一件麻烦的事情。
8、当我准备把文件发到论坛时,发现房东的需求又变了,他想把“地址”放在“总计”下面。 算了,不要发。 不要改变它,仅此而已。
结束战斗!有关完整的**,请参阅第二条推文。
~end~~~
如果你喜欢它,喜欢它,点击它,发表评论,分享它!感谢您的支持!