【问题标题】:Word VBA: How to Fix FOR EACH loop to add bookmark to each sentence?Word VBA:如何修复 FOR EACH 循环为每个句子添加书签?
【发布时间】:2020-02-19 15:12:45
【问题描述】:

在 Word docx 中:我正在尝试为每个句子添加书签。例如,第一句是书签“bmarkpg01”,第二句是书签“bmarkpg01ln01col01”。我的代码只在第一句话中添加了一个书签,并且不会循环到文档末尾。

我尝试了一个 for each 循环来尝试每个发送的句子和书签中的每个 bmark。

Sub tryAddBmarkatSentence()
Dim myRange As Range
Set myRange = ActiveDocument.Content
Dim bmark As Bookmark

Application.ScreenUpdating = False

For Each MySent In ActiveDocument.Sentences
    For Each bmark In ActiveDocument.Bookmarks
        ActiveDocument.Bookmarks.Add Name:="pmark" & bmark.Range.Information(wdActiveEndAdjustedPageNumber), Range:=myRange 'bmark name would have added info of page, line, and col number. here as example is pagenumber.

    Next
Next

End Sub

预期结果:在整个文档中,每个句子都有对应的书签和书签名称(“bmarkpg01ln01col01”、“bmarkpg01ln02col10”等)

实际结果:文档的第一句只添加了一个书签。

【问题讨论】:

  • 嗨。你有一个双每个,所以,如果一个句子和一个书签存在,它只会添加一个书签。你必须只获取句子,然后添加书签
  • 谢谢,路易斯。那么如何更新上面的代码呢?
  • 您应该知道,Word 并不能真正理解句子,因此您得到的结果可能不是您所期望的。段落是,句子没有。
  • 好点。没有考虑句子的名称。可能会尝试为每个段落创建一个书签,然后尝试另一种策略。受托人的目标是在不超载系统资源的情况下尽可能细化地找到重叠文本
  • Blasted android 自动更正。 *句子问题。 **终极目标

标签: vba for-loop ms-word bookmarks


【解决方案1】:

就问题中的要求而言,以下内容对我有用。

请记住将Option Explicit 放在代码页的顶部。这将强制您声明(“Dim”)变量,但也可以节省时间和麻烦,因为它可以防止拼写错误并警告您其他问题。

Word 中的Sentence 返回一个Range 对象,因此下面的代码 delares MySent As Range。这为Bookmarks.Add 方法提供了目标Range。

如果您不会对书签做任何其他事情,那么在添加书签时,Set bkm = 并不是绝对必要的。我把它留在了,因为它是在问题的代码中声明的。

没有必要循环书签集合 - 特别是因为没有书签 - 它们正在被添加。

我还添加了一些代码来命名书签。

Sub tryAddBmarkatSentence()
    Dim doc As Word.Document
    Dim MySent As Word.Range
    Dim bmark As Bookmark

    Application.ScreenUpdating = False
    Set doc = ActiveDocument

    For Each MySent In doc.Sentences
        Set bmark = doc.Bookmarks.Add(Name:="bmark" & _
        MySent.Information(wdActiveEndAdjustedPageNumber) & "_" &_
        MySent.Information(wdFirstCharacterLineNumber) & "_" & _
        MySent.Information(wdFirstCharacterColumnNumber), Range:=MySent)
        'bmark name would have added info of page, line, and col number. here as example is pagenumber.
    Next

End Sub

【讨论】:

    【解决方案2】:

    你可以这样试试

    Sub tryAddBmarkatSentence()
    Dim myRange As Range
    Set myRange = ActiveDocument.Content
    Dim bmark As Bookmark
    
    Application.ScreenUpdating = False
    
    For Each MySent In ActiveDocument.Sentences
    
            ActiveDocument.Bookmarks.Add ... and the rest of the code.
            //i dont know how you define witch bookmark is to asign to that sentence
    
    Next
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      相关资源
      最近更新 更多