做了快八年的Office文档自动化我几乎每天都要和Word打交道。很多人一听VBA就觉得是“老古董”可真遇到三百份文档要统一格式、几十个表格要提取数据、几十个文件要转PDF的时候VBA反而是最可靠的工具。这篇东西不是给你讲理论而是把我这几年一直在用的常用Word VBA宏整理出来从环境准备、格式批量处理到内容提取、文档合并、PDF导出再到长文档的目录和编号最后是报错排查。不管你是行政、编辑、助理还是需要处理招投标文件的工程师只要会复制粘贴就能把这套东西搬到自己电脑上跑起来。先说一句大实话Word VBA宏没有想象中那么难。它本质上就是帮你在Word里“模拟手动操作”但速度比人手快几十倍而且完全一致。下面每一段我都会附上能直接用的代码以及为什么这么写的解释。1. 先别急着写代码宏的启用环境和工具准备1.1 Word宏到底能做什么VBA宏可以理解为“给Word写的按键脚本”但比脚本更底层能直接操作文档对象。说白了凡是你在Word里能手动做的重复操作它几乎都能自动化修改字体字号、统一段落缩进、批量替换、插入表格、导出PDF、合并文档、提取内容。我常用的场景包括把几十份项目汇报的标题格式、正文字体统一成同一种风格把文档里连续多个空行和多余空格一键清掉把插图全部调成统一的宽度和居中从多张Word表格里批量抓数据到Excel把选中的一批Word文档批量导出成PDF长文档写完后一句话更新全文章节编号、目录页码和交叉引用。这些活儿如果靠手工点轻则十几分钟重则一下午。用宏往往是几秒钟到一两分钟的事。最实用的VBA不一定复杂反而是一个宏只解决一个问题的小工具最好维护。1.2 打开宏开发工具的两分钟设置很多人没写过宏不是因为难而是因为平时根本找不到入口。要开始用宏先把“开发工具”选项卡调出来打开Word点击左上角“文件”进入“选项”在“自定义功能区”右侧的主选项卡里勾选“开发工具”确定后顶部菜单栏会出现“开发工具”。快捷键也要记住Alt F11是打开VBA编辑器Alt F8是查看/运行宏列表。我日常基本都是用快捷键很少去点“开发工具”。进入VBA编辑器后在左侧工程资源管理器中找到当前文档右键“插入” - “模块”把代码粘贴进去。模块里可以放多个Sub过程每个过程对应一个宏。写完按F5可以直接运行或者关掉编辑器回到Word里用Alt F8调出宏列表运行。1.3 宏的存储位置怎么选新手最容易踩的第一个坑写完宏保存文档下次打开发现宏没了。原因是普通Word文档的.docx格式不支持宏宏必须保存成.docm或.dotm格式。还有一个更常见的做法把宏保存在Normal模板Normal.dotm里。只要养成习惯写完宏以后右键模块选择“导出模块”再打开Normal.dotm把模块导进去所有基于这个模板的新文档就都能用了。注意一点保存在Normal.dotm里的宏对所有文档生效所以要谨慎别放太多测试代码启动Word时容易被拖慢。如果宏只服务于某一份具体文档比如某个标书的排版宏我建议直接保存在当前文档另存为.docm如果宏要长期用、到处用就放进Normal.dotm。1.4 安全设置与宏签名Word默认会禁用带宏的文件这本身是好事。自用宏没必要为了省事把所有宏安全性调到最低。正确做法是“文件” - “选项” - “信任中心” - “信任中心设置”在“宏设置”里选择“禁用所有宏并发出通知”把你自己的宏文件夹加进“受信任位置”这样放在该文件夹里的文档打开时就不会被反复弹窗拦截。如果公司内部有统一的宏模板最理想的方式是给宏做数字签名配合“信任对VBA工程对象模型的访问”一起使用。签名这块不展开个人使用场景下受信任位置已经够用了。从安全角度看从网上下载别人写好的宏必须先看代码。看明白每行在干什么再放到自己文档里执行。我自己的习惯是凡是涉及删除、替换、全文档改动的宏第一次执行前一定先备份。后面第五部分会专门说备份宏怎么写。2. 真正高频的几类常用宏格式统一与批量处理2.1 一键统一中文字体、字号和行距先说一个真实场景某单位要求所有汇报文档统一为“正文宋体小四、西文Times New Roman、1.5倍行距、首行缩进2字符”。如果一个一个段落改等改完眼睛都花了。用宏可以一次性扫描全部段落。Sub SetBodyFormat() Application.ScreenUpdating False Dim p As Paragraph For Each p In ActiveDocument.Paragraphs With p.Range 跳过标题样式的段落避免把大标题也改成正文 If .Style.NameLocal 标题 1 And _ .Style.NameLocal 标题 2 And _ .Style.NameLocal 标题 3 And _ .Style.NameLocal 题注 Then .Font.NameFarEast 宋体 .Font.NameAscii Times New Roman .Font.Size 12 If Not .Information(wdWithInTable) Then .ParagraphFormat.FirstLineIndent CentimetersToPoints(0.74) .ParagraphFormat.LineSpacingRule wdLineSpace1pt5 End If End If End With Next Application.ScreenUpdating True MsgBox 正文格式已统一 End Sub这段代码里有两个值得注意的地方。第一Application.ScreenUpdating False是宏提速的关键关闭屏幕刷新后Word不会每改一个段落就重绘一次界面。第二我加了一个“跳过标题样式”的判断否则宏会把所有标题也变小四宋体那就乱套了。FirstLineIndent CentimetersToPoints(0.74)约等于2字符缩进。如果你的文档是五号字可以改成0.85厘米左右小四对应0.85厘米更合适。实际用的时候先复制到小文档上试跑看效果再调参数。2.2 一键清除多余空行和多余空格长篇文档从网页或PDF复制过来常伴有一堆连续空行和半角空格。手工删除非常痛苦而且很难删干净。用Word查找替换的“通配符”功能VBA可以精确匹配连续多个段落标记。Sub CleanExtraBlanks() Application.ScreenUpdating False 把连续2个及以上的段落标记替换成1个 With ActiveDocument.Content.Find .ClearFormatting .Replacement.ClearFormatting .Text ^13{2,} .Replacement.Text ^13 .MatchWildcards True .Execute Replace:wdReplaceAll End With 把连续2个半角空格替换成1个最多循环10次防止极端情况卡死 Dim i As Integer For i 1 To 10 With ActiveDocument.Content.Find .ClearFormatting .Replacement.ClearFormatting .Text .Replacement.Text .MatchWildcards False .Execute Replace:wdReplaceAll End With Next i Application.ScreenUpdating True MsgBox 清理完成 End Sub这里要特别提醒全角空格和制表符不在这个宏的处理范围内。全角空格一般是中文输入法产生的“ ”想清理的话需要单独查找字符代码或者先在Word里手动替换。制表符是^t如果你要保留代码缩进或ASCII对齐的文本千万不要盲目清理空格。还有一点如果你的文档是诗歌、代码示例或故意用连续空行分区的这个宏会改变排版结构用之前一定先备份。2.3 批量统一图片尺寸并居中图片大小不一是Word排版里最难看的问题之一。尤其是直接从截图工具粘贴的图片有的宽有的窄。下面这个宏会把所有“嵌入式图片”统一成14厘米宽、9厘米高并让所在段落居中对齐。Sub NormalizeInlineImages() Application.ScreenUpdating False Dim shp As InlineShape For Each shp In ActiveDocument.InlineShapes If shp.Type wdInlineShapePicture Then shp.LockAspectRatio msoFalse shp.Width CentimetersToPoints(14) shp.Height CentimetersToPoints(9) End If Next Application.ScreenUpdating True MsgBox 图片尺寸已统一 End Sub需要注意LockAspectRatio msoFalse的意思是允许不等比缩放。如果你希望保持图片比例只想统一宽度那就设置shp.Width CentimetersToPoints(14)并把LockAspectRatio设为msoTrue高度会自动按原比例计算。这个宏只处理InlineShape也就是嵌入在文字行里的图片。如果图片是浮动在文字上方的Shape需要另外遍历ActiveDocument.Shapes那部分逻辑要根据文档具体情况来调整。2.4 表格宽度和边框快速统一表格在Word里也是排版重灾区。不同来源的表格宽度不一有的超过页面边界。用下面这个宏可以把文档里所有表格的总宽度统一为16厘米并居中显示。Sub StandardizeTables() Application.ScreenUpdating False Dim t As Table For Each t In ActiveDocument.Tables t.PreferredWidthType wdPreferredWidthPoints t.PreferredWidth CentimetersToPoints(16) t.Rows.Alignment wdAlignRowCenter Next Application.ScreenUpdating True End SubwdPreferredWidthPoints表示用固定点数磅值来设置表格宽度而不是按页面百分比。16厘米对于A4纸默认页边距来说是比较宽但不会溢出的值如果页边距很大需要先算出可用宽度。公式很简单表格可用宽度 纸张宽度 - 左边距 - 右边距。A4纸宽度21厘米左右边距各2.5厘米时可用宽度就是16厘米所以上面写16。这个宏不会自动保证每一列宽度均匀。如果想把各列宽度均分可以对每一列单独设置Column.Width。但“均分”在很多文档里并不合适因为有些列是备注有些列是数据均分反而难看。所以我的做法是先统一表格总宽再按内容情况手动微调列宽。2.5 批量重排把图片和表格都强制靠上还有一个小而实用的宏让所有段落以图片或表格开头的段落都去掉首行缩进。因为Word表格和图片如果套用了“正文”样式也会跟着首行缩进2字符导致图片或表格前面出现多余空白。Sub RemoveIndentBeforeObjects() Application.ScreenUpdating False Dim p As Paragraph For Each p In ActiveDocument.Paragraphs If p.Range.Information(wdWithInTable) False Then If p.Range.InlineShapes.Count 0 Then p.Range.ParagraphFormat.FirstLineIndent 0 End If End If Next Application.ScreenUpdating True End Sub但要注意如果段落里既有文字又有图片这个宏会把整段的首行缩进去掉。实际使用中最好限定为“段落第一个字符就是图片”的情况。更稳妥的方案是不用代码判断而是建议在调整格式时先跑“正文格式统一”再跑这个“去缩进”宏顺序不能反。3. 进阶一点内容提取、文档合并和自动化导出3.1 按关键词批量导出段落有一次我接到一个任务从一份三百多页的合同里把所有出现“违约责任”的段落全部整理出来。手工翻页太费劲用宏在十几秒内就解决了。原理很简单遍历文档的每个段落判断段落文本里是否包含关键词如果包含就把这段复制到一个新建文档里。Sub ExportParagraphsByKeyword() Dim kw As String kw InputBox(请输入要提取的关键词, 批量提取段落, ) If kw Then Exit Sub Dim destDoc As Document Set destDoc Documents.Add Dim rng As Range Set rng destDoc.Content rng.Collapse wdCollapseEnd Dim p As Paragraph For Each p In ActiveDocument.Paragraphs If InStr(p.Range.Text, kw) 0 Then rng.InsertAfter p.Range.Text vbCr rng.Collapse wdCollapseEnd End If Next MsgBox 提取完成 End Sub这个宏的判定很“笨”只要段落中出现关键词就整段复制。如果段落里恰好引用到了这个词但并不是你要找的内容会一并提取。真正高效的版本可以让用户选择关键词是否需要区分大小写、是否整词匹配但实际办公场景下“出现关键词就提取”已经能解决八成需求。如果你需要提取表格里的单元格文本这个宏不适用因为段落遍历会把每个单元格里的段落也算进来提取结果会很碎。遇到表格提取用下面3.4的Excel导出方案更合适。3.2 批量合并多个Word文档合并文档是招投标、制度汇编里的高频需求。很多人喜欢用复制粘贴但遇到几百页文件时粘贴会导致样式串位、编号错乱。用VBA的InsertFile方法可以直接把一个文件作为内容插入到另一个Word文档中不会经过剪贴板字体兼容性更好。Sub MergeSelectedDocuments() Dim dlg As FileDialog Set dlg Application.FileDialog(msoFileDialogFilePicker) dlg.AllowMultiSelect True If dlg.Show -1 Then Dim i As Long For i 1 To dlg.SelectedItems.Count Dim srcDoc As Document Set srcDoc Documents.Open(dlg.SelectedItems(i), ReadOnly:True, Visible:False) Dim rng As Range Set rng ActiveDocument.Content rng.Collapse wdCollapseEnd 第2个文件开始先插入一个分节符保证新文件从头开始 If i 1 Then rng.InsertBreak Type:wdSectionBreakNextPage Set rng ActiveDocument.Content rng.Collapse wdCollapseEnd End If rng.InsertFile FileName:dlg.SelectedItems(i) srcDoc.Close False Next MsgBox 合并完成 End If End Sub使用前目标文档必须已经打开并且最好先另存为一个空白新文档。这个宏不会自动帮你处理文档开头多余的空行合并后可能需要把文档开头清理一下。另外每个源文档的样式定义如果互相冲突Word会自动加上“样式名_”之类的后缀这是正常现象不用害怕。3.3 批量把Word转成PDFWord自带的“另存为PDF”只能一次处理一个文件。想批量转换时可以用宏遍历多个文件。Sub ExportSelectedToPdf() Dim dlg As FileDialog Set dlg Application.FileDialog(msoFileDialogFilePicker) dlg.AllowMultiSelect True If dlg.Show -1 Then Dim i As Long For i 1 To dlg.SelectedItems.Count Dim doc As Document Set doc Documents.Open(dlg.SelectedItems(i), ReadOnly:True, Visible:False) Dim outPath As String outPath Left(dlg.SelectedItems(i), InStrRev(dlg.SelectedItems(i), .)) pdf doc.ExportAsFixedFormat OutputFileName:outPath, ExportFormat:wdExportFormatPDF doc.Close False Next MsgBox 导出完成 End If End SubInStrRev(文件路径, .)是从右边找最后一个点号的位置这样无论文件名里有多少个点都能正确替换扩展名。ExportAsFixedFormat是Word给PDF导出准备的专用方法比SaveAs2 FileFormat:17更稳定而且能保留书签和超链接。实际导出时有一个隐蔽问题如果源文件名是带中文或空格的个别旧版本Word可能报错。遇到这种情况先确认Office更新到最新版或者把文档先复制到一个纯英文路径下再转属于最省事的绕法。3.4 从Word表格批量提取到ExcelWord里的表格要汇总到Excel时最痛苦的是多张表格式不完全一致。如果只是把所有表格按“行”堆到Excel里下面这个宏可以直接生成一张新Excel活页簿。Sub ExtractTablesToExcel() Dim xlApp As Object Dim xlBook As Object Dim xlSheet As Object Set xlApp CreateObject(Excel.Application) xlApp.Visible False Set xlBook xlApp.Workbooks.Add Set xlSheet xlBook.Sheets(1) Dim t As Table Dim r As Row Dim c As Cell Dim i As Long Dim j As Long i 1 For Each t In ActiveDocument.Tables For Each r In t.Rows j 1 For Each c In r.Cells xlSheet.Cells(i, j).Value CleanCellText(c) j j 1 Next c i i 1 Next r Next t Dim savePath As String savePath ActiveDocument.Path \表格提取_ Format(Now, yyyymmdd_hhmmss) .xlsx xlBook.SaveAs savePath, 51 51 表示 xlsx 格式 xlBook.Close False xlApp.Quit Set xlApp Nothing MsgBox 已保存到 savePath End Sub Function CleanCellText(c As Cell) As String Dim s As String s c.Range.Text 单元格范围末尾会带单元格结束符和段落标记需要去掉 s Left(s, Len(s) - 2) s Replace(s, Chr(13), ) CleanCellText s End Function这段代码用了CreateObject(Excel.Application)晚期绑定好处是不需要预先勾选Excel对象库引用换电脑也能跑。坏处是写代码时没有自动提示但对复制粘贴的用法来说完全够用。要注意的是如果单元格里有嵌套表格c.Range.Text会把嵌套表格的内容也带上提取结果可能会乱。现实世界中遇到合并单元格多的表提取出来的行列位置会和Word里看起来不一样这是Word表格模型决定的只能提取后人工微调。3.5 自动生成页眉、页脚和页码长文档的页眉页脚最忌讳手工一页页改。用宏可以快速给当前文档的所有节设置页眉和页码。Sub InsertHeaderFooter() Dim sec As Section Set sec ActiveDocument.Sections(1) 页眉统一文本并居中 sec.Headers(wdHeaderFooterPrimary).Range.Text 内部资料 请勿外传 sec.Headers(wdHeaderFooterPrimary).Range.ParagraphFormat.Alignment wdAlignParagraphCenter sec.Headers(wdHeaderFooterPrimary).Range.Font.Size 9 页脚居中页码 sec.Footers(wdHeaderFooterPrimary).PageNumbers.Add PageNumberAlignment:wdAlignPageNumberCenter sec.Footers(wdHeaderFooterPrimary).Range.Font.Size 9 ActiveDocument.Repaginate MsgBox 页眉页脚已添加 End Sub页眉页脚是“节”的属性不是“文档内容”的属性。如果文档已经分了节只设置Sections(1)不会影响后面的节。需要全部节统一时就遍历所有Section对象。另外如果你要设置“首页不同”或者“奇偶页不同”先要在页面设置里打开对应开关再去改wdHeaderFooterFirstPage和wdHeaderFooterEvenPages的页眉页脚对象。4. 用VBA处理长文档目录、编号和交叉引用的坑4.1 自动更新目录和所有域写长文档时最让人头疼的是目录页码不对、交叉引用不变。其实这些都是“域”在作怪。目录和一交互引用本质是域打印前需要更新。手工方式是按F9宏可以实现一键全更。Sub UpdateAllFieldsAndToc() Application.ScreenUpdating False 更新文档中的所有域 ActiveDocument.Fields.Update 更新每个目录对象 Dim toc As TableOfContents For Each toc In ActiveDocument.TablesOfContents toc.Update Next ActiveDocument.Repaginate Application.ScreenUpdating True MsgBox 目录、页码、交叉引用已全部更新 End Sub这个宏里ActiveDocument.Fields.Update会把整篇文档的所有域更新一遍包括页码域、交叉引用域、公式域等。ActiveDocument.Repaginate是强制Word重新分页确保页码变化后页数统计准确。有一点经验要说如果文档里有大量域全量更新可能会卡几秒到几十秒这是正常的。真正危险的是域代码格式被破坏时更新可能把内容变成类似“!未定义书签”的提示。遇到这种提示先检查书签和标题样式而不是反复运行更新宏。4.2 多级列表编号错乱的一个稳妥补丁多级列表编号错乱是Word长文档的经典难题。我见过最典型的情况是第3章标题编号显示“3.1”但第4章开头却从“2.1”重新开始或者编号跳到“4.2.1”。这类问题用宏很难做到“一键修好”因为根因往往是手打编号和自动编号混用。如果文档里的标题编号是手打的数字“1、2、3”加空格或Tab那么即使用宏更新域也没用。最稳妥的修复顺序是把所有标题段里的手打编号和Tab制表符清理干净重新给这些段落套用“标题 1”“标题 2”样式在“定义新的多级列表”里把级别关联到对应标题样式最后运行一次4.1的更新宏。如果只想用代码做保守修复可以让所有标题段落重新应用一次同名样式这个操作会触发Word重新计算编号规则Sub ReapplyHeadingStyles() Application.ScreenUpdating False Dim p As Paragraph For Each p In ActiveDocument.Paragraphs Dim styleName As String styleName p.Style.NameLocal If Left(styleName, 2) 标题 Or Left(styleName, 7) Heading Then p.Range.Style ActiveDocument.Styles(styleName) End If Next Application.ScreenUpdating True End Sub注意这个宏只是“重新应用样式”不能修复手打编号。运行前更要备份因为如果样式套用错误有可能导致整段文本的格式变化。4.3 交叉引用批量更新的细节交叉引用在Word里是特殊的域插入后不会自动变化。比如你在第2章写了“详见第5章”之后第5章变成了第6章交叉引用里还显示“第5章”需要更新域。4.1的宏已经能处理交叉引用更新。但如果只想更新交叉引用而不想动其他域可以遍历字段中的类型代码。交叉引用的域代码通常是REF开头对应的Field.Type是wdFieldRef。Sub UpdateRefFieldsOnly() Dim f As Field For Each f In ActiveDocument.Fields If f.Type wdFieldRef Then f.Update End If Next End SubwdFieldRef是Word内置的交叉引用域类型。写这个宏时要注意如果文档中有书签被删除交叉引用会失效f.Update不会报错但显示文本可能会变成空或错误信息。排查时打开域代码视图Alt F9能看清到底引用了哪个书签。4.4 文档瘦身和打开提速的常见操作长文档越来越卡很多是批注、修订记录、残留空段落和裁剪掉的图片在作怪。宏可以帮你清掉一部分“可见垃圾”。Sub RemoveAllCommentsAndRevisions() 删除所有批注 Dim i As Long For i ActiveDocument.Comments.Count To 1 Step -1 ActiveDocument.Comments(i).Delete Next 关闭修订并接受所有修订慎用会改变正文内容 If ActiveDocument.TrackRevisions Then ActiveDocument.TrackRevisions False End If MsgBox 批注已删除修订已接受 End Sub删除所有修订的处理是破坏性操作如果只是想提速不建议直接接受所有修订。更安全的做法是先把文档另存一份再执行清理。另外文档变大最常见的原因是插入了大量原尺寸图片。VBA里直接压缩图片比较复杂我的经验是优先在插入前压缩图片已经插入的可以全选图片后用Word自带的“压缩图片”功能统一处理。5. 常见问题排查与宏的防错处理5.1 运行时提示“找不到对象或方法”这个报错通常是因为对象不存在或调用了某个版本不支持的方法。比如你在低版本Word里用了ExportAsFixedFormat可能就不支持。判断方法很简单进入VBA编辑器后光标停在报错那一行按F1查帮助确认当前版本是否存在这个方法。另一个常见情况是代码写的是Docment而不是Document少写一个字母。如果是复制粘贴的宏第一件事检查关键字拼写。5.2 宏被禁或者弹“此宏已被禁用”这和Word信任中心设置有关。把宏文件所在的文件夹加入“受信任位置”后重新打开文档即可。强烈不建议把安全设置改为“启用所有宏”。万一宏是从网络上下载的里面嵌入一段病毒代码那后果比加班排版严重多了。5.3 宏运行慢关闭屏幕刷新还不够很多人只在循环前加了一句Application.ScreenUpdating False但遇到几百个表格或几千个段落时还是慢。这时候还可以把文档切换到草稿视图减少界面重排减少Find操作的次数尽量用一次通配符替换代替循环循环过程中不要用Selection改用Range对象Selection每移动一次光标都要触发界面更新。Selection是很多新手喜欢用的对象因为录制宏生成的代码基本都是Selection。但它效率很低。批量文档处理时尽量用ActiveDocument.Content.Find、Paragraph.Range这类对象直接操作不依赖光标位置。5.4 误操作回退难执行宏前自动备份一个负责任的宏应该在修改文档前生成备份。下面这个备份宏非常实用在跑任何高危宏之前先运行一次。Sub BackupCurrentDocument() If ActiveDocument.Path Then MsgBox 文档尚未保存无法备份 Exit Sub End If Dim newPath As String newPath ActiveDocument.Path \备份_ Format(Now, yyyymmdd_hhmmss) _ ActiveDocument.Name ActiveDocument.SaveCopyAs newPath MsgBox 已备份到 newPath End SubFormat(Now, yyyymmdd_hhmmss)会生成类似20250619103015的时间戳保证备份文件不会重名。SaveCopyAs不会改变当前文档的保存状态只是生成一份副本非常安全。我实际执行批量排版宏前一定会先跑这个备份。宁可多存几个备份文件也不要事后到处找“撤销”。尤其是涉及全文替换、批量删除、格式全改的宏一旦执行Word的撤销层级根本救不了你。5.5 常用问题速查表现象大概率原因解决办法运行宏提示“宏已被禁用”信任中心设置拦截把文件目录加入受信任位置保存后宏丢失文件保存成了.docx另存为.docm宏能运行但没有效果当前文档没有对应对象确认文档里确实有图片/表格/目标文本替换全部后格式乱通配符使用不当或匹配范围过大先备份并用小范围测试Selection.Find替换很慢每次替换都触发屏幕刷新用ActiveDocument.Content.Find替代合并文档后样式错乱原文档自带同名样式合并后手动清理样式或统一重排PDF导出失败文档被保护或文件名特殊字符用只读方式打开导出到纯英文路径更新目录后页码仍不对文档未重新分页运行ActiveDocument.Repaginate我在实际使用中体会到Word VBA宏最重要的不是“代码多炫”而是“可靠”。每写一个宏我都会先想它最坏能把文档搞成什么样。格式统一、内容提取、PDF导出这些我几乎天天用自动备份也一直放在了最显眼的位置。建议你也这样先把上面这些宏存成一份.docm模板遇到以前需要重复劳动的场景先想能不能用宏解决。熟练之后你会慢慢看懂Word的“对象模型”那时候就是你去定义办公流程而不是被文档格式牵着走了。