Word 2016-在RSCC VBA中一一删除最后和当前部分

问题描述

如果我有一个标题为“ General”的特定RSCC,其中有五个部分(1,2,3,4,5),则运行以下macro2会删除最后一个部分,剩下4个部分(1,4)。如果我继续逐个运行宏,它将变为(1,3),然后变为(1,2),然后在(1)处停止。完美。

Sub Macro2()

'
Set repCC = ActiveDocument.SelectContentControlsByTitle("General").Item(1)
Dim index As Long
For index = repCC.RepeatingSectionItems.Count To 2 Step -5
  repCC.RepeatingSectionItems.Item(index).Delete
Next index
 '
End Sub

但是,如果我要添加另外两个部分,总共七个部分,则运行macro2将删除第二个和第七个部分,然后开始从第六个部分开始逐个删除。为了让它仅从第7部分(而不是第2部分)开始逐个删除部分,我必须将代码For index = repCC.RepeatingSectionItems.Count To 2 Step -5更改为For index = repCC.RepeatingSectionItems.Count To 2 Step -7

如果我要为总共9个部分添加另外两个部分,运行macro2将删除第2个和第9个部分,然后开始一个一个删除第8个部分。为了让它仅从第9部分开始删除部分,而不是从第2部分开始删除,我必须将代码For index = repCC.RepeatingSectionItems.Count To 2 Step -7更改为For index = repCC.RepeatingSectionItems.Count To 2 Step -9

问题1:如何随机添加和减去部分,何时运行macro2并仅从最后一部分(不是第二部分)开始逐个删除,回到第一部分,所以我不必手动进行每次更改都编辑步骤吗?

问题2:如何仅在文档受保护的情况下才能选择任何部分并删除所选的RSCC?

解决方法

您似乎不了解Step循环中的For值是如何工作的。

For index = repCC.RepeatingSectionItems.Count To 2 Step -5从末尾开始,一直向后工作直到达到2。因此,对于包含 n 个项目的集合,它从 n 开始,然后返回, n -5, n -10等,直到达到2。

显然,您想要做的事情可以概括为:

如果重复的重复项超过一个,则删除最后一个。

您需要使用If语句来做到这一点,而不是循环

Sub DeleteLastRepeatingSectionItem()
   Dim repCC As ContentControl
   Set repCC = ActiveDocument.SelectContentControlsByTitle("General").Item(1)
   If repCC.RepeatingSectionItems.Count > 1 Then _
      repCC.RepeatingSectionItems.Item(repCC.RepeatingSectionItems.Count).Delete
End Sub

如果您的文档不受保护,则可以使用右键单击上下文菜单来添加和删除项目。

enter image description here

没有简单的方法来检测选择是否在RepeatingSectionItem内,并且由于RSI通常包含其他ContentControl,因此识别需要删除的RSI所需的代码并不简单。

Sub DeleteSelectedRepeatingSection()
   Dim cc As ContentControl
   If Selection.Information(wdInContentControl) Then
      Set cc = Selection.ParentContentControl
      If Not cc.Type = wdContentControlRepeatingSection Then
         Do Until cc.Type = wdContentControlRepeatingSection
            Set cc = cc.ParentContentControl
         Loop
      End If
      'loop through the repeatingsectionitems to find the one that selection is in
      Dim rsi As RepeatingSectionItem
      For Each rsi In cc.RepeatingSectionItems
         If Selection.Range.InRange(rsi.Range) Then
            rsi.Delete
            Exit For
         End If
      Next rsi
   End If
End Sub