简介这份PDF教程面向已具备VBA基础、希望深入掌握Office自动化的办公人员与开发者聚焦ExcelVBA与WordVBA第4季的核心内容系统讲解对象、集合、属性与方法四大概念帮助读者从零散记录走向体系化理解进而编写自定义宏提升办公效率。资源包共1个PDF文件约1.92MB内容以图文讲义形式组织涵盖Application、Document与Documents、Range、Selection等常用对象以及Characters、Words、Sentences、Paragraphs等集合的索引访问方式并对比Excel中ActiveWorkbook、ThisWorkbook与Word中对应对象的异同。教程还结合Font.ColorIndex、Bold等属性设置与Activate、Copy、Cut、Paste、Select等方法调用演示字符颜色加粗、段落文字提取、表格对象操作等典型场景附有Application与Document常用属性速查表便于随查随用。目前已有848人学习适合希望打通两款软件对象模型、查漏补缺的中级学习者。1. WordVBA 第4季一张对象模型地图把文档拆成可编程的零件学 WordVBA 最容易翻车的地方不是语法写错而是脑子里没有一张对象模型的地图。很多人打开编辑器就开始抄代码结果Range和Selection分不清Documents和Document混着用报错之后完全不知道从哪查。第4季的内容其实就是在补这张地图Word 整个软件是一个Application对象它下面挂着Documents集合每个Document里又有Range、Selection、Paragraphs、Characters、Tables这些零件每个零件都有自己的属性和方法。把这条“集合 → 对象 → 属性/方法”的链路理顺后面写宏就是按图索骥。这份笔记适合已经写过简单宏、但对象模型还没串起来的人也适合复习时快速定位自己卡在哪一层。2. 对象与集合Application、Document、Documents 的层级关系2.1 集合是容器对象是容器里的个体VBA 里“集合”和“对象”的关系用一句话概括集合是装对象的盒子对象是盒子里的东西。Documents是一个集合里面装着所有打开的文档每一个打开的文档是一个Document对象。Paragraphs是集合里面装着一个个Paragraph对象Characters是集合里面装着一个个字符对应的Range对象。理解这一层之后很多写法就自然通了。Documents.Count返回的是打开的文档数量因为Count是集合的属性ActiveDocument.Paragraphs.Count返回的是当前文档的段落数因为Paragraphs是文档下的集合。集合通常有Count、Item、Add这类成员对象则有自己的业务属性比如Document.FullName、Document.Path。梳理下来会发现一个规律凡是能“装多个”的东西基本都以复数形式出现——Documents、Paragraphs、Characters、Words、Sentences、Tables、Sections。单数形式则指向具体一个对象比如Document、Paragraph、Range。这个命名习惯不是巧合是对象模型设计时留下的线索记住它读代码时能少查很多次文档。2.2 Application 代表 Word 软件本身Application是整个对象模型的根代表 Word 这个软件。它管的是软件级别的状态当前打印机、窗口高度宽度、版本号、用户名、最近打开的文档数、可用字体数、磁盘剩余空间。这些信息不属于某一个文档而属于整个应用程序所以挂在Application下面。常用成员可以按“查状态”和“做动作”两类记类别成员作用查状态Application.Version返回 Word 版本号查状态Application.Build返回版本号和编译序号查状态Application.Documents.Count返回打开的文档数查状态Application.FontNames.Count返回可用字体数查状态Application.RecentFiles.Count返回最近打开的文档数查状态Application.System.FreeDiskSpace返回所在磁盘可用空间查状态Application.UserName返回应用程序用户名做动作Application.Activate激活指定对象做动作Application.PrintOut打印指定文档的全部或部分做动作Application.Resize调整 Word 窗口大小做动作Application.Quit退出 Word可选择保存这里有个容易忽略的点Application.Resize在窗口被最大化或最小化时会出错。写调整窗口大小的代码最好先判断窗口状态别直接调。另外Application.Caption是当前应用程序名Application.Path显示活动文档的路径和文件名这两个名字很像但一个指软件标题一个指文档路径别混。2.3 Document 与 Documents单数与复数的分工Document代表一个具体文档Documents代表所有打开文档的集合。引用当前文档有三种写法对应 ExcelVBA 里的三个熟面孔WordVBAExcelVBA 对应含义ActiveDocumentActiveWorkbook/ActiveSheet当前活动文档ThisDocumentThisWorkbook包含 VBA 代码的文档Documents(文档名)Workbooks(工作簿名)/Sheets(表名)按名称访问指定文档ActiveDocument和ThisDocument的区别值得单独记ActiveDocument跟着焦点走你切换到哪个文档它就指哪个ThisDocument永远指向代码所在的那个文档不管焦点在哪。写加载到文档里的宏用ThisDocument更稳写通用工具宏用ActiveDocument更灵活。Documents集合的常用方法就四个Add新建空文档、Open打开指定文档、Close关闭一个或多个文档、Save保存指定文档。Documents.Add之后返回的是新文档对象可以直接链式调用.SaveAs2这是后面新建保存一节会展开的写法。Document对象的属性特别多按“计数类”和“状态类”分开记会轻松很多。计数类包括Characters.Count、Words.Count、Sentences.Count、Paragraphs.Count、Sections.Count、Tables.Count、Shapes.Count、Styles.Count、Bookmarks.Count、Comments.Count、Footnotes.Count、Endnotes.Count、Fields.Count、Hyperlinks.Count、Indexes.Count、ListParagraphs.Count以及几个目录类计数TablesOfContents.Count、TablesOfAuthorities.Count、TablesOfFigures.Count。状态类包括FullName、Path、Name、ReadOnly、Saved、HasPassword、AttachedTemplate.FullName、PageSetup。写统计类宏时先想清楚要数的是“文档级”还是“集合级”能省掉很多试错。3. Range 与 SelectionWordVBA 里最容易混淆的两个核心对象3.1 Range 是“一段文字”Selection 是“当前选中的东西”Range代表文档中的一段连续区域它不依赖用户是否选中代码可以直接创建和操作。Selection代表用户当前选中的内容它跟着光标和鼠标走。这是两者最本质的区别Range是程序可以独立持有的“文字片段”Selection是界面上“正在被操作的那块”。Range的构造方式是Range(Start, End)两个参数都是字符下标Start是起始位置End是结束位置的下一个字符。原文的例子很直观Range(2, 5)表示从下标 2 开始到下标 5 之前那个字符结束。也就是说结束下标是“开区间”的右端点不包含在范围内。这个细节第一次写很容易错以为Range(2,5)取的是第 2 到第 5 个字符实际取的是第 2、3、4 个。Document.Range.Text返回整个文档所有字符构成的字符串ActiveDocument.Content也能返回文档正文内容。两者在取全文时效果接近但Content返回的是一个Range对象可以继续调.Text、.Font、.InsertBefore等成员Range.Text直接拿到字符串。要改格式就用Content或Range对象只要文本就用.Text。Selection的常用方法都是“动作型”Activate激活、Copy复制、Cut剪切、Paste粘贴、Select选择。这些方法直接作用于用户当前选中的内容所以写交互式宏时很方便但写批量处理时就不合适——批量处理时用户没有选中任何东西Selection指向的是光标位置操作结果往往不是想要的。血泪经验是批量改格式用Range交互式操作用Selection别在循环里依赖Selection。3.2 字、词、句、段、节的集合都返回 RangeWordVBA 把文档切成了多个粒度的集合每个集合里的元素本质上都是Range对象集合粒度元素类型典型用法Characters字符RangeCharacters(3)第 3 个字符Words单词Range遍历单词做拼写检查Sentences句子Range按句统计或改格式Paragraphs段落ParagraphParagraphs(1).Range.Text取第一段文字Sections节Section按节设置页面注意Paragraphs的元素是Paragraph对象不是Range要取文字得再走一层.Range.Text。原文里Document.Paragraphs(1).Range.Text就是这个链路先拿到第一个Paragraph再取它的Range再取Text。而Characters、Words、Sentences的元素直接就是Range少一层。这里有个和 Excel 的对照特别容易记混Excel 里Cells(5,2)是第 5 行第 2 列的单元格Word 里Characters(3)是文档中第 3 个字符。同样是“括号加数字”Excel 是二维坐标Word 是一维下标。写跨软件宏的时候这个差异是翻车高发区别把Cells(5,2)的思维带到 Word 的Characters上。3.3 用 Range 遍历字符改格式的完整写法原文给了一个把数字变红色粗体的例子结构很典型值得逐行拆Sub 将数字变成红色粗体() 遍历全部字符 For i 1 To Word.Application.ActiveDocument.Characters.Count Set 每个字符 Word.Application.ActiveDocument.Characters(i) If IsNumeric(每个字符.Text) Then 每个字符.Bold True 每个字符.Font.ColorIndex wdGreen End If Next End Sub这段代码的骨架是“先数总数再按下标逐个取取到之后判断再改”。Characters.Count给出循环上界Characters(i)返回第 i 个字符对应的RangeIsNumeric判断是不是数字Bold和Font.ColorIndex是Range的字体属性。wdGreen是 Word 内置常量不用自己定义颜色值。参数说明Bold是布尔属性True加粗、False取消Font.ColorIndex接受WdColorIndex常量wdGreen只是其中一个换颜色就换常量名。循环里每次Set一个Range对象注意Set不能省对象赋值必须用Set这是 VBA 的硬规则漏了就是“对象变量未设置”错误。这段代码可以优化的地方每次循环都写Word.Application.ActiveDocument会重复解析对象链先Set 文档 ActiveDocument再在循环里用文档.Characters(i)更快也更易读。另外遍历字符改格式在长文档上会慢实际项目里可以先判断再批量处理但作为理解对象模型的练习这个写法已经把“集合 → 索引 → 对象 → 属性”的链路走完整了。4. 属性与方法对象能读什么、能做什么4.1 属性是状态方法是动作属性和方法的区分用一句话记属性回答“它是什么样”方法回答“它能干什么”。Range.Bold是属性读它知道是否加粗写它改变加粗状态Selection.Copy是方法执行复制这个动作。属性可以赋值也可以读取方法只执行不返回状态少数方法有返回值但语义上仍是动作。原文的总结很精炼WordVBA 就是“集合.对象.属性.方法”的链条。Documents(1).Paragraphs(1).Range.Font.Size这条链从集合取对象从对象取集合从集合取对象最后落到属性。读这种链式表达式从右往左看先看最后是属性还是方法再往左逐层确认每一段是集合还是对象。4.2 新建、打开、保存、关闭的标准写法文档生命周期操作是最高频的原文给了几组可以直接抄的写法Sub 新建保存另存() 新建文档 Documents.Add 保存保存在原来位置 ActiveDocument.Save 另存为需要指定位置 ActiveDocument.SaveAs2 c:\1.docx 关闭 ActiveDocument.Close End SubDocuments.Add新建后新文档自动成为ActiveDocument所以后面可以直接接ActiveDocument.Save。SaveAs2的参数是完整路径加文件名路径不存在会报错实际用之前最好先确认目录。链式写法Documents.Add.SaveAs2 c:\1.docx也能跑因为Add返回新文档对象直接调它的SaveAs2。打开文档用Documents.Open参数很多常用的几个参数作用FileName文档名可含路径ReadOnlyTrue以只读方式打开AddToRecentFilesTrue加入最近使用列表PasswordDocument打开文档所需密码VisibleTrue在可见窗口打开OpenAndRepairTrue修复文档防止损坏关闭文档的关键参数是SaveChanges三个常量对应三种行为常量值行为wdSaveChanges-1自动保存不提示wdPromptToSaveChanges-2提示用户保存wdDoNotSaveChanges0不保存丢弃更改批量关闭所有文档时用For Each doc In Documents遍历每个doc.Close savechanges:wdPromptToSaveChanges这样每个文档关闭前都会问一次。如果确定不要更改直接Documents.Close savechanges:wdDoNotSaveChanges一行关完。这里有个易错点Close的参数名是SaveChanges但常量名是wdDoNotSaveChanges拼写差一个字母抄代码时容易抄错。4.3 打印Range 参数决定打印哪部分PrintOut的Range参数控制打印范围常用常量常量打印范围wdPrintAllDocument整个文档wdPrintCurrentPage当前页面wdPrintSelection当前所选内容wdPrintFromTo指定起止页配合From、TowdPrintRangeOfPages指定页码列表配合Pages打印前 N 页用Range:wdPrintFromTo, From:1, To:3打印不连续的指定页用Range:wdPrintRangeOfPages, Pages:1,3,6。批量打印文件夹下所有 docx 文件用Dir循环加Application.PrintOut FileName:文件这是把文件遍历和打印方法组合起来的典型写法第二季的Dir知识在这里直接复用。5. 易错点这五处最容易漏复习时优先补5.1 易错点一Range 的结束下标是开区间容易漏的原因直觉上Range(2,5)像是“第 2 到第 5 个字符”但实际结束下标不包含在范围内取的是第 2、3、4 个。这个偏差在取单个字符时最明显Range(2,3)只取第 2 个字符不是两个字符。怎么补写Range之前先在心里过一遍“结束下标减一才是最后一个字符”取第 n 个字符就写Range(n, n1)。调试时用MsgBox Range(2,5).Text看实际取到什么比读文档快。5.2 易错点二Selection 在批量处理里不可靠容易漏的原因交互式测试时Selection表现正常因为测试时确实选中了内容一旦放进循环批量处理用户没有选中任何东西Selection指向光标位置操作结果完全不对。怎么补批量改格式、批量取文字一律用Range或具体集合只有需要“模拟用户操作”时才用Selection。判断标准很简单这段代码要不要依赖用户当前选中什么不依赖就用Range。5.3 易错点三对象赋值漏写 Set容易漏的原因普通变量赋值写惯了x 1对象赋值也顺手写文档 ActiveDocument运行时报“对象变量或 With 块变量未设置”。怎么补记住一条硬规则——左边是对象变量赋值就必须用Set。Set 文档 ActiveDocument、Set 每个字符 Characters(i)一个都不能省。读别人代码时看到Set就知道右边返回的是对象这也是个有用的阅读线索。5.4 易错点四Documents 和 Document 混用容易漏的原因两个词只差一个 s输入时自动补全很容易选错。Documents.Count是集合的属性Document.Name是对象的属性写反了要么报错要么拿到意外结果。怎么补记“复数管数量单数管个体”。要数有几个文档用Documents.Count要取某个文档的名字用ActiveDocument.Name或Documents(1).Name。写的时候先想清楚要的是“集合级信息”还是“单个对象信息”再决定带不带 s。5.5 易错点五Close 的 SaveChanges 参数和常量拼写容易漏的原因参数名SaveChanges和常量wdDoNotSaveChanges、wdSaveChanges、wdPromptToSaveChanges长得很像抄的时候少个字母就编译不过而且报错信息不一定直指拼写。怎么补把三个常量抄在一张便签上贴编辑器旁边或者用自动补全选别手打。关闭文档前先问自己“要不要保存”三选一对应三个常量选完再写参数名。6. 复习清单按对象模型逐层自查把漏洞补在考前复习这份内容最有效的方式不是从头读一遍而是拿一张纸按对象模型的层级从上往下默写写不出来的地方就是漏洞。下面这张自查表可以照着走一遍层级自查问题对应章节Application能说出 5 个状态属性和 3 个动作方法吗2.2DocumentsAdd、Open、Close、Save的参数记得吗2.3 / 4.2Document计数类属性能列出一半吗2.3RangeRange(2,5)取哪几个字符能立刻答吗3.1 / 5.1Selection什么场景该用、什么场景不该用3.1 / 5.2集合Paragraphs(1).Range.Text为什么要两层3.2属性/方法随机指一个成员能判断是属性还是方法吗4.1默写完之后挑三个最不熟的点各写一段 10 行以内的小宏验证。比如Range下标不熟就写一个取第 3 到第 6 个字符并弹窗显示的宏Documents不熟就写一个统计打开文档数并逐个打印文件名的宏。写宏验证比反复读文档有效得多因为报错会逼你回去查对象模型查一次记一次。还有一个查漏补缺的技巧把原文里的对象说明表当成“反向题库”用。遮住中文列只看成员名自己说作用说不出来的标记出来集中看那一块。Application那张表、Document那张计数表、Documents方法表三张表过一遍对象模型的骨架就立住了。我自己的习惯是每次写 Word 宏之前先在注释里把要用的对象链写出来比如 Documents(1) - Paragraphs(2) - Range - Font.Size链写通了再写代码链写不通说明对象模型还没想清楚这时候硬写就是给自己埋雷。从那以后我每次碰Range和Selection都强制先问一句“这段要不要依赖用户选中”问完再动手翻车次数少了很多。希望这份梳理帮到你复习时按表走一遍比从头翻教程快。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
代码重构实战:从等价变换到行为改进的工程实践 1. 重构的本质:从代码形态到业务价值的转化重构这件事,我干了十五年。从最初机械地执行"提取方法"、"重命名变量",到现在每次敲键盘前都会问自己三个问题:这次改动究竟改变了什么?不改变什么&… · 2026/11/3 3:04:30
微服务架构下支付系统的设计与实践 1. 支付功能在单体与微服务架构下的设计差异在孢子记账从单体架构向微服务架构迁移的过程中,支付功能模块的改造是最具挑战性的部分之一。单体架构下的支付模块通常采用紧耦合设计,所有支付方式(微信、支付宝、银联等)的代码都打包… · 2026/11/3 3:04:30
基于STM32F103与LAN9252的EtherCAT从站开发实战:64入64出方案 简介:这份文档面向嵌入式开发工程师与工业以太网学习者,围绕STM32F103与LAN9252构建EtherCAT从站这一典型方案展开,重点解决从站开发中硬件连接、协议栈移植与配置理解等实际问题。资源包共1个docx文件,约1.75MB,内容涵… · 2026/11/3 3:04:30
StatusServer:分布式系统健康监控的核心架构与实践 1. StatusServer:现代分布式系统的健康监控中枢在分布式架构成为主流的今天,服务健康监控已从"可有可无"变成了"生死攸关"的基础设施。三年前我们某个核心服务的一次雪崩事故让我深刻认识到:当30个微服务节点中有3个出现… · 2026/11/3 3:29:34
SAP Fiori扩展部署:BAS与gCTS集成实战指南 1. 这不是“加个按钮”那么简单:Fiori扩展部署的本质是ABAP系统能力的再定义你看到“SAP Fiori 扩展部署到 ABAP 环境”这个标题,第一反应是不是——不就是改个UI5代码、打个包、传到后台?我试过太多次了,这种想法在2024年已经成了… · 2026/11/3 3:29:34
2026年AI发展:从规模竞赛到数据智能的转型 1. 2026年AI发展的关键转折点2026年很可能成为人工智能发展史上的一个重要分水岭。过去十年间,AI领域最显著的竞争焦点就是模型规模的不断膨胀——从最初的百万参数到如今的万亿参数,各大科技公司都在比拼谁能训练出更大的模型。但这种"越大越好&qu… · 2026/11/3 3:29:34
虚拟展览VR/AR开发:从帧率预算到交互验收的工程实践 简介:面向VR/AR初学者、独立开发者及教学备课人员,这份文档以“创建虚拟展览体验”为主线,给出可扩展的开发脚本案例与流程框架,帮助读者快速理清从创意到可发布应用的实现路径。内容围绕项目初始化与环境配置、3D模型导入与场景布… · 2026/11/3 3:29:34
C语言期末305题题库查漏:语法数组指针易错点复习地图 简介:这份详解版C语言期末题库面向高校理工科学生与备考C语言期末考试的读者,聚焦选择题、填空题、判断题、读程序写结果和压轴编码等常见题型,帮助在有限时间内梳理函数、标识符、三种控制结构、数据类型、运算符、条件表达式及标准库函数等… · 2026/11/3 3:29:34
进程同步四大经典模型:死锁、信号量与并发故障排查 凌晨两点被叫起来救一个"服务假死"的场,日志停在某一行不动,进程活着,CPU 几乎为零,所有请求都超时。抓线程栈一看,两个工作线程一个卡在入队、一个卡在出队,各自握着一把锁,等着对方… · 2026/11/3 3:28:34
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18