文档起飞 02
让AI帮你写出第一段Word宏
WPS文字也能跑VBA;从批量设置三线表开始,学会调试、保存和复用宏。
插件能解决通用问题,但每个单位都有自己的格式。
同样是"正文",有人要求仿宋、小三、28磅固定值;有人要求宋体、四号、1.5倍行距。标题层级、落款、页码和表格格式,更是各有一套规则。
这类需求最适合做成自己的宏。尤其是一篇材料里有十几张表时,逐张删除边框、设置顶线底线和表头线,规则明确,却非常消耗耐心。而且还涉及字体设置——表头用黑体,数据区用仿宋——人工逐张调整,出错率高得惊人。
本期我们用VBA。国内绝大多数公文模板、老同事的宏和网上的Word教程都以VBA为主,WPS兼容VBA后,直接复用的成本最低。我们从一个能自动识别表头并完成全套格式设置的VBA宏开始。
01|为什么要从VBA入手
WPS文字在较新版本中同时支持VBA和JSA。选择哪条路线,看你的实际场景:
- 接过旧宏、旧模板:选VBA。
单位已有的 .docm、.dotm文件几乎都是VBA。你不需要重写,只需要让AI帮你读懂和修改。 - 从零开始写新工具:两条路都行。
JSA语法更现代,但VBA的生态积累深得多——网上能搜到的三线表、公文排版、批量打印教程,99%是VBA。
不需要精通VBA语法。第一阶段只需要看懂四件事:选中了什么、改了哪些属性、参数放在哪里、什么时候停止运行。
02|给AI的需求,不要只写"帮我排版"
让AI写VBA宏,最容易翻车的不是语法,而是需求没说清。至少交代下面5项:
- 范围:
当前表格、选中的表格,还是活动文档中的全部表格。 - 表格结构:
表头占几行(能否自动识别),是否存在合并单元格、嵌套表格和跨页表格。 - 格式规则:
顶线底线线宽、表头线线宽、颜色;表头用什么字体字号,数据区用什么字体字号;是否允许修改对齐方式、底纹。 - 排除项:
嵌套表格、只有一行的表格、页眉页脚中的表格是否跳过。 - 验收与调试:
表格数量、成功数量、跳过数量、失败数量和错误位置怎样记录;原内容是否完全不变;重复运行会不会叠加效果。
下面的提示词,就严格按这5项逐一说明,并且加入了自动识别表头的逻辑。
03|可以直接复制给AI的提示词
这段提示词覆盖了从表头识别到字体设置的全流程。直接复制给AI即可。
请为WPS文字(VBA)编写一段宏,命名为"全域三线表",把活动文档中的全部表格批量设置为三线表,并自动设置表头和数据区的字体。处理范围:活动文档中的全部表格(包括正文、页眉页脚中的表格);跳过嵌套表格。表格结构识别:1. 自动检测表头行数:遍历前两行,如果某行存在合并单元格(该行Cells.Count小于Columns.Count,或某个Cell.ColumnIndex与列序号不一致),则将该行判定为表头行。2. 如果前两行均未检测到合并单元格,默认表头为1行。3. 如果表总行数≤表头行数,强制表头行数=1。格式规则:1. 先清除表格全部边框(包括顶、底、左、右、横、竖、斜线)。2. 表格顶线:1.5磅(wdLineWidth150pt)黑色单实线。3. 表格底线:1.5磅(wdLineWidth150pt)黑色单实线。4. 表头下方线:0.75磅(wdLineWidth075pt)黑色单实线,作用于表头行及其下一行的顶边框。5. 表头字体:黑体、12磅(小四)、不加粗。6. 数据区字体:仿宋(中文)+ Times New Roman(英文)、12磅(小四)、不加粗。7. 不修改表格行列数量、合并关系、对齐方式和底纹。参数集中管理:把顶线/底线线宽(tbwidth)、中间线宽(midWidth)、颜色(mcolor)放在代码开头,方便按单位要求调整。调试与日志:1. 在立即窗口(Debug.Print)输出每张表的分析过程:表格序号、总行数、列数、每行文本摘要、合并单元格检测结果、最终判定的表头行数。2. 运行结束后弹窗(MsgBox)提示处理完成。验收标准:- 普通表格只保留顶线、表头下线和底线三条线。- 表头行字体变为黑体12磅,数据行字体变为仿宋12磅。- 表格文字、行列数、合并关系、底纹不变。- 重复运行不会叠加线条效果。- 含合并单元格的表头能被正确识别。
04|生成的VBA代码长什么样
把上面的提示词发给AI,你会得到类似下面的代码。我标注了几个关键点,方便你理解和修改。
VBA 代码
Sub 全域三线表()Dim doc As DocumentDim mtable As TableDim i As Long, j As Long, cellID As LongDim nrowHeader As IntegerDim hasMergedCells As BooleanDim currentCell As CellDim rowText As StringDim mcolor As LongDim tbwidth As IntegerDim midWidth As Integer' 【可调参数区】按单位要求修改这三项即可tbwidth = wdLineWidth150pt ' 顶线/底线宽度midWidth = wdLineWidth075pt ' 表头下线宽度mcolor = RGB(0, 0, 0) ' 线条颜色:黑色Set doc = ActiveDocumentFor Each mtable In doc.Tables' ===== 自动检测表头行数 =====Debug.Print "表格分析开始 ================"Debug.Print "表格总行数: " & mtable.Rows.CountDebug.Print "表格列数: " & mtable.Columns.CountnrowHeader = 0For i = 1 To mtable.Rows.CounthasMergedCells = FalserowText = ""' 获取该行文本内容For j = 1 To mtable.Columns.CountOn Error Resume NextSet currentCell = mtable.Cell(i, j)If Err.Number = 0 ThenrowText = rowText & " | " & Trim(Replace(Replace(currentCell.Range.Text, vbCr, ""), vbLf, ""))ElseErr.ClearrowText = rowText & " | [合并单元格]"End IfNext jOn Error GoTo 0Debug.Print "分析第 " & i & " 行: " & Mid(rowText, 4)' 仅在前两行检测合并单元格If i <= 2 Then' 方法1:检查行中单元格数量是否少于列数On Error Resume NextIf mtable.Rows(i).Cells.Count < mtable.Columns.Count ThenhasMergedCells = TrueEnd IfOn Error GoTo 0' 方法2:检查是否存在跨列合并If Not hasMergedCells ThenFor j = 1 To mtable.Columns.Count - 1On Error Resume NextSet currentCell = mtable.Cell(i, j)If Err.Number = 0 ThenIf currentCell.ColumnIndex <> j ThenhasMergedCells = TrueExit ForEnd IfElseErr.ClearhasMergedCells = TrueExit ForEnd IfNext jEnd IfEnd If' 前两行有合并单元格则判定为表头If i <= 2 And hasMergedCells ThennrowHeader = nrowHeader + 1Debug.Print " → 判定为表头行"ElseIf i > 2 ThenDebug.Print " → 判定为数据行"Exit ForElseDebug.Print " → 判定为数据行,停止检测"Exit ForEnd IfNext iIf nrowHeader = 0 ThennrowHeader = 1Debug.Print "! 使用默认表头行数1"End IfDebug.Print "最终判断表头行数: " & nrowHeaderDebug.Print "表格分析结束 ================"' ===== 清除全部边框 =====With mtable.Borders(wdBorderTop).LineStyle = wdLineStyleNone.Borders(wdBorderLeft).LineStyle = wdLineStyleNone.Borders(wdBorderBottom).LineStyle = wdLineStyleNone.Borders(wdBorderRight).LineStyle = wdLineStyleNone.Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone.Borders(wdBorderVertical).LineStyle = wdLineStyleNone.Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone.Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNoneEnd With' ===== 设置字体 =====For Each currentCell In mtable.Range.CellsWith currentCell.Range.FontIf currentCell.RowIndex <= nrowHeader Then.NameFarEast = "黑体".NameAscii = "黑体".Size = 12.Bold = FalseElse.NameFarEast = "仿宋".NameAscii = "Times New Roman".Size = 12.Bold = FalseEnd IfEnd WithNext currentCell' 安全检查:表总行数必须大于表头行数If mtable.Rows.Count <= nrowHeader ThenDebug.Print "表总行数必须大于表头行数!已按照默认值1来设置。"nrowHeader = 1End If' ===== 设置表头下方线 =====For cellID = 1 To mtable.Range.Cells.CountWith mtable.Range.Cells(cellID)If .RowIndex <= nrowHeader + 1 ThenWith .Borders(wdBorderTop).LineStyle = Options.DefaultBorderLineStyle.LineWidth = midWidth.Color = mcolorEnd WithElseIf .RowIndex > nrowHeader + 1 ThenExit ForEnd IfEnd WithNext' ===== 设置顶线和底线 =====With mtable.Borders(wdBorderBottom).LineStyle = Options.DefaultBorderLineStyle.LineWidth = tbwidth.Color = mcolorEnd WithWith mtable.Borders(wdBorderTop).LineStyle = Options.DefaultBorderLineStyle.LineWidth = tbwidth.Color = mcolorEnd WithNext mtableMsgBox "已完成所有表格的三线表格式设置!", vbInformationEnd Sub
关键点说明
- 可调参数区
:代码开头的 tbwidth、midWidth、mcolor三行是唯一需要按单位要求修改的地方。线宽用Word内置常量(如wdLineWidth150pt表示1.5磅),颜色用RGB(R, G, B)。 - 表头识别
:通过两种方法检测合并单元格——方法1比较该行Cells.Count与Columns.Count,方法2逐个检查Cell.ColumnIndex是否与列序号一致。只有前两行参与检测,第三行起自动判定为数据区。 - 字体设置
: NameFarEast设中文字体,NameAscii设英文字体。如果你的公文要求宋体而非仿宋,把"仿宋"改成"宋体"即可。
05|怎么测试才算通过
按 Alt+F11 打开VBA编辑器,粘贴代码,按 F5 运行。 立即窗口(Ctrl+G 打开)查看分析过程,确认表头识别是否正确。 检查结果:
表A:只剩顶线、表头下线和底线;表头为黑体12磅,数据区为仿宋12磅。 表B:合并单元格被正确识别为表头;字体和三线格式正确。 表C:由于只有1行,表头会被强制设为1行——这种边界情况VBA会处理,但结果可能不符合预期,需人工判断是否需要三线表。
再运行一次宏,确认线条没有叠加变粗。 确认单元格文字、行列数和合并关系没有变化。 已关注关注重播 分享 赞
⚠️ 起飞前检查
先在副本中测试,确认无误后再处理正式文档。 不要直接把含敏感内容的正式文档发给在线AI。用测试文档调试好提示词和代码,再在本地运行。 处理公文时,线宽、字体、字号以本单位模板和审核口径为准,不把示例参数当作统一国标。 涉及合同、人员名单和未公开材料时,不上传真实文档给在线AI。 给同事分发宏时,写清运行入口(Alt+F11→F5)、适用版本(WPS+VBA组件)、处理范围和恢复方法(Ctrl+Z或使用文档副本)。
🚀 起飞结论
本期我们用VBA实现了一个完整的"全域三线表"宏:自动识别表头、清除边框、设置三线和字体,一气呵成。
这个宏的核心价值不在于代码行数,而在于参数可调——线宽、颜色、字体都放在代码开头,换一个单位改三行就能用。
下一期,我们来解决"代码写好了,怎么保存和复用"的问题:.docm和.dotm的区别、工程文件的导出导入、以及如何把常用宏做成工具栏按钮——让你的WPS真正变成自己的工具箱。
关注我,下一期继续起飞!
夜雨聆风