首页 > 解决方案 > 在形状中查找 TOC(即文本框)

问题描述

我正在尝试编写一个宏来计算和定位文档中的 TOC(例行检查而不是特定文件)。

位于文档“正文”中的 TOC 很容易访问(通过 VBA)。Word 还允许用户将 TOC 对象放置在形状(文本框)内,但这些似乎无法通过代码访问。诚然,将 TOC 放置在形状中并不常见,但如果可能的话 - 应该考虑到这一点。

这使得计数和检测它们不可靠。

我知道并直观地想到的唯一方法是:

For Each shp In ActiveDocument.Shapes
       iCount = iCount + shp.TextFrame.TextRange.<TableOfContents.Count>    <<< no access to TableOfContents
    Next shp

为了找到这些目录,我需要什么代码?

谢谢!

标签: vbams-word

解决方案


TablesOfContents集合仅在Document对象上可用。文档主体中的目录将选择文本框中的项目;文本框中的目录将选取文档主体中的项目。(至少,自 Word 2010 以来;曾经有一段时间,文本框中的 TOC 对主文档正文中的 TOC 字段不“可见”。)

但是,VBA 属性Document.TablesOfContents不会拾取文本框中的目录,而只会拾取主体中的目录。

因此,无法直接查询文本框(或自选图形 - 绘图对象)中的 TOC 数量。那就是说...

目录由 Word 使用TOC域代码在后台管理。因此可以确定给定的 TOC 字段的数量Range。例如:

Sub GetAllToc()
    Dim shp As Word.Shape
    Dim tbRange As Range
    Dim iCount As Long
    Dim fld As Word.Field

    Debug.Print "TOCs in main Document body: " & ActiveDocument.TablesOfContents.Count

    For Each shp In ActiveDocument.Shapes
        If shp.Type = msoTextBox Or shp.Type = msoAutoShape Then
            Set tbRange = shp.TextFrame.TextRange
            For Each fld In tbRange.Fields
                If fld.Type = wdFieldTOC Then
                    iCount = iCount + 1
                End If
            Next
        End If
    Next shp
    Debug.Print "TOCs in text boxes: " & iCount
End Sub

推荐阅读