
AI 写好的 VBA 可以保留在工作簿里。以后录入同样格式的成绩,点击“一键生成成绩分析”按钮,就能重新生成统计表、排名和图表,不必每次再问 AI。
这次用 WorkBuddy 配合 VBAYYDS 语音编程完成一个不做窗体的案例:分析 5 个班、每班 50 人的语文、数学、英语成绩。WorkBuddy 读取表格和规则,编写 VBA,检查并修正代码,再运行验证。使用者负责说明统计口径,并核对结果。
本文重点讲清三个容易出错的地方:缺考与零分的区别、同分如何并列排名,以及重复点击时怎样更新已有结果。示例中的姓名和成绩均为模拟教学数据。
准备成绩表和统计规则

图 1 原始成绩保留在左侧,后续增加的分析按钮位于右侧空白区域。
原始表第 4 行是表头,第 5 行起每行一名学生。A 至 F 列依次为学号、姓名、班级、语文、数学、英语;学号是唯一标识,不能重复。先把规则写在工作簿里,AI 才有明确的判断依据。
| 工作表 | 用途 |
|---|---|
| 原始成绩 | 保存 250 名学生的输入数据,分析不改写 A 至 F 列 |
| 分析规则 | 说明分数范围、缺考口径、排名与统计要求 |
| 成绩分析 | 输出各班及全年级统计、分数分布和两张图表 |
| 排名明细 | 输出学生成绩、总分、年级名次、班级名次及缺考科目 |
本例单科满分 100 分,60 分及以上及格,90 分及以上优秀。空白表示缺考;0 是有效分数。只有三科齐全的学生才计算总分和名次。
“分析规则”是 AI 编写代码时的依据。当前版本把及格线、优秀线和科目数写成 VBA 常量,并不会在每次点击时自动重新解释规则表。调整规则后,应让 WorkBuddy 同步修改代码并重新验收。
用自然语言告诉 WorkBuddy 要做什么

图 2 本案例实际输入的首轮提示,业务目标与关键限制都写在同一段需求中。
进入 VBA 后,通过 VBAYYDS 菜单复制项目文件夹路径,再把该文件夹加入 WorkBuddy 新任务。可以直接用嘴说需求,通过语音输入形成提示词,发送前检查“缺考”“并列”等关键词是否识别正确。
实际首轮提示如下,仅整理了展示格式:
请使用vba相关技能完成以下任务,不做窗体。帮我分析这份学生成绩,按表里的规则算总分和排名,统计各班各科平均分、及格率和优秀率,再画出班级对比和分数分布图。缺考不要当成零分,同分要并列排名。结果放到新表里,原始成绩不要改。做好后请自动检查,再运行一次也不要重复生成。
“请使用vba相关技能”指定工作方式;“不做窗体”限制交付范围,避免额外生成登录页或输入界面。
“按表里的规则”让 AI 结合当前工作簿理解任务。“缺考不要当成零分,同分要并列排名”明确统计口径,不能只用一句“帮我排个名”代替。
“结果放到新表里”保护原始数据;“自动检查,再运行一次”把验证列入任务,避免只交付一份尚未运行的代码。首轮无需给出专业函数名,先说清目标、硬规则和验收动作即可。
让 AI 完成代码和运行验证

图 3 WorkBuddy 展示了边界样例和重复运行的检查摘要,结果仍需结合工作簿核对。
WorkBuddy 读取项目及工作表后,生成业务模块 m成绩分析,并在检查中发现条件判断写法存在风险,随后自行修改,再运行验证。本案例的业务 VBA 由 WorkBuddy 完成。
代码按“读取并校验、计算名次、写入结果、生成图表、自动检查”的顺序执行。先校验输入再写结果,可以让已识别的数据异常在更新前停止;这并不等于具备完整的数据库事务或所有异常的自动回滚。
工作表按钮绑定的是一个固定入口。下面是项目中的真实入口代码,它调用同一个分析过程:
Public Sub RunScoreAnalysis()
生成成绩分析
End Sub
调试阶段由 VBAYYDS 命令行执行宏;日常使用阶段则直接点工作表上的按钮。两种方式调用已有 VBA,不需要每次让 AI 重写分析逻辑。
AI 的完成摘要只能作为检查线索。本例另对实际输出做了独立核对,验证人数、分数、名次、比例及重复运行后的结构,而不是仅以“AI 说完成了”作为通过依据。
区分缺考并正确计算并列排名

图 4 VBA 主过程先读取并校验数据,再计算名次和写入两张结果表。
缺考与零分要分别保存。某科缺考时,该生不进入这一科平均分、及格率和优秀率的分母,但其他已考科目仍正常统计。三科中有一科缺考,则总分和名次留空,并标明缺考科目。
例如学号 20261004 的成绩是 0、59、90,总分为 149,仍参加排名。学号 20261005 缺考英语,其语文和数学成绩有效,但不能把英语补成 0 后参与总分排名。
并列排名采用 1、1、3。先按总分从高到低排序,同分按学号升序展示。当前分数与前一名相同时沿用前一名次,否则使用当前位次;班级名次使用相同口径。
以下为项目排名分支的原码节选,数组和循环由外层过程提供:
If i = 1 Then
m年级名(idx(i)) = 1
ElseIf m总分(idx(i)) = m总分(idx(i - 1)) Then
m年级名(idx(i)) = m年级名(idx(i - 1))
Else
m年级名(idx(i)) = i
End If
本例两名学生总分均为 300,并列第 1;下一名总分 274,列第 3。这样既保留稳定的显示顺序,也不会把同分学生误排为不同名次。
核对统计结果和重复运行

图 5 班级三科平均分对比图放在统计表右侧,不遮挡原统计数据。
本例共有 250 名学生,其中 247 人三科齐全、3 人各缺考一科。每科有效成绩均为 249 份。全年级语文、数学、英语平均分分别为 71.08、72.62、72.92 分。
| 核对项 | 实际结果 |
|---|---|
| 同分名次 | 两人 300 分并列第 1,274 分为第 3 |
| 及格与优秀边界 | 60 分计入及格,90 分计入优秀 |
| 缺考与零分 | 3 人不参加总分排名;0 分正常统计 |
| 按钮重复点击 | 两次真实点击均完成,未堆叠结果表或图表 |
| 输入与输出结构 | 250 名学生数据未改,保持两张结果表和两张图表 |
| 独立结果核对 | 2456 项检查通过,无失败项 |
每次运行还执行代码内置的 8 项自检。为了支持重复使用,程序找到同名结果表后清理旧结果及图表,再重新写入;找不到才创建。因此不要把需要长期保留的手工备注放进这两张输出表。
本次完成了当前样例、边界值和同一批数据的重复运行验证,未做换一批成绩后的完整测试,也未做关闭重开测试。非法输入的拦截代码已经存在,但未逐项注入错误验证,不能据此宣称所有异常都已覆盖。
保存按钮后继续复用
首轮成绩分析完成后,再向 WorkBuddy 发出以下补充要求。它是后续增加按钮的提示,不是首轮提示的一部分:
请使用VBA相关技能,在原始成绩表上加一个明显的“一键生成成绩分析”按钮。点它就运行已经做好的分析,以后改完成绩直接再点,不用再问AI。不做窗体,不改变原数据和统计规则。请完成按钮、测试并保存工作簿;运行宏仍用VBAYYDS命令行。
按钮位于“原始成绩”表 H1 附近,绑定 RunScoreAnalysis。生成后的工作簿以 .xlsm 格式保存,才能保留 VBA。使用时仅对来源可信的工作簿启用宏。
以后换成绩,保持工作表名称、表头位置和三科结构不变,先在副本中更新输入,再点按钮,检查人数、缺考数量和几条已知样例。程序运行依赖工作簿里的 VBA,无需重新询问 AI;如果新增科目、改变及格线或移动数据列,则需要修改代码并重新测试。
可以把下面的模板用于其他工作表分析任务。把方括号替换为自己的内容,不必提供专业代码设计:
请使用 VBA 相关技能完成以下任务,不做窗体。先读取当前工作簿里的[原始数据表]和[规则表],帮我完成[需要的统计和图表]。[空白、零值、重复值]请按[具体规则]处理。结果写入[结果表名称],不要修改原始数据。完成后检查[已知样例及预期结果],再运行一次确认不会重复生成。确认分析正确后,请在原始表空白处增加运行按钮,测试并保存。
如果结果不符合预期,可以直接说:“这名学生英语空白,现在却被算进了总分排名。缺考者应留空,请修正并验证这个学号。”给出可见问题、正确目标和可核对样例,比要求“重新优化全部代码”更容易定位偏差。
这类任务中,WorkBuddy 负责把自然语言转成 VBA 并推进运行验证;使用者负责确定规则和验收结果。代码稳定后,按钮就成为日常入口,让同一套分析按相同口径重复执行。

