【问题标题】:How do I extract hidden text after Table of Contents in Microsoft Word using VBA?如何使用 VBA 在 Microsoft Word 中的目录后提取隐藏文本?
【发布时间】:2021-05-11 21:31:42
【问题描述】:

我有一个要求,我必须在 Word 文档的目录之后提取两行文本。文本被隐藏并添加,仅供在 VBA 中使用。

我做了一些研究,发现我可以使用 Range 对象从 word 文档中提取文本,因此我尝试对其进行硬编码,并通过使用得到了我想要的值

MsgBox ActiveDocument.Paragraphs(43).Range.Text

现在此代码可以用于特定文档,但对于新文档,我不知道目录将在哪里结束以及我必须从哪里提取的确切行号。

任何帮助表示赞赏并提前致谢。

【问题讨论】:

标签: vba ms-word


【解决方案1】:

这有点棘手,因为字段对象没有范围,因此您必须寻找字段结果的范围。一旦你有了结果范围,你就可以得到它所在的段落范围,然后是下一个段落的范围,然后当你得到那个段落的文本时。听起来很复杂,但当您了解 Word 对象模型的工作原理后,实际上会非常简单。

Sub Test()

    Debug.Print GetTextAfterToc

End Sub

Public Function GetTextAfterToc() As String

    Dim myfield As Word.Field
    
    For Each myfield In ActiveDocument.StoryRanges(wdMainTextStory).Fields
    
        If myfield.Type = wdFieldTOC Then
        
            GetTextAfterToc = myfield.Result.Paragraphs(1).Range.Next(unit:=wdParagraph, Count:=1).Text
            Exit Function
            
        End If
        
    Next
    
End Function

【讨论】:

  • 提供的代码给了我目录的第一行和页码,即目录标题之后的文本。我实际上需要获取整个目录之后的文本,即 ActiveDocument.TablesOfContents(n).Range.Text 之后的文本。抱歉,如果问题不清楚。
  • 没关系,感谢您的代码,我想通了。我使用Set toc = ActiveDocument.TablesOfContents(1) afterTOCText = toc.Range.Next(unit:=wdParagraph, Count:=1).Text 来获取所需的文本。
  • 如果你能指导我做一件事,上面的代码只给我一行文字,有没有我可以一次得到两行文字的?
  • 第 1 点。我在发布之前检查了目录字段后的一些隐藏文本,并且代码运行正常。如果代码对您不起作用,那么您的文档中有些内容您没有解释。 Point 2. 我的代码返回toc后第一段的内容。如果你只得到一行,那么这意味着你的两行实际上是两段。因此,当您拥有第一段的范围时,您需要查看下一段的 range.font.hidden 属性并根据需要扩展范围。
  • 第 1 点。我检查了一下,代码只有在目录中只有一个值时才有效。如果目录中有多个级别或值,则代码不起作用,因为我猜它只是搜索第一个字段然后退出,所以它只选择目录中的第一个值,从而显示目录中的第二个值作为输出。如果不知何故,它会选择它可以工作的最后一个 TOC 值。第 2 点。是的,它们是不同的段落,因此不能一次访问。
【解决方案2】:

我找到了我的问题的答案。我发布它是为了帮助其他有类似问题的人。感谢u/slang4201 的回答。

这将选择紧跟 TOC 的两行。

Dim myField As Field
For Each myField In ActiveDocument.Fields
    If myField.Type = wdFieldTOC Then
        myField.Select
        Selection.Collapse wdCollapseEnd
        Selection.MoveDown unit:=wdLine, Count:=2, Extend:=True
        MsgBox (Selection.Range)
        Exit For
    End If
Next myField
End Sub

但是,如果您要查找的行被隐藏,除非您先取消隐藏,否则它们将不会被选中和找到。

ActiveDocument.Range.Font.Hidden = False

希望这会有所帮助,祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多