乐于分享
好东西不私藏

出入库统计还在手动算?这个WPS宏让你一键搞定!

出入库统计还在手动算?这个WPS宏让你一键搞定!

出入库统计还在手动算?这个WPS宏让你一键搞定!

是不是也经历过这样的场景:面对一整年的出入库记录,需要按产品名称汇总入库、出库,最后算出库存。手动筛选、复制、写公式、下拉填充,忙活半小时,结果发现漏了一行数据,又要重来一遍……

为什么传统方法又慢又容易出错?

我们常见的数据表长这样:A列是产品名称,B列是出入库类型,C列是数量。目标是要生成每个产品的入库合计、出库合计和最终库存。

大多数人会这么做:复制A列到新位置→删除重复项→用SUMIFS分别统计入库和出库→再用公式算库存→最后复制粘贴成数值。步骤多不说,一旦数据量上千,Excel公式卡顿,表格半天没响应。

这种低效操作,不仅浪费时间,还容易在复制粘贴中引入错误。

WPS JS宏代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

function 删除重复项分类汇总() {    // 获取 A 列数据最后行号(从第4行开始)    var lastRow = Cells(Rows.Count, 'a').End(3).Row;    // 读取原始数据到数组    var names = [];    var types = [];    var quantities = [];    for (var i = 4; i <= lastRow; i++) {        names.push(Range("A" + i).Value2);        types.push(Range("B" + i).Value2);        quantities.push(Range("C" + i).Value2);    }    // 获取去重后的名称列表    var uniqueNames = [];    var nameMap = {};    for (var j = 0; j < names.length; j++) {        var name = names[j];        if (!nameMap[name]) {            nameMap[name] = true;            uniqueNames.push(name);        }    }    // 计算每个名称的入库合计、出库合计(出库取负,保持与原公式一致)    var results = [];    for (var k = 0; k < uniqueNames.length; k++) {        var currentName = uniqueNames[k];        var inSum = 0;        var outSum = 0;        for (var m = 0; m < names.length; m++) {            if (names[m] === currentName) {                if (types[m] === "入库") {                    inSum += quantities[m];                } else if (types[m] === "出库") {                    outSum += quantities[m];   // 出库数量可能为负数                }            }        }        var outPositive = -outSum;          // 转换为正数(与原公式 -SUMIFS 一致)        var stock = inSum - outPositive;    // 库存 = 入库 - 出库(正数)        results.push({            name: currentName,            in: inSum,            out: outPositive,            stock: stock        });    }    // 将结果写入 G 列开始的单元格    var startRow = 4;    for (var n = 0; n < results.length; n++) {        Range("G" + (startRow + n)).Value2 = results[n].name;        Range("H" + (startRow + n)).Value2 = results[n].in;        Range("I" + (startRow + n)).Value2 = results[n].out;        Range("J" + (startRow + n)).Value2 = results[n].stock;    }}

这个宏如何帮你解放双手?

这段WPS JS宏的核心逻辑很巧妙:它直接在内存里遍历原始数据,用JavaScript的对象特性累加每个产品的入库和出库,最后把计算结果一次性写入单元格。

整个过程完全绕开了Excel公式,这意味着:

  • • 速度飞快:上千行数据5秒内完成
  • • 不卡顿:没有公式堆积,文件大小不变
  • • 结果直接是数值:无需二次粘贴,即算即用

运行后,G列自动生成去重后的产品名称,H列是入库总数,I列是出库总数(显示为正数),J列是最终库存。从原始数据到汇总结果,一键到位。

本文示例文件已上传云盘,关注公众号后私信“出入库汇总”即可下载,包含完整代码和测试数据,拿回去改改就能用。

由于公众号平台更改了推送规则,为确保您能及时收到Excel每日一学的原创分享,请记得关注公众号并设为星标⭐,也欢迎您转发给身边需要的朋友,或者顺手点个在看。您的每一次互动,都是我们持续创作的动力。


你工作中最头疼的Excel重复操作是什么?留言区告诉我,下期可能就是你需要的解决方案。

本公众号 JS宏文章合集链接:WPS JS宏

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 出入库统计还在手动算?这个WPS宏让你一键搞定!

评论 抢沙发

6 + 6 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮