
简介这份PDF教程面向已具备VBA基础、希望深入掌握Office自动化的办公人员与开发者聚焦ExcelVBA与WordVBA第4季内容系统讲解对象、集合、属性与方法等核心概念帮助读者从零散语法走向对文档内容的精细操控。资源包共1个PDF文件约1.92MB内容以图文讲义形式组织便于按章节顺序阅读与对照练习。教程从Application、Documents、Document等对象切入辨析ActiveDocument、ThisDocument与按名访问文档的差异并类比Excel中的ActiveWorkbook与Worksheets随后展开Range与Selection对象说明Range(2,5)的取值规则、Document.Range.Text与ActiveDocument.Content的用途以及激活、复制、剪切、粘贴等常用方法。字符、单词、句子、段落集合与Tables、Columns、Rows、Cells等表格对象亦有涉及配合Font.ColorIndex、Bold等属性示例演示格式批量修改。已有848人学习适合希望编写自定义宏、提升办公效率的读者参考。1. 从“对象、集合、属性、方法”说起WordVBA到底在操控什么很多人第一次打开 Word 的 VBA 编辑器看到满屏的Application、Documents、Range、Selection第一反应是懵的这些词单个都认识连在一起就不知道在说什么。其实你不需要把它当成编程先把它想成一套“办公室的称呼系统”就好。打个比方一家公司里有老板、有部门、有员工。老板是唯一的部门是一批人的组合员工是具体干活的个体。你要让某个人改一份文件得先说清楚“找哪个部门、哪个人、做什么动作”。WordVBA 里的对象就是这些“人或部门”集合就是“一批人”属性是“这个人的特征”比如穿什么颜色的衣服方法是“这个人能做的动作”比如复印、粘贴。搞懂这套称呼你就能用几行代码指挥 Word 干活而不是靠鼠标一下下点。这也是 ExcelVBA 与 WordVBA 教程第 4 季反复强调的底层逻辑集合.对象.属性.方法一条链走到底。2. 对象与集合为什么 Word 要把东西分成“一个”和“一堆”2.1 对象是“一个具体的东西”集合是“装东西的筐”在 VBA 里对象Object指的是一个有明确身份、有特征、能执行动作的实体。比如一份具体的文档、当前选中的一段文字、文档里的第一个段落都是对象。集合Collection则是把同类对象装在一起的容器它本身也是一个对象但它的作用是“管理一批”。用生活场景说一个团队是对象多个团队组成一个“团队集合”。你要找某个团队可以说“第 3 个团队”也可以说“叫某某名字的团队”。集合提供了两种找法按序号索引和按名称。这就是为什么代码里既能写Documents(1)也能写Documents(报告.docx)。这里有个容易翻车的点集合里的序号从 1 开始不是 0。很多写惯了其他语言的人下意识写Documents(0)直接报错。血泪经验是只要看到Count属性就默认“第 1 个到第 Count 个”是合法范围。2.2 Application 是“Word 软件本身”不是文档Application代表整个 Word 应用程序。它管的是软件级别的事当前打开了几个文档、Word 的版本号、窗口高度宽度、默认打印机、最近打开过哪些文件、磁盘还剩多少空间。你可以把它理解成“公司总部”它不直接改某份文件的内容但它知道全局信息。比如Application.Documents.Count返回当前打开了几份文档Application.Version返回 Word 版本号Application.UserName返回当前用户名。这些信息在写自动化脚本时很有用先判断环境再决定干什么。注意一个区别Application.ActiveDocument指的是“当前正在看的那份文档”而Application本身不是文档。初学者常把两者混在一起写出Application.Text这种不存在的写法Word 会直接告诉你“找不到成员”。2.3 Document 与 Documents一份文档和一摞文档Document对象代表一份具体的文档Documents集合代表所有已打开文档的集合。引用当前文档有三种常见写法对应 ExcelVBA 里的工作表引用理解了这个对应关系跨软件迁移就顺了WordVBA 写法含义ExcelVBA 对应写法ActiveDocument当前活动文档ActiveWorkbook/ActiveSheetThisDocument存放 VBA 代码的那份文档ThisWorkbookDocuments(文档名)按名称指定文档Workbooks(工作簿名)ThisDocument和ActiveDocument的区别值得多说一句ThisDocument永远指向“代码住在哪份文档里”哪怕你当前切到别的文档它也不变ActiveDocument则跟着你当前看的那份走。写加载项或模板级代码时用错这两个就会出现“明明点了按钮改的却是另一份文件”的玄学现象。Documents集合常用的方法有四个Add新建文档、Open打开已有文档、Close关闭文档、Save保存集合里的文档。比如Documents.Add就是新建一份空白文档并加入集合Documents.Open c:\1.docx就是打开指定路径的文件。3. Range 与 SelectionWordVBA 里最容易搞混的一对3.1 Range 是“一段位置”Selection 是“你正选着的那块”Range对象代表文档中的一个连续区域它可以是一个字符、一个词、一句话、一个段落也可以是整篇文档。它的核心特征是用起止下标来定位不依赖鼠标。写法是Range(开始下标, 结束下标前一个字符)。举个具体例子。假设文档内容是“跟着教程学VBA第四季”下标从 0 开始数 取从下标 2 开始到下标 5 之前那个字符为止的内容 下标: 0跟 1着 2教 3程 4学 5V 6B 7A ... Range(2,5) 取到的是“教程学”三个字 Set 片段 ActiveDocument.Range(2, 5) MsgBox 片段.Text这里的关键是“结束下标前一个字符”Range(2,5)包含下标 2、3、4不包含 5。这个半开区间规则和很多编程语言切字符串的规则一致但和人的直觉有偏差初学阶段建议每次都在纸上数一遍下标别凭感觉。Range不要求你先用鼠标选中什么它直接按坐标取内容所以适合批量处理遍历所有字符、给数字变颜色、统计段落数都用它。Document.Range.Text返回整篇文档的文本字符串ActiveDocument.Content也能拿到全文内容两者在“取全文”这个场景下效果接近。Selection则代表“当前用户选中的内容”它跟着光标和鼠标走。你选中一段文字Selection.Text就是那段文字你没选任何东西Selection就是光标所在的一个插入点。Selection能做的动作很直观Activate激活、Copy复制、Cut剪切、Paste粘贴、Select选中。3.2 为什么要有两个一个给“批量”一个给“交互”如果只有Selection所有操作都得先模拟用户选中效率低且容易受光标位置干扰如果只有Range又没法响应用户“我现在选中的是什么”这种交互需求。所以 Word 把两者分开Range负责“我知道确切位置直接改”Selection负责“用户正在看哪里、选了什么”。一个典型对比例子给文档里所有数字加粗变绿。用Range的思路是遍历Characters集合逐个判断用Selection的思路是让用户先选中一段再处理。前者适合全自动批处理后者适合做个小工具让用户自己圈范围。Sub 数字变绿加粗() Dim i As Long Dim 每个字符 As Range 遍历当前文档全部字符 For i 1 To ActiveDocument.Characters.Count Set 每个字符 ActiveDocument.Characters(i) 判断是不是数字 If IsNumeric(每个字符.Text) Then 每个字符.Bold True 每个字符.Font.ColorIndex wdGreen End If Next i End Sub这段代码里Characters.Count给出字符总数循环从 1 走到 CountCharacters(i)按索引取出单个字符返回的是Range对象然后改Bold和Font.ColorIndex两个属性。wdGreen是 Word 内置常量不用自己记颜色值。注意循环变量用Long而不是Integer长文档字符数可能超过整型上限这是踩过坑之后的习惯。3.3 字、词、句、段四层集合各管一段Word 把文本按粒度分成了几层集合全部返回Range对象Characters是字符集合Words是单词集合Sentences是句子集合Paragraphs是段落集合。粒度越粗处理批量任务时循环次数越少效率越高。Paragraphs稍微特殊一点它返回的是Paragraph对象而Paragraph.Range才是那段文字。所以取第一段文字要写ActiveDocument.Paragraphs(1).Range.Text不能直接写Paragraphs(1).Text。这个多一层.Range的写法是初学者最容易漏的地方漏了就会报“对象不支持该属性”。4. 属性与方法对象的“特征”和“动作”别搞反4.1 属性是“它是什么样”方法是“它能干什么”属性Property描述对象的状态或特征字体名字、字号大小、是否加粗、颜色索引、文档路径、字符数量。方法Method是对象能执行的动作激活、复制、剪切、粘贴、选中、打印、关闭、保存。判断一个词是属性还是方法有个简单办法属性通常可以“赋值”或“读取”方法通常带参数、表示一个动作。比如每个字符.Bold True是给属性赋值Selection.Copy是调用方法。写代码时把方法当属性用比如写Selection.Copy TrueWord 会直接报错这类错误不涉及逻辑纯粹是语法层面搞混了。4.2 常用属性一览从文档信息到页面设置Document对象上挂着一大批只读属性用来快速了解一份文档的“体检数据”。这些属性不需要你遍历内容直接读就行适合做文档统计或预处理判断属性返回什么ActiveDocument.Characters.Count字符总数ActiveDocument.Words.Count字词总数ActiveDocument.Paragraphs.Count段落总数ActiveDocument.Sentences.Count句子总数ActiveDocument.Tables.Count表格数量ActiveDocument.Shapes.Count形状数量ActiveDocument.Bookmarks.Count书签数量ActiveDocument.Comments.Count批注数量ActiveDocument.FullName含路径的完整文件名ActiveDocument.Path文档所在路径ActiveDocument.ReadOnly是否只读ActiveDocument.HasPassword是否有密码保护这些属性组合起来能做的事比想象中多。比如先读ReadOnly判断能不能写再读Saved判断有没有未保存修改最后决定要不要执行保存一套判断下来就避免了很多“改了半天发现存不进去”的尴尬。4.3 方法是动作新建、打开、保存、关闭、打印文档级操作的方法集中在Documents集合和Document对象上。新建用Documents.Add打开用Documents.Open保存用ActiveDocument.Save另存用ActiveDocument.SaveAs2关闭用ActiveDocument.Close。关闭时有个关键参数SaveChanges它决定关的时候保不保存 关闭并自动保存 ActiveDocument.Close SaveChanges:wdSaveChanges 关闭且不保存 ActiveDocument.Close SaveChanges:wdDoNotSaveChanges 关闭前弹窗问用户 ActiveDocument.Close SaveChanges:wdPromptToSaveChanges这三个常量对应 0、-1、-2 三个数值但建议写常量名可读性高也不容易记错正负号。批量关闭所有文档时用For Each遍历Documents集合每份文档单独调Close比直接Documents.Close更可控因为后者对未保存文档的处理方式取决于参数容易误关。打印方法PrintOut的参数也值得记一下Range:wdPrintAllDocument打全部wdPrintCurrentPage打当前页wdPrintFromTo配合From和To打页码范围wdPrintRangeOfPages配合Pages:1,3,6打指定页。这些参数名写全了代码长但半年后回来看还能看懂比一堆裸数字强。5. 常见误区与易混概念这几组词混了就会翻车5.1 误区一把Application当成当前文档易混点Application和ActiveDocument都带“当前”的意味初学者容易写Application.Text想取文档内容。为什么混两者在对象浏览器里挨得近且都跟“Word 正在运行的东西”有关。怎么区分Application管软件全局版本、窗口、打印机、文档数量ActiveDocument管具体那份文件的内容。取文字永远走ActiveDocument或Range不走Application。5.2 误区二Range(2,5)以为取到下标 5易混点结束下标到底是“包含”还是“不包含”。为什么混日常说“从第 2 个到第 5 个”默认包含 5但 VBA 的Range是半开区间。怎么区分记住“结束下标前一个字符”这句话Range(2,5)实际覆盖 2、3、4。不确定时先MsgBox打出.Text看一眼比猜靠谱。5.3 误区三Paragraphs(1).Text直接取段落文字易混点以为Paragraphs集合的元素直接带Text属性。为什么混Characters(i).Text确实能直接取字符给人“集合元素都带 Text”的错觉。怎么区分Paragraphs返回的是Paragraph对象文字挂在它的Range上必须写Paragraphs(1).Range.Text。多这一层不是冗余是对象模型的设计。5.4 误区四ThisDocument和ActiveDocument随便用易混点两个都指向“文档”看起来没差别。为什么混单文档场景下两者结果一样掩盖了差异。怎么区分ThisDocument锚定代码所在文档切换窗口不变ActiveDocument跟着当前窗口走。写通用宏用ActiveDocument写绑定某份模板的代码用ThisDocument。多文档同时打开时用错改错文件是常事。5.5 误区五集合索引从 0 开始易混点受其他编程语言影响写Documents(0)或Characters(0)。为什么混数组从 0 开始是很多语言的默认VBA 的集合偏偏从 1 开始。怎么区分凡是 VBA 集合索引起点都是 1上限是.Count。循环写For i 1 To 集合.Count别写0 To Count - 1。6. 什么时候该用这套东西边界判断与一个完整例子这套对象模型最适合的场景很明确重复性的文档处理。比如一批文档要统一改格式、提取每份文档的段落数和字数、按模板批量生成新文件、把某个文件夹下的文档挨个打印。这些事手动做十份还能忍做一百份就是折磨而 VBA 写一次就能反复跑。反过来有些场景不适合硬上。只改一份文档的几个字直接手动改比写代码快需要复杂界面交互的工具VBA 的表单能力有限处理超大文档时逐字符循环会明显变慢这时候应该优先用Paragraphs或Sentences这种粗粒度集合减少循环次数。判断标准就一条重复次数够多、规则够明确才值得写成代码。拿一个具体例子收尾批量统计一个文件夹下所有 docx 的段落数。思路是先用Dir遍历文件再逐个Documents.Open打开读Paragraphs.Count记下来关掉不保存最后统一输出。Sub 统计文件夹下所有文档段落数() Dim 文件名 As String Dim 文档 As Document Dim 结果 As String 取当前文件夹下第一个 docx 文件 文件名 Dir(*.docx) Do While 文件名 以只读方式打开避免误改原文件 Set 文档 Documents.Open(FileName:文件名, ReadOnly:True) 结果 结果 文件名 文档.Paragraphs.Count 段 vbCrLf 关闭且不保存ReadOnly 下也不会触发保存提示 文档.Close SaveChanges:wdDoNotSaveChanges 文件名 Dir() Loop MsgBox 结果 End Sub这段代码里几个参数值得说明ReadOnly:True保证只读打开原文件不会被改动SaveChanges:wdDoNotSaveChanges保证关闭时不弹保存框Dir()不带参数再次调用是取下一个匹配文件这是 VBA 遍历文件夹的老套路。循环里每次Open都赋给同一个文档变量靠Set重新指向用完即关不会把一堆文档堆在内存里。我第一次写批量处理时没加ReadOnly结果脚本跑到一半弹了个保存提示手一抖点了“是”把一份原始文件覆盖了。从那以后我每次写涉及打开文件的宏都强制先加只读参数、关闭时显式指定不保存宁可多写一行也不给自己留后悔药。希望这些能帮到你少走一点弯路。本文还有配套的精品资源点击获取