夜雨聆风学习资料网

ARTICLE · 1084555

Excel宏(VBA)自动生成周报,零基础也能学会

Excel宏(VBA)自动生成周报,零基础也能学会
每到周五下午,是不是又要手动把这一周的产量、良率、不良数从日报表里一条条复制出来,再拼成周报?一份 30 多行的日数据,手动 SUMIFS 半小时起步,还容易粘串行。

其实这件事 Excel 自己就能干——不用你懂编程,照着本文把一段现成的 VBA 宏"种"进表格,点一下按钮,周报自动生成。本文用半导体产线的真实场景(每日投入/良品/不良/报废)带你走完:看效果 → 种宏 → 改自己。

【解决方案概览】

核心就一句话:让宏替你循环每一周,用 SumIfs 把日数据加总,一行写一条周记录。

数据源:一张「原始数据」表,每天一行(日期 / 产品 / 投入 / 良品 / 不良 / 报废)。
目标:一张「周报」表,每周一行(投入合计 / 良品合计 / 良率 / 不良合计 / 报废合计)。
自动化:一段 生成周报 宏,按 7 天切周、按区间汇总、写表、弹窗报数。

本文配套的 半导体周报VBA宏模板.xlsx 里,「周报」表已经用 SUMIFS 公式写好,打开就能看到结果;VBA 源码表放好了可整段复制的宏,照抄即用。

【分步实操】

第 1 步:准备好「原始数据」表

至少要有这几列,每行代表一天:

日期        产品     投入   良品   不良   报废2026-08-01  PN-2048105098045252026-08-02  PN-31569208703218...

勾稽铁律:投入 = 良品 + 不良 + 报废。模板内置 31 天、3 个产品的示例数据,并已校验通过,你可以直接套用自己的数字。

第 2 步:先看公式版周报(不写代码也有数)

「周报」表的「投入合计」单元格里就是这个公式,打开即出数:

=SUMIFS(原始数据!C3:C33, 原始数据!A3:A33, ">="&B3, 原始数据!A3:A33, "<="&C3)

意思是:在「原始数据」里,把日期介于本周起始日(B3)和结束日(C3)之间的「投入」加总。良率那格再除以投入合计:

=E3/D3

把这一行往下拉 5 行,5 周周报就出来了。

第 3 步:把宏"种"进表格(零基础关键步)

  1. 菜单栏点「开发工具」。没有?右键功能区空白处 → 自定义功能区 → 勾选「开发工具」。
  2. 点「Visual Basic」→ 菜单「插入」→「模块」。
  3. 把模板里「VBA源码」表 A 列的代码整段复制 粘贴进去,关掉编辑器。
  4. 回到表格,「开发工具」→「插入」→「按钮(表单控件)」,在空白处拖一个按钮,弹窗里选「生成周报」,确定。

以后每周把新日数据贴进「原始数据」,点一下按钮,周报自动刷新。

第 4 步:宏到底干了什么(白话版)

找最早/最晚日期按 7 天一切割:第1周 / 第2周 / ... / 第N周每周用 SumIfs 加总 投入 / 良品 / 不良 / 报废良率 = 良品合计 / 投入合计一行写一条周记录最后弹窗:"周报已生成,共 N 周"

完整宏(已放在模板「VBA源码」表,可整段复制):

Sub 生成周报()    Dim wsData As Worksheet, wsRpt As Worksheet    Dim lastRow As Long, i As Long    Dim startDate As Date, endDate As Date, wkStart As Date, wkEnd As Date    Dim tIn As Double, tGood As Double, tBad As Double, tScrap As Double    Set wsData = ThisWorkbook.Sheets("原始数据")    Set wsRpt = ThisWorkbook.Sheets("周报")    lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row    startDate = Application.WorksheetFunction.Min(wsData.Range("A2:A" & lastRow))    endDate = Application.WorksheetFunction.Max(wsData.Range("A2:A" & lastRow))    wsRpt.Range("A2:I" & wsRpt.Rows.Count).ClearContents    i = 2    wkStart = startDate    Do While wkStart <= endDate        wkEnd = Application.WorksheetFunction.Min(wkStart + 6, endDate)        tIn = Application.SumIfs(wsData.Range("C2:C" & lastRow), _            wsData.Range("A2:A" & lastRow), ">=" & wkStart, _            wsData.Range("A2:A" & lastRow), "<=" & wkEnd)        tGood = Application.SumIfs(wsData.Range("D2:D" & lastRow), _            wsData.Range("A2:A" & lastRow), ">=" & wkStart, _            wsData.Range("A2:A" & lastRow), "<=" & wkEnd)        tBad = Application.SumIfs(wsData.Range("E2:E" & lastRow), _            wsData.Range("A2:A" & lastRow), ">=" & wkStart, _            wsData.Range("A2:A" & lastRow), "<=" & wkEnd)        tScrap = Application.SumIfs(wsData.Range("F2:F" & lastRow), _            wsData.Range("A2:A" & lastRow), ">=" & wkStart, _            wsData.Range("A2:A" & lastRow), "<=" & wkEnd)        wsRpt.Cells(i, 1) = "第" & (i - 1) & "周"        wsRpt.Cells(i, 2) = wkStart        wsRpt.Cells(i, 3) = wkEnd        wsRpt.Cells(i, 4) = tIn        wsRpt.Cells(i, 5) = tGood        wsRpt.Cells(i, 6) = Round(tGood / tIn, 4)        wsRpt.Cells(i, 7) = tBad        wsRpt.Cells(i, 8) = tScrap        wsRpt.Cells(i, 9) = "宏自动"        wkStart = wkEnd + 1        i = i + 1    Loop    MsgBox "周报已生成,共 " & (i - 2) & " 周", vbInformationEnd Sub

【关键参数说明】

切周粒度:wkStart + 6 表示每周 7 天。想做双周报,改成 wkStart + 13 即可。
汇总区间:">=" & wkStart 和 "<=" & wkEnd 是 SumIfs 的日期区间写法,注意 & 不能省,否则 Excel 不认。
良率精度:Round(tGood / tIn, 4) 保留 4 位小数;表格里再设成百分比格式就显示成 95.2%。
数据边界:宏用 Min/Max 自动取起止日期,所以你只要保证「原始数据」日期是真日期格式(不是文本),首尾周长短无所谓,宏会自动兜底到月末。
宏存储:含宏的工作簿要存成 .xlsm;模板为了通用给的是 .xlsx(公式版),你种完宏后另存为 .xlsm 更稳。

【常见问题和避坑提醒】

1.宏是灰的点不了:文件→选项→信任中心→启用宏;或把文件存成 .xlsm。这是最常见卡点。
2.中文变量报错:部分老版本 Excel 对中文变量名敏感。把 tIn 这类改成英文(如 totIn)即可,逻辑一行不用动。
3.日期不识别,汇总为 0:「原始数据」的日期看着像日期,其实是文本。选中列→数据→分列→完成,转成真日期。
4.公式版和宏版结果对不上:检查「周报」起始日/结束日有没有覆盖全部数据;模板已校验「周边界正好覆盖 31 天、无重叠」。
5.勾稽报错 投入≠良品+不良+报废:贴数据时别漏列;模板内置断言,任何一行不等都会当场暴露。
6.想加指标不会改:在「周报」加一列(如报废率=报废/投入),宏里补一行 wsRpt.Cells(i, 列号) = Round(tScrap / tIn, 4),公式版补一个 =H3/D3 即可。

【总结】

周报自动化不是高深编程,就是「循环 + 区间汇总 + 写表」三件事。先吃透 SUMIFS 公式版(打开就有数),再把宏种进去点按钮刷新,周五下午的半小时手动活儿从此变成 3 秒。模板里的 31 天示例数据已通过勾稽与跨表校验,换成你自己的日数据就能直接跑。

【领取资料】

回复【Excel周报VBA模板】,领取《半导体周报VBA宏模板.xlsx》:

  • 原始数据(31 天 / 3 产品示例,投入=良品+不良+报废 已校验)
  • 周报(SUMIFS 公式版,打开即出数)
  • VBA源码(可整段复制的「生成周报」宏)
  • 使用说明(三步上手 + 改造成你自己的周报)

相关学习资料