VBA/MS-Word:将章节标题转换为基于非样式的

问题描述 投票:0回答:1

我的问题涉及 VBA 和 MS Word (Office 2021)

我有一些大型遗留文档,其中包含多级、手动编号的章节标题。当这些文档在 20 世纪 90 年代创建时,我使用 TC(目录条目)字段来定义 TOC(目录)中条目的文本和页码。我认为微软当时还没有推出Styles。

关于 TC 字段 --- 请参阅 https://support.microsoft.com/en-us/office/field-codes-tc-table-of-contents-entry-field-01e5dd8a-4730-4bc2-8594- 23d7329e25c3?ns=WINWORD&版本=21

以下是 RevealCodes 模式下基于 TC 的章节标题示例。 https://i.sstatic.net/9z8MheKN.png

如您所见,标题出现在文档正文以及 TC 字段(括号内的内容)中。 TC 字段成为 TOC 条目。

无论如何,我想转换这些文档,使标题成为基于样式和自动编号的。然而,手动转换所有这些文档将非常耗时。因此,我想雇人用 VBA 以编程方式完成此操作。

但是在这样做之前,我需要对这个主题进行自我教育,以确定它是否确实可行。

我假设有一个 VBA 可访问的表(在 Word 文档中的某个位置)包含 TC 代码的所有实例。在这种情况下,VBA 程序将对表中的每个元素执行以下操作: (1) 检查TC字段的内容并确定它是Level1、Level2还是Level3标题。 (2) 将适当的标题样式(级别 1、2 或 3)应用于文档正文中的标题文本。 (3) 删除 TC 字段,因为不再需要它。

问题: (1) 这听起来可行吗? (2) 有没有代码演示如何访问TC代码实例表。

如有任何建议,我们将不胜感激。

我没有尝试任何东西,因为我不知道如何编程。 我只是想知道VBA是否可以解决我的问题。

ms-word styles tableofcontents
1个回答
0
投票

您可以使用如下宏进行基本转换:

Sub Demo()     
Application.ScreenUpdating = False     
Dim f As Long, StrLvl As String     
With ActiveDocument     
  For f = Fields.Count To 1 Step -1     
    With .Fields(f)     
      If .Type = wdFieldTOCEntry Then     
        StrLvl = ""     
        If InStr(.Code.Text, "\l") > 0 Then StrLvl = Split(Split(.Code.Text, "\l")(1), " ")(1)     
        If StrLvl = "" Then StrLvl = "1"     
        .Code.Paragraphs.First.Style = "Heading " & StrLvl     
        .Delete     
      End If     
    End With     
  Next     
End With     
Application.ScreenUpdating = True     
End Sub

但请注意,TC 字段可以告诉 Word 显示与实际标题中不同的文本。标题样式不允许这样做。上面的宏假设现有标题文本将显示在重建的目录中。

您还需要处理任何多级列表编号等,以及删除任何不需要的手动编号。尽管这也可以用代码完成,但我无法知道您的文档使用什么编号方案 - 并且每个编号方案变体都需要不同的代码。

© www.soinside.com 2019 - 2024. All rights reserved.