在 VBA 中添加/删除书签后删除多余的行

问题描述

在我的 Word 模板中,我有几个要点,我将根据从 GUI 中的选择选择所需的点,并删除未从代码中选择的其余点。所以这取决于用户他会选择多少点。

  • 我很高(书签 1)
  • 我是黑暗的(书签 2)
  • 我身高 6.2 英尺(书签 3)
  • 我有宝马(书签 4)
  • 我知道 5 种不同的语言(书签 5)

我已经为所有这些点创建了书签,如上面的大括号所示。

现在的问题是,用户从上面的列表中选择了几个要点,输出会在下面留下一个额外的空行。

我尝试了许多方法,从更改书签的选择到在代码添加项目符号。我需要去掉多余的空行。
但似乎没有任何效果。我会很感激这方面的帮助。 TIA

If .cboChanges1.Value = "No" Then
     DeleteBookmark ("bookmark1")
Else
     AddBullet ("bookmark1")
End If
If .cboChanges2.Value = "No" Then
     DeleteBookmark ("bookmark2")
Else
     AddBullet("bookmark2")     
End If

etc.. 其中 cboChanges1 和 cboChanges2 是选择是/否的组合框。

Sub DeleteBookmark(strBookmark As String)
    Dim rng As Range
    Set rng = ActiveDocument.Bookmarks(strBookmark).Range
    rng.Delete
    Set rng = nothing
End Sub

截图前

enter image description here

前 3 个选项后的输出屏幕,您可以看到突出显示的额外空白行

enter image description here

我是动态添加项目符号的,如下

Sub AddBullet(strBookmark As String)
    ActiveDocument.Bookmarks(strBookmark).Select
    Selection.Range.ListFormat.ApplyBulletDefault
End Sub

这就是书签的排列方式,

enter image description here

解决方法

表格单元格总是包含一个单元格结束标记,它是段落和单元格结束标记的组合。这意味着一个空单元格总是至少包含一个段落。

当您删除最后一个书签中的文本时,无法删除单元格标记的结尾,您将得到一个空段落,因为前一个书签范围以段落标记结束。 enter image description here

您可以在 DeleteBookmark 例程中通过检查单元格最后一段的长度来处理此问题。如果它只包含两个字符,则它没有文本,可以删除前面的段落标记。

Sub DeleteBookmark(strBookmark As String)
   Dim rng As Range
   Set rng = ActiveDocument.Bookmarks(strBookmark).Range
   rng.Delete
   Set rng = rng.Cells(1).Range.Paragraphs.Last.Range
   If Len(rng.Text) = 2 Then
      'paragraph contains no text so delete preceding paragraph mark
      rng.Collapse wdCollapseStart
      rng.MoveStart wdCharacter,-1
      rng.Delete
   End If
   Set rng = Nothing
End Sub

如果您要为 Word 编写代码,则需要了解格式标记是什么,以便了解文档的构造方式。

仅供参考 没有必要选择一个范围来应用项目符号。

Sub AddBullet(strBookmark As String)
    ActiveDocument.Bookmarks(strBookmark).Range.ListFormat.ApplyBulletDefault
End Sub