【问题标题】:Deleting a section from a Word document based on heading根据标题从 Word 文档中删除部分
【发布时间】:2021-01-04 09:12:26
【问题描述】:

我的目标是根据用户输入从 Excel 文档中删除部分,但我没有看到在 Word 文档中选择特定部分并将其删除的方法。

我所说的部分是指标题部分,例如标题 12.4 有文字,我想删除整个部分 (12.4)。

在 Word 中删除部分时使用的代码:

Selection.Delete Unit:=wdCharacter, Count:=1

如何使这个特定于文档中的某个部分?

有没有办法在 VBA 中定义文档中的部分,然后在类似于上面的代码行中调用它们?

【问题讨论】:

    标签: excel vba ms-word


    【解决方案1】:

    删除与特定标题相关的所有内容非常简单:

    Sub DeleteHeadingRange()
    Selection.Range.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel").Text = vbNullString
    End Sub
    

    警告:与特定标题关联的文本涵盖从当前或前一个标题到下一个相同或更高级别的所有内容(即标题 1 高于标题 2) .

    【讨论】:

      【解决方案2】:

      您需要注意您的术语,因为“部分”一词在 Word 中具有非常特定的含义,该含义与标题无关。

      我假设您的用户正确使用了标题,而不仅仅是在一行文本中添加了一个数字。在这种情况下,以下子将删除同一大纲级别的两个段落之间的一段文本(包括起始文本)。

      Option Explicit
      
      Public Sub ttest()
          RemoveSectionUsingParagraphLevel Selection.Range
      End Sub
      
      Public Sub RemoveSectionUsingParagraphLevel(ByVal ipRange As Word.Range)
      
          ' Heading level 1 = outline level 1
          ' Heading level 9 = outline level 9
          ' normal text = outline level 10
      
          Dim myLevel As Long
          myLevel = ipRange.Paragraphs.Item(1).OutlineLevel
      
          Dim myStart As Long
          myStart = ipRange.Start
      
          ipRange.Collapse direction:=wdCollapseEnd
      
          Do
      
              ipRange.MoveStart unit:=wdParagraph
      
          Loop Until ipRange.Paragraphs.Item(1).OutlineLevel = myLevel
      
          ipRange.Document.Range(Start:=myStart, End:=ipRange.Start - 1).Delete
      
      End Sub
      

      【讨论】:

      • 当然,用 Find 替换循环会稍微快一些。
      • 嗨,术语的道歉!用户确实使用了word中的预设标题。我的问题是如果我使用此代码,我可以删除第 12.4 节但保留第 12.5 节吗?
      • 是和不是。标题 12.4 和最多 12.5 的文本将被删除,但如果标题使用正确,12.5 将自动重新编号为 12.4。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多