乐于分享
好东西不私藏

文档起飞02|让AI帮你写出第一段Word宏

文档起飞02|让AI帮你写出第一段Word宏

文档起飞 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项:

  1. 范围:
     当前表格、选中的表格,还是活动文档中的全部表格。
  2. 表格结构:
     表头占几行(能否自动识别),是否存在合并单元格、嵌套表格和跨页表格。
  3. 格式规则:
     顶线底线线宽、表头线线宽、颜色;表头用什么字体字号,数据区用什么字体字号;是否允许修改对齐方式、底纹。
  4. 排除项:
     嵌套表格、只有一行的表格、页眉页脚中的表格是否跳过。
  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 Document    Dim mtable As Table    Dim i As Long, j As Long, cellID As Long    Dim nrowHeader As Integer    Dim hasMergedCells As Boolean    Dim currentCell As Cell    Dim rowText As String    Dim mcolor As Long    Dim tbwidth As Integer    Dim midWidth As Integer    ' 【可调参数区】按单位要求修改这三项即可    tbwidth = wdLineWidth150pt   ' 顶线/底线宽度    midWidth = wdLineWidth075pt   ' 表头下线宽度    mcolor = RGB(0, 0, 0)        ' 线条颜色:黑色    Set doc = ActiveDocument    For Each mtable In doc.Tables        ' ===== 自动检测表头行数 =====        Debug.Print "表格分析开始 ================"        Debug.Print "表格总行数: " & mtable.Rows.Count        Debug.Print "表格列数: " & mtable.Columns.Count        nrowHeader = 0        For i = 1 To mtable.Rows.Count            hasMergedCells = False            rowText = ""            ' 获取该行文本内容            For j = 1 To mtable.Columns.Count                On Error Resume Next                Set currentCell = mtable.Cell(i, j)                If Err.Number = 0 Then                    rowText = rowText & " | " & Trim(Replace(Replace(currentCell.Range.Text, vbCr, ""), vbLf, ""))                Else                    Err.Clear                    rowText = rowText & " | [合并单元格]"                End If            Next j            On Error GoTo 0            Debug.Print "分析第 " & i & " 行: " & Mid(rowText, 4)            ' 仅在前两行检测合并单元格            If i <= 2 Then                ' 方法1:检查行中单元格数量是否少于列数                On Error Resume Next                If mtable.Rows(i).Cells.Count < mtable.Columns.Count Then                    hasMergedCells = True                End If                On Error GoTo 0                ' 方法2:检查是否存在跨列合并                If Not hasMergedCells Then                    For j = 1 To mtable.Columns.Count - 1                        On Error Resume Next                        Set currentCell = mtable.Cell(i, j)                        If Err.Number = 0 Then                            If currentCell.ColumnIndex <> j Then                                hasMergedCells = True                                Exit For                            End If                        Else                            Err.Clear                            hasMergedCells = True                            Exit For                        End If                    Next j                End If            End If            ' 前两行有合并单元格则判定为表头            If i <= 2 And hasMergedCells Then                nrowHeader = nrowHeader + 1                Debug.Print "  → 判定为表头行"            ElseIf i > 2 Then                Debug.Print "  → 判定为数据行"                Exit For            Else                Debug.Print "  → 判定为数据行,停止检测"                Exit For            End If        Next i        If nrowHeader = 0 Then            nrowHeader = 1            Debug.Print "! 使用默认表头行数1"        End If        Debug.Print "最终判断表头行数: " & nrowHeader        Debug.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 = wdLineStyleNone        End With        ' ===== 设置字体 =====        For Each currentCell In mtable.Range.Cells            With currentCell.Range.Font                If currentCell.RowIndex <= nrowHeader Then                    .NameFarEast = "黑体"                    .NameAscii = "黑体"                    .Size = 12                    .Bold = False                Else                    .NameFarEast = "仿宋"                    .NameAscii = "Times New Roman"                    .Size = 12                    .Bold = False                End If            End With        Next currentCell        ' 安全检查:表总行数必须大于表头行数        If mtable.Rows.Count <= nrowHeader Then            Debug.Print "表总行数必须大于表头行数!已按照默认值1来设置。"            nrowHeader = 1        End If        ' ===== 设置表头下方线 =====        For cellID = 1 To mtable.Range.Cells.Count            With mtable.Range.Cells(cellID)                If .RowIndex <= nrowHeader + 1 Then                    With .Borders(wdBorderTop)                        .LineStyle = Options.DefaultBorderLineStyle                        .LineWidth = midWidth                        .Color = mcolor                    End With                ElseIf .RowIndex > nrowHeader + 1 Then                    Exit For                End If            End With        Next        ' ===== 设置顶线和底线 =====        With mtable.Borders(wdBorderBottom)            .LineStyle = Options.DefaultBorderLineStyle            .LineWidth = tbwidth            .Color = mcolor        End With        With mtable.Borders(wdBorderTop)            .LineStyle = Options.DefaultBorderLineStyle            .LineWidth = tbwidth            .Color = mcolor        End With    Next mtable    MsgBox "已完成所有表格的三线表格式设置!", vbInformationEnd Sub

关键点说明

  • 可调参数区
    :代码开头的tbwidthmidWidthmcolor三行是唯一需要按单位要求修改的地方。线宽用Word内置常量(如wdLineWidth150pt表示1.5磅),颜色用RGB(R, G, B)
  • 表头识别
    :通过两种方法检测合并单元格——方法1比较该行Cells.Count与Columns.Count,方法2逐个检查Cell.ColumnIndex是否与列序号一致。只有前两行参与检测,第三行起自动判定为数据区。
  • 字体设置
    NameFarEast设中文字体,NameAscii设英文字体。如果你的公文要求宋体而非仿宋,把"仿宋"改成"宋体"即可。

05|怎么测试才算通过

  1. 按 Alt+F11 打开VBA编辑器,粘贴代码,按 F5 运行。
  2. 立即窗口(Ctrl+G 打开)查看分析过程,确认表头识别是否正确。
  3. 检查结果:
  • 表A:只剩顶线、表头下线和底线;表头为黑体12磅,数据区为仿宋12磅。
  • 表B:合并单元格被正确识别为表头;字体和三线格式正确。
  • 表C:由于只有1行,表头会被强制设为1行——这种边界情况VBA会处理,但结果可能不符合预期,需人工判断是否需要三线表。
  1. 再运行一次宏,确认线条没有叠加变粗。
  2. 确认单元格文字、行列数和合并关系没有变化。
    已关注
    关注
    重播 分享

⚠️ 起飞前检查

  1. 先在副本中测试,确认无误后再处理正式文档。
  2. 不要直接把含敏感内容的正式文档发给在线AI。用测试文档调试好提示词和代码,再在本地运行。
  3. 处理公文时,线宽、字体、字号以本单位模板和审核口径为准,不把示例参数当作统一国标。
  4. 涉及合同、人员名单和未公开材料时,不上传真实文档给在线AI。
  5. 给同事分发宏时,写清运行入口(Alt+F11→F5)、适用版本(WPS+VBA组件)、处理范围和恢复方法(Ctrl+Z或使用文档副本)。

🚀 起飞结论

本期我们用VBA实现了一个完整的"全域三线表"宏:自动识别表头、清除边框、设置三线和字体,一气呵成。

这个宏的核心价值不在于代码行数,而在于参数可调——线宽、颜色、字体都放在代码开头,换一个单位改三行就能用。

下一期,我们来解决"代码写好了,怎么保存和复用"的问题:.docm.dotm的区别、工程文件的导出导入、以及如何把常用宏做成工具栏按钮——让你的WPS真正变成自己的工具箱。

关注我,下一期继续起飞!