使用VBA将大纲级别定义良好的单个Word文档按指定的大纲样式分割成多个文档

这篇具有很好参考价值的文章主要介绍了使用VBA将大纲级别定义良好的单个Word文档按指定的大纲样式分割成多个文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们知道,大纲级别定义良好的Word文档可以轻松用Edraw master转换成思维导图。但是,对于一个极长的文档,例如一本教材,直接导入Edraw master转换后的思维导图,因为内容过多,仍然很难阅读。这时候,可以考虑分章节将长文档分割成一个一个小文档,再将小文档导入Edraw master,转换后的思维导图就比较好用了。
下面的宏可以将一个极长的文档分成每一个“标题 4”段落及其所属内容构成的短文档。如果想按其他级别的段落来分割文档,只需将宏中的变量styleName赋为其他值即可。(注:2024年1月26日修订代码,不再需要强制限定最后一页有且只有一个样式为styleName的段落
除了可以按样式名分割文档,直接按大纲级别(OutlineLevel)来分割文档也是可以的,只需要将以下代码中的If .ParagraphFormat.Style = styleName Then一行注释掉,并取消下一行If .Paragraphs(1).OutlineLevel = OlLevel then的注释,其中,OlLevel是指定大纲级别的变量。

Sub 按大纲级别分割文档()

     Dim pos%, i%, rng As Range, titPara As Paragraph
     Dim subDoc As Document, mainDoc As Document, path$, fileName$, styleName$, olLevel%
     
     Set mainDoc = ActiveDocument '原文档对象
     '指定的分割文档的大纲级别或该级大纲的样式名称。只需指定一个
     styleName = "标题 4" '指定的分割文档的大纲级别对应的段落的样式名称
     olLevel = 4 '指定的分割文档的大纲级别
     
     '子文档保存路径,这里保存在主文档所在目录。注意路径要以反斜杠结束
     path = mainDoc.path & "\"
     ' pages = mainDoc.ComputeStatistics(wdStatisticPages) '获取文档总页数     
     i = 1
     
     Application.ScreenUpdating = False
     ' 某些版本的office执行文档创建关闭会出现操作无效错误,忽略
     On Error Resume Next
     With Selection        
        ' 光标移动至文档开头
        .HomeKey unit:=wdStory        
        Do

            'If .ParagraphFormat.Style = styleName Then ' 根据样式名定位原文档分割位置
            If .Paragraphs(1).OutlineLevel = olLevel Then '根据大纲级别定位原文档分割位置
                Set titPara = .Paragraphs(1)
                '一个数字序列号+指定大纲段落文本作为分割文件的文件名
                '也可每移动一个标题比较一下当前标题的大纲级别与指定样式段落的大纲级别
                '如果当前段落大纲级别较高,则将段落文本连接起来作为文件名的一部分,
                '这样,从文件名即可看出该文件所属的章节
                fileName = Mid(titPara.Range, 1, Len(titPara.Range) - 1) '去掉段落末尾的回车符号
                ' 如果原文档标题4是以序号加上顿号做前缀,在文件名中去掉前缀。没有顿号pos会返回0
                pos = InStr(fileName, "、")
                ' 拼接文件名
                fileName = Format(i, "00000") & Mid(fileName, pos + 1)
                Set rng = .Bookmarks("\headinglevel").Range '获取该标题下所有内容
                rng.Copy '复制内容保存到分割的文档中
                Set subDoc = Documents.Add '新建文档保存分割出的内容
                ' 指定分割的文档中“正文”样式的字体
                With subDoc.Styles("正文").Font
                    .NameFarEast = "宋体"
                    .NameAscii = "Source Code Pro"
                    .NameOther = "Source Code Pro"
                End With
                subDoc.Content.Paste '粘贴复制的内容,源格式粘贴
                ' 将字体文件嵌入分割的文档中一起保存,移植到缺少Source Code Pro字体的电脑也能正常显示格式
                subDoc.EmbedTrueTypeFonts = True
                subDoc.SaveAs path & fileName & ".docx" '保存分割的文档中
                subDoc.Close '关闭分割的文档中
                mainDoc.Activate '激活原文档,防止意外处理其他文档
                i = i + 1
            End If
            pos = .Start '记录当前光标位置
            .GoTo wdGoToHeading, wdGoToNext, 1 '光标移动到下一个标题
            ' 当光标移动到文档最后一个标题后,执行上一行的.GoTo命令光标位置不再发生变化,此时即完成了分割,可以退出循环
            If .Start = pos Then Exit Do
        Loop
    End With
    Set subDoc = Nothing
    Set mainDoc = Nothing
    Set rng = Nothing
    Debug.Print "共生成新文档数量为" & (i - 1)
    Debug.Print "处理完成。"
    Application.ScreenUpdating = True
End Sub

上述代码中只有一个技巧值得注意,那就是使用预定义书签"\headinglevel"取得指定样式段落所属的全部内容(包括子标题、文本段落和图片、表格等)。
Word中的预定义书签有下面一些(来源:微软官方文档)文章来源地址https://www.toymoban.com/news/detail-532924.html

Bookmark 说明
\Sel 当前所选内容或插入点。
\PrevSel1 发生编辑的最新选择;转到此书签等效于运行 一次 GoBack 方法。
\PrevSel2 倒数第二次编辑过的所选内容;定位至该书签相当于运行两次 GoBack 方法。
\StartOfSel 当前所选内容的起点。
\EndOfSel 当前所选内容的终点。
\Line 当前行或当前所选内容的首行。 如果插入点在本段非最后一行的行尾,该书签包含完整的下一行。
\Char 当前字符,它是插入点后面的字符(当没有选定内容时)或所选内容的第一个字符。
\Para 当前段,即包含插入点的段,或在选定多个段落时所选段落中的第一段。 请注意,如果插入点或所选内容位于文档的最后一段,则“\Para”书签不包含段落标记。
\Section 当前节,并可能包含节尾的分隔符。 当前节包含插入点或所选内容。 如果所选内容包含多个节,则“\Section”书签为所选内容中的第一节。
\Doc 活动文档中的全部内容(文档结尾处的段落标记除外)。
\Page 当前页,并可能包含页尾的分隔符。 当前页包含插入点。 如果当前所选内容包含多页,则“\Page”书签为所选内容的第一页。 注意,如果插入点或所选内容位于文档中的最后一页,则“\Page”书签不包含文档结尾的段落标记。
\StartOfDoc 文档开头。
\EndOfDoc 文档结尾。
\Cell 表格中当前的单元格,即包含插入点的单元格。 如果当前所选内容包含表中一个或多个单元格,则“\Cell”书签为所选内容的第一个单元格。
\Table 当前表格,即包含插入点或所选内容的表格。 如果所选内容包含多个表格,则“\Table”书签为所选内容中完整的第一个表格(即使未选定完整的表格)。
\HeadingLevel 包含插入点或所选内容的标题,及其子标题和文字。 如果当前所选内容为正文文字,则“\HeadingLevel”书签包含上一个标题以及该标题包含的任何子标题和文字。

到了这里,关于使用VBA将大纲级别定义良好的单个Word文档按指定的大纲样式分割成多个文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ppt技巧:如何将Word文档大纲中导入到幻灯片中?

    在PowerPoint中,将Word文档的大纲导入到新的幻灯片是一种非常实用的技巧。以下是详细的步骤: 首先,需要打开PowerPoint软件并打开原始的幻灯片文件。 在PowerPoint的顶部【开始】菜单栏中,找到并点击“新建幻灯片”按钮,选择下拉菜单。 在这个下拉菜单中,需要找到并点击

    2024年04月15日
    浏览(28)
  • VBA Excel自定义函数的使用 简单的语法

    一个简单的教程,实现VBA自定义函数。 新建模块 复制后面的代码放进来 函数的入口参数不定义,则认为是一块区域; 反之,如FindChar1 As String,则认为是输入的单值。 循环和分支如下例子,VB比较接近自然语言,英语有功底的话,写起来还是比较舒服的。 以下实现的是一个

    2024年02月10日
    浏览(26)
  • VBA-自定义面板,使用SQL查询Excel数据

    定制插件,实现用户打开任意一个工作簿,写sql对Excel中的数据进行查询 需求 筛选日期小于’2023-4-24’,按group字段分组,求和各分组下的销售额,返回结果集新建工作表写入 数据源 现在有两个表, 一个用户的销售金额表,记录用户不同日期的销售金额,其中date字段是日期

    2024年02月01日
    浏览(24)
  • VBA操作Word

    2024年04月13日
    浏览(23)
  • Word·VBA实现邮件合并

    之前写过的一篇使用《python实现word邮件合并》,本文为vba实现方法 域名可以使用中文,最终完成的word模板,wps操作步骤类似 在 Excel启用宏的工作表 运行以下代码,读取当前工作表数据,对模板word文档,按工作表表头名称对同一域名写入值,生成新文档 参考资料: 《Rang

    2024年01月23日
    浏览(27)
  • 【PHPWrod】使用PHPWord导出word文档

    目的:PHP通过PHPWord类库导出文件为word。 开发语言及类库:ThinkPHP、PHPWord 项目根目录使用composer安装PHPWord,安装完成后会在vendor目录下生成phpoffice文件夹,就是PHPWord类库 前端代码 PHP代码 1、前端:先使用按钮事件,在点击事件里去请求后端返回的word文件的地址(这个地址是

    2024年02月09日
    浏览(29)
  • 使用OpenXML库替换docx文档(Word文档)中的特定字段

    在批量生成Word文档的应用中,最常见的需求莫过于替换掉文档中的特定字段以生成新的文档。利用OpenXML库可轻松实现这一需求。 首先放出最简单然而有bug的版本: 该版本的原理是遍历word文档中的每个段落,搜索段落中的每个文字字段对象,如果找到匹配的值就将其替换成

    2024年02月11日
    浏览(33)
  • Python和VBA批量提取Word中的表格

    表格在word文档中常见的文档元素之一。操作word文件时有时需要提取文件中多个表格的内容到一个新的文件,甚至有时还会要提取题注信息。 今天,给大家分享两种批量提取文档中表格的两种方法,分别是VBA法和Python法两种。 1. 代码实现 VBA(Visual Basic for Applications)操作Wo

    2024年02月19日
    浏览(44)
  • VBA操作WORD(八)设置标题格式(含主、副标题)

    因为主标题和副标题一般都是包含一两句子的段落,所以参数直接传入Paragraph。至于判断主副标题的规则则外面调用部分再做判断。 调用主标题和副标题设置,并且在标题下方增加一空行(注意,不是段后一行的高度,两者不是一回事)。 主副标题判断的逻辑见注释。 需要

    2024年02月15日
    浏览(27)
  • vue 使用docx库生成word表格文档

            在Vue.js中生成Word表格文档,可以通过前端库来实现。这些库可以帮助我们轻松地将HTML表格转换为Word文档(通常是.docx格式)。以下是一些流行的前端库,它们可以用于在Vue项目中生成Word表格文档:                  docx是一个流行的JavaScript库,用于在浏览

    2024年02月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包