先问大家一个真实的工作场景:你手上有一张从系统里导出的客户表,里面既有重复报名的客户,又有残缺不全的空值行。正常情况下的做法是打开 WPS 表格,先筛选重复项,再逐列定位空值,接着手动删除或者补全。一次两次还能接受,如果是每周都要处理的数据清洗任务,纯手工操作不仅效率低,而且很容易漏掉重复行。
最近在折腾 WorkBuddy 的“靠嘴编程”功能时,发现一个很适合办公场景的落地组合:用 WorkBuddy 把自然语言需求直接生成 WPS 表格的 JSA 宏代码,然后复制到 WPS 宏编辑器里运行,最终完成“删除重复值和空值”的数据清洗任务。整个过程不需要手写复杂代码,也不需要懂完整的 JavaScript 语法,只要能把需求描述清楚,WorkBuddy 就能帮你把代码搭出来。
本文会围绕 WorkBuddy 与 WPS-JSA 的完整实战流程展开,包含环境准备、需求描述技巧、核心宏代码逐段拆解、运行验证以及常见报错排查。无论你是经常跟 Excel/WPS 表格打交道的办公人员,还是想了解“靠嘴编程”落地方式的开发者,都可以按本文流程自己跑一遍。
藏头:实用工具与方法结合,能显著提升表格数据清洗效率。
1. 背景与核心概念
1.1 WorkBuddy 是什么
WorkBuddy 是一款以自然语言交互为核心的 AI 编程助手工具,可以基于用户用中文或英文描述的需求,生成代码、脚本、自动化流程片段。和传统开发方式不同的是,WorkBuddy 更强调“意图到代码”的转换能力,也就是网上经常说的“靠嘴编程”。
在办公自动化场景中,WorkBuddy 的价值不在于替代完整的企业级开发,而在于快速生成针对具体任务的脚本。比如:
- 批量重命名文件。
- 自动整理文件夹。
- 编写数据处理脚本。
- 生成 WPS/Excel 宏代码。
- 辅助编写接口自动化测试脚本。
对于不熟悉编程的办公人员来说,WorkBuddy 相当于一个会写代码的助手;对于开发者来说,它又类似于一个代码片段生成器,能减少重复性样板代码的编写时间。
本文用到的核心能力只有一个:用自然语言描述数据清洗需求,让 WorkBuddy 生成 WPS-JSA 宏代码。
1.2 WPS-JSA 是什么
WPS-JSA,全称是 WPS JavaScript Application,也就是 WPS 表格中的 JavaScript 宏功能。它允许用户使用 JavaScript 语言编写宏脚本,实现对表格数据的自动化操作。
和传统 VBA 宏相比,JSA 有几方面的特点:
- 语言基础是 JavaScript,前端开发者上手更快。
- 宏代码以
.js或项目形式保存在 WPS 中。 - 调用 WPS 表格对象模型的方式与 VBA 类似,但 API 风格更接近 JavaScript 习惯。
- 可以通过“开发工具”选项卡进入宏编辑器进行编写和运行。
需要特别说明的是,不同 WPS 版本对 JSA 的支持不完全一致。部分较早版本可能默认只支持 VBA,不提供 JSA 编辑器入口;而新版本的 WPS 个人版、专业版已经在“开发工具”中提供了 JSA 支持。实际使用前需要先确认你本机的 WPS 版本和功能权限。
1.3 “靠嘴编程”的实际含义
“靠嘴编程”听起来很玄,其实核心就是把“人的自然语言需求”转换成“可执行的代码脚本”。整个流程可以拆成三部分:
- 需求表达:用清晰、具体的语言描述要处理的数据范围和操作逻辑。
- 代码生成:AI 工具根据需求生成代码。
- 验证执行:把代码放到目标环境运行,观察结果并迭代优化。
“靠嘴编程”虽然降低了编码门槛,但并不是说完全不需要思考。需求描述得越清楚,代码生成质量就越高。比如“把表格里重复的数据删掉”就是无效描述,而“删除 A2:C100 区域中所有列完全相同的重复行,保留第一次出现的数据行”就是高质量描述。
本文后面的实例,会围绕“高质量指令描述”展开。
2. 环境准备与版本说明
2.1 本文环境清单
先列出本文实战所用的基础环境,方便对照:
| 环境项 | 说明 |
|---|---|
| 操作系统 | Windows 10 及以上(Win7 需要以实际 WPS 版本支持为准) |
| WPS 版本 | 支持 JSA 宏编辑器的 WPS 版本,建议升级到较新的正式版 |
| 宏编辑器入口 | WPS 表格 → 开发工具 → JSA 宏编辑器 |
| WorkBuddy | 桌面客户端或网页版,能看到对话生成界面即可 |
| 示例数据 | WPS 表格中手动构造的“客户报名表”数据区 |
如果你的电脑上 WorkBuddy 尚未安装,可以先从官方渠道下载客户端,或者使用网页版入口。安装过程中如果有网络代理类设置,尽量走正常联网环境,不要配置非正规代理,避免安全风险。
2.2 确认 WPS 是否支持 JSA
打开 WPS 表格,在顶部菜单栏查看是否有“开发工具”选项卡。如果没有,可以尝试:
- 点击“文件”菜单 →“选项” →“自定义功能区”,勾选“开发工具”。
- 检查 WPS 版本是否为较新的正式版。
- 确认当前账户是否具备宏功能权限。
如果功能区已经出现“开发工具”,再点击“JSA 宏编辑器”,能弹出类似代码编辑器的窗口,说明当前环境支持 JSA。
需要注意,WPS 的 JSA 编辑器打开之后,左侧会显示工程资源管理器,中间是代码编辑区域。这里我们可以新建模块、编写宏代码并运行。
2.3 WorkBuddy 使用前置说明
WorkBuddy 本身并不直接操作 WPS 表格,它的输出结果是“文本形式”的代码。也就是说,WorkBuddy 生成的 JSA 宏需要你手动复制到 WPS 宏编辑器中运行。
这一点要多说一句:WorkBuddy 类似一个编程助手,而不是表格插件。它不能替代宏编辑器,也不是 WPS 的自动化插件。理解这一点之后,就不会对“代码怎么跑起来”产生困惑了。
3. 核心逻辑与 JSA 宏设计思路
在让 WorkBuddy 生成代码之前,先梳理清楚“删除重复值和空值”这个需求在表格处理中的底层逻辑。
3.1 删除重复值的数据逻辑
表格中的重复行,通常是指“指定区域内所有列的值完全相同”的数据行。比如:
| 姓名 | 手机号 | 报名课程 |
|---|---|---|
| 张三 | 13800000001 | Python 基础 |
| 李四 | 13800000002 | Java 入门 |
| 张三 | 13800000001 | Python 基础 |
第三行与第一行完全一致,这里的“张三”就是重复数据。处理的方式是保留第一次出现的行,删除之后出现的相同行。
如果只根据某一列去重,比如只根据“手机号”去重,那么即使“姓名”和“课程”不同,只要手机号相同,也要视为重复。这种按列去重的逻辑在 JSA 中同样可以实现。
这里要强调的是:在执行删除操作前,建议备份原表或先复制一份数据到新工作表。数据清洗属于破坏性操作,一旦误删除,很难恢复。
3.2 删除空值的数据逻辑
“空值”在不同场景下含义不同:
- 单元格为空白
""。 - 单元格包含空格,但看起来为空。
- 单元格包含
null、undefined或不可见字符。
简单场景下,我们只需要判断单元格的Value()是否为空、是否为null、是否为undefined,再决定是否把整行视为空行删除。
常见设计中,如果一行中所有单元格都为空,可以认为它是“空白行”,直接删除。如果只有某一列为空,比如“手机号”为空,则根据业务规则决定是删除整行,还是只填充默认值。
本文的示例以“整行数据完全为空则删除该行”为主,同时保留对单列空值的判断演示,便于你按实际需求修改。
3.3 JSA 宏的整体执行流程
整个 JSA 宏可以按以下流程设计:
- 获取当前活动工作表。
- 确定数据区域范围,例如从 A1 到 C100。
- 从最后一行向上遍历,逐行判断是否为空行。
- 删除空行。
- 对剩余数据区域执行去重操作。
- 弹出提示框显示删除结果。
这里选择“从下往上遍历”的原因在于:删除行会导致行号变化。如果从上往下遍历,删除一行后,后面的行会整体上移,容易漏处理。而从最后一行开始向上遍历则每次都只处理当前行,不受之前删除操作影响。
在 WPS-JSA 中,Range 对象的Delete()方法和工作表的UsedRange属性是完成这项工作的重要手段。
4. 完整实战:WorkBuddy 生成 JSA 宏删除重复值与空值
4.1 准备测试数据
在 WPS 表格中新建一个工作表,命名为“客户报名表”,输入以下测试数据:
| 姓名 | 手机号 | 报名课程 |
|---|---|---|
| 张三 | 13800000001 | Python 基础 |
| 李四 | 13800000002 | Java 入门 |
| 张三 | 13800000001 | Python 基础 |
| 王五 | 13800000003 | 数据分析 |
| 李四 | 13800000002 | Java 入门 |
| 赵六 | 13800000004 | 自动化办公 |
| 孙七 | 13800000005 | 爬虫实战 |
这个表格包含:
- 三行完全重复的数据(张三、李四重复行)。
- 一行完全空白的数据(第七行)。
- 一行“姓名为空、其他列为空”的数据(第九行,实际是姓名列空白,但整行其他列也为空)。
需要注意,第九行的 A9、B9、C9 都为空,所以它在逻辑上也属于整行空行。
4.2 编写高质量 WorkBuddy 指令
打开 WorkBuddy 对话窗口,先明确你的需求范围。下面是一段推荐的中文指令模板:
我在 WPS 表格中有一张“客户报名表”,数据范围是 A1:C9。 第一行是标题行:姓名、手机号、报名课程。 请帮我生成一段 WPS-JSA 宏代码,实现以下功能: 1. 从数据最后一行向上遍历,删除整行单元格全为空的行; 2. 在剩余数据中,根据 姓名+手机号+报名课程 三列联合判断,删除重复数据行,保留第一次出现的行; 3. 弹出一个消息框,提示删除了多少行空数据、删除了多少行重复数据; 4. 代码需要注释清楚,方便我后续修改。这段指令包含几个关键信息:
- 明确工作表名称。
- 明确数据范围。
- 明确标题行占用情况。
- 明确空值判断逻辑。
- 明确去重字段。
- 明确结果提示方式。
- 要求注释。
需求越具体,生成的代码越接近可直接运行的状态。反过来,如果你的指令只写“帮我删掉重复的和空的”,生成的代码大概率需要你自己再调半天。
WorkBuddy 生成代码后,不需要立刻全盘接受。可以检查一下它是否使用了UsedRange、是否从下往上遍历、是否对标题行做了保护。如果发现没有处理标题行,可以追加指令:
请保留第一行标题,不要删除标题行。通过多轮对话不断修正代码,是“靠嘴编程”的正确打开方式。
4.3 WorkBuddy 生成的 JSA 宏代码示例
下面是一段基于上述需求生成的 JSA 宏核心代码,可以作为参考。不同 WorkBuddy 版本可能生成略有差异,但整体思路是通用的。
文件位置:WPS 宏编辑器 → 模块 → 新建模块,然后粘贴以下代码:
function 删除重复值和空值() { // 获取当前活动工作表 var sheet = ActiveSheet; // 定义数据区域,根据实际数据范围调整 var lastRow = 9; var lastCol = 3; var startRow = 2; // 从第2行开始,因为第1行是标题 // 统计删除数量 var emptyCount = 0; var duplicateCount = 0; // 第一步:从下往上删除整行全为空的行 for (var i = lastRow; i >= startRow; i--) { var rng = sheet.Cells(i, 1).Resize(1, lastCol); var isEmptyRow = true; for (var j = 1; j <= lastCol; j++) { var cellValue = rng.Cells(1, j).Value(); if (cellValue !== null && cellValue !== undefined && String(cellValue).trim() !== "") { isEmptyRow = false; break; } } if (isEmptyRow) { rng.Delete(xlUp); emptyCount++; } } // 第二步:从下往上删除重复行,联合判断姓名、手机号、报名课程 // 先获取当前最大行号 var maxRow = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var seen = {}; for (var i = maxRow; i >= startRow; i--) { var name = sheet.Cells(i, 1).Value(); var phone = sheet.Cells(i, 2).Value(); var course = sheet.Cells(i, 3).Value(); // 拼接成唯一键 var key = String(name) + "|" + String(phone) + "|" + String(course); if (seen[key]) { sheet.Rows(i).Delete(); duplicateCount++; } else { seen[key] = true; } } // 第三步:弹出提示 MsgBox("删除空行:" + emptyCount + " 行\n删除重复行:" + duplicateCount + " 行"); }代码说明:
xlUp表示向上查找下一个非空单元格,等同于xlToUp的枚举。sheet.Cells(i, 1).Resize(1, lastCol)表示从当前行第一列开始,扩展为 1 行 3 列的区域。String(cellValue).trim() !== ""判断单元格内容去掉首尾空格后是否为空字符串,可以过滤掉纯空格单元格。seen对象用于记录出现过的主键,第二次遇到相同 key 就删除当前行。MsgBox是 WPS-JSA 中常用的弹窗方法,与 VBA 的 MsgBox 类似。
这里需要注意,sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row这段代码是用来动态获取最后一行的行号,避免写死 9。第二次遍历时,由于已经删除了空行,实际最大行号可能与初始不同,所以要重新计算一次。
4.4 完整代码优化版本
上面的代码可以运行,但还有优化空间。实际项目中,数据范围不确定,标题行位置也不一定固定。我们可以把代码改成更通用一点:
function 删除重复值和空值_优化版() { var sheet = ActiveSheet; // 动态获取最后一行和最后一列 var lastRow = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var lastCol = sheet.Cells(1, sheet.Columns.Count).End(xlToLeft).Column; var startRow = 2; // 默认第一行是标题 var emptyCount = 0; var duplicateCount = 0; // 第一步:删除整行全为空的行 for (var i = lastRow; i >= startRow; i--) { var isEmptyRow = true; for (var j = 1; j <= lastCol; j++) { var cellValue = sheet.Cells(i, j).Value(); if (cellValue !== null && cellValue !== undefined && String(cellValue).trim() !== "") { isEmptyRow = false; break; } } if (isEmptyRow) { sheet.Rows(i).Delete(); emptyCount++; } } // 第二步:按指定列联合去重 var newLastRow = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var seen = {}; for (var i = newLastRow; i >= startRow; i--) { // 如果想按单列去重,可以只读取一列的数据,例如只读手机号列 var name = sheet.Cells(i, 1).Value(); var phone = sheet.Cells(i, 2).Value(); var course = sheet.Cells(i, 3).Value(); var key = String(name) + "|" + String(phone) + "|" + String(course); if (seen[key]) { sheet.Rows(i).Delete(); duplicateCount++; } else { seen[key] = true; } } MsgBox("删除空行:" + emptyCount + " 行,删除重复行:" + duplicateCount + " 行"); }这段代码相对于前一版的变化:
- 使用
sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row动态获取最后行。 - 使用
sheet.Cells(1, sheet.Columns.Count).End(xlToLeft).Column动态获取最后列。 - 删除空行和重复行之后,重新计算最新最后行号。
End(xlUp)和End(xlToLeft)是表格对象模型中常用的定位方法,分别表示从底部向上、从右侧向左找边界。利用它们可以避免写死数据范围。
4.5 运行与验证步骤
4.5.1 打开宏编辑器
在 WPS 表格中点击“开发工具”选项卡,找到“JSA 宏编辑器”并点击。如果之前没有用过 JSA,编辑器会打开一个新窗口。
4.5.2 新建模块并粘贴代码
在 JSA 宏编辑器的左侧工程管理器中,找到当前工作簿对应的工程,右键点击“模块”或“插入模块”,新建一个空白模块。然后把上面“优化版”代码复制进去。
同时,需要把函数名改成方便识别的名字,比如删除重复值和空值_优化版,记得保存。
4.5.3 运行宏
回到宏编辑器工具栏,点击“运行”按钮,或者在代码中把光标放在函数内部,直接点击运行当前过程。这时 WPS 表格会自动执行代码。
运行完成后,会弹出一个消息框,显示删除的空行数量和重复行数量。
4.5.4 验证结果
运行后再看“客户报名表”,理想状态下剩余数据应该是:
| 姓名 | 手机号 | 报名课程 |
|---|---|---|
| 张三 | 13800000001 | Python 基础 |
| 李四 | 13800000002 | Java 入门 |
| 王五 | 13800000003 | 数据分析 |
| 赵六 | 13800000004 | 自动化办公 |
| 孙七 | 13800000005 | 爬虫实战 |
如果表格数据与预期不符,可以按第 5 节中的排查方法处理。
4.6 Python 处理相同需求的对比方案
有些读者可能更习惯用 Python 处理表格,这里额外提供一个使用 pandas 和 openpyxl 的对比脚本,方便大家理解两种方式的差异。
文件路径:scripts/clean_data.py
import pandas as pd # 读取 Excel 文件 df = pd.read_excel("客户报名表.xlsx", engine="openpyxl") # 记录原始行数 original_count = len(df) # 删除整行全为空的行 df = df.dropna(how="all") # 删除重复行,保留第一次出现的行 df = df.drop_duplicates() # 统计删除数量 removed_count = original_count - len(df) print(f"共删除 {removed_count} 行") print(df)这个脚本在逻辑上与 JSA 宏一致:先删除全空行,再删除重复行。如果你的环境里有 Python,也可以用这个方式快速验证数据清洗逻辑是否正确,然后再把结论对应到 JSA 代码中。
5. 常见问题与排查思路
5.1 JSA 宏运行时提示“缺少对象”或“未找到成员”
问题现象:点击运行宏后,WPS 弹出类似“对象不支持此属性或方法”的报错。
常见原因:
- 当前 WPS 版本对某些 JSA API 支持不完整。
- 使用了 VBA 的枚举名,但 JSA 环境中枚举名不同。
- 代码中引用了不存在的属性,比如
Rows.Count写了小写但实际对象不支持。
解决思路:
- 先确认代码中
xlUp在当前 WPS-JSA 版本中是否可用。某些版本需要写成xlToUp或使用数字-4162。 - 改用
sheet.UsedRange.Row + sheet.UsedRange.Rows.Count - 1来获取最后一行。 - 在报错行附近加
MsgBox输出临时变量,定位具体哪一行报错。
5.2 去重没有生效,重复行还在
问题现象:运行宏后,重复数据没有被删除,或者只删除了一部分。
常见原因:
- 单元格中包含肉眼不可见的空格,导致两个数据看似相同,实际字符串不同。
- 去重 key 拼接时,空值变成了
"null"或"undefined"字符串,导致不同空值行被当成不同行。 - 数据区域实际包含格式或公式残留,
Value()读取的不是预期内容。
解决思路:
- 在拼接 key 之前,统一对单元格值做
String(value).trim()清洗。 - 对空值单独处理,比如空值统一转成
"空"再拼接。 - 先用
MsgBox输出每一行的 key,观察是否出现假差异。
5.3 空行没有被删除
问题现象:整行全为空的行仍然保留在表格中。
常见原因:
- 空格字符被当作有效内容。
- 单元格存在返回空字符串的公式。
- 遍历范围不包含空行所在区域。
解决思路:
- 在判断空行时使用
String(cellValue).trim() === ""作为空值判断条件。 - 检查
lastRow是否通过End(xlUp)正确获取。如果表格中最后一行的数据本身是空行,End(xlUp)可能无法跳到正确位置。 - 可以先用
MsgBox输出lastRow和lastCol的值,确认范围没有问题。
5.4 误删了标题行
问题现象:运行宏后,第一行标题也不见了。
常见原因:
startRow设置为 1,导致标题行也被纳入判断范围。- 标题行本身内容较少,在某种判断逻辑下被当成空行删除。
解决思路:
- 在代码中明确
var startRow = 2;。 - 如果标题不在第一行,根据实际位置调整
startRow。 - 删除前先备份当前工作表数据,或复制一份工作表再测试。
5.5 WorkBuddy 上下文用量满了怎么办
问题现象:长时间使用 WorkBuddy 对话窗口后,提示上下文用量已满,无法继续追问。
常见原因:单向对话窗口积累了大量历史消息,达到模型上下文长度限制。
解决思路:
- 新建一个对话窗口,重新描述需求并把核心指令粘贴进去。
- 在生成稳定代码后,及时把关键代码复制到本地文件。
- 不要在一个窗口里反复测试多个无关需求,尽量保持对话专一。
这个问题的处理思路和日常 IM 工具清空聊天记录类似,属于正常使用约束,不影响已生成的代码结果。
5.6 错误现象与排查汇总
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 宏无法运行 | JSA 环境不支持某些 API | 换用 UsedRange 获取数据范围 |
| 重复行删除不干净 | 单元格包含不可见空格 | 统一 trim 后再判断 |
| 空行删除后数据错乱 | 遍历顺序不对 | 改为从下往上遍历 |
| 标题行被误删 | startRow 设置错误 | 显式指定 startRow=2 |
| 弹窗提示删除 0 行 | lastRow 获取错误 | 检查 End(xlUp) 的用法 |
| WorkBuddy 对话中断 | 上下文达到上限 | 新建会话并精简指令 |
| 数据区域包含合并单元格 | 合并单元格取值异常 | 先取消合并再处理 |
6. 最佳实践与工程建议
6.1 数据清洗前必须备份
不管是使用 JSA 宏还是 Python 脚本,只要涉及删除行,第一步永远是备份。建议在运行宏之前,先右键点击工作表标签,选择“移动或复制”,勾选“建立副本”,生成一个备份工作表。也可以在代码中先用Copy方法复制当前表。
数据删除是不可逆的操作,一旦误删,越早发现越容易恢复。备份是成本最低的安全措施。
6.2 需求描述要具体化
使用 WorkBuddy 生成代码时,自然语言描述的颗粒度直接决定代码质量。建议在描述中包含:
- 工作表名称。
- 数据区域或列范围。
- 标题行位置。
- 空行的判定标准(整行空还是某列为空)。
- 去重字段。
- 是否保留第一次出现的行。
- 是否弹窗提示。
比如:
请生成 WPS-JSA 宏,对 Sheet1 中 A1:D100 区域操作, 第一行是标题,从最后一行向上遍历, 删除整行全为空的行,再根据 B 列手机号去重, 保留首次出现的行,弹窗提示删除数量。这样一条指令已经接近完整的需求文档,生成的代码大概率可以直接使用。
6.3 先用小数据集验证
在真实生产数据上运行宏之前,应当先用少量测试数据验证逻辑。比如专门准备一份只有 5 到 10 行的小表格,其中包含重复行、空行、标题行,运行后确认结果正确,再对完整数据执行。
这样做的原因很简单:小数据量便于肉眼核对,一旦逻辑有误能快速发现,而不会在几百行数据中找问题。
6.4 避免硬编码数据范围
虽然本文示例中写死了lastRow = 9,但实际项目中更推荐使用动态获取:
var lastRow = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row; var lastCol = sheet.Cells(1, sheet.Columns.Count).End(xlToLeft).Column;动态获取范围的好处是,当数据量每天变化时,不需要手动修改代码。这也是工程化脚本的基本要求。
6.5 不要过度依赖 AI 生成代码
“靠嘴编程”能提高效率,但不代表不需要理解代码逻辑。至少应该掌握几个基础概念:
- 如何获取单元格的值。
- 如何遍历行。
- 如何删除一行。
- 如何拼接字符串作为去重 key。
- 如何弹窗提示。
当你能够看懂生成代码、判断逻辑是否符合预期时,才能高效地使用类似 WorkBuddy 的工具。否则一旦代码出错,排查成本反而更高。
6.6 宏运行权限与安全提示
JSA 宏和 VBA 宏一样,属于可执行代码。运行来源不明的宏存在安全风险。在实际办公环境中,应当:
- 只运行自己编写或可信来源提供的宏。
- 运行前检查代码是否包含删除文件、修改系统设置、访问网络等危险操作。
- 在测试环境验证通过后再用于生产数据。
- 重要文档启用备份机制。
特别提醒:不要随意运行网上陌生人分享的宏代码,更不要在未确认代码内容的情况下执行涉及数据库、系统配置文件或隐私数据的脚本。
6.7 性能优化思路
如果表格数据量很大,比如几万行,遍历每一行并逐个删除会导致运行较慢。JSA 中可以考虑:
- 先把符合删除条件的行号收集起来,再统一删除,减少 Delete 调用次数。
- 使用更高效的批量区域操作。
- 先在内存中构建数据数组,处理完再写回工作表。
例如先收集要删除的行号:
var rowsToDelete = []; for (var i = lastRow; i >= startRow; i--) { if (isEmptyRow) { rowsToDelete.push(i); } } for (var k = 0; k < rowsToDelete.length; k++) { sheet.Rows(rowsToDelete[k]).Delete(); }不过批量删除时要注意行号变化影响,通常推荐从后往前删除,或者一次性构建多个不连续区域删除。
7. 总结与后续学习方向
通过一个“删除重复值和空值”的完整实例,可以看出 WorkBuddy 与 WPS-JSA 的结合点很清晰:WorkBuddy 负责把中文需求转换成可执行的宏代码,WPS-JSA 负责在表格环境中执行这些代码。整个过程中,最关键的并不是 AI 有多强大,而是你能否把需求描述得足够精确,以及能否在生成代码后做基本校验。
本文的核心要点可以归纳为以下几点:
- 删除空值时,建议从下往上遍历,避免行号变化造成漏删。
- 删除重复值时,要明确去重字段,并注意空格和空值造成的假差异。
- 使用
End(xlUp)和End(xlToLeft)动态获取数据范围,避免硬编码。 - WorkBuddy 生成代码后,最好在小数据集上测试一次。
- 宏运行前必须备份数据。
接下来可以继续学习的方向包括:
- WPS-JSA 中
UsedRange、Range、Cells等对象的更多用法。 - 使用 JSA 实现多表合并、数据拆分、条件格式等办公自动化任务。
- WorkBuddy 生成 Python 脚本,用 pandas 做更复杂的数据清洗。
- 了解 WPS 表格与外部数据源(数据库、接口)之间如何通过宏或脚本打通。
最后建议你动手试一下:先建一张包含重复值和空值的测试表,再用 WorkBuddy 生成宏代码,运行后核对结果。只有亲手跑通一次,才能理解“靠嘴编程”的边界在哪里,也才能把这类工具真正用到日常工作中。数据清洗看起来是一个小功能,但把它自动化之后,省下来的时间会比你想象的更多。