Word 2016-在RSCC VBA中逐个删除最后一节和当前节

Word 2016-在RSCC VBA中逐个删除最后一节和当前节,vba,ms-word,Vba,Ms Word,如果我有一个名为“General”的特定RSCC,它有五个部分(1,2,3,4,5),那么运行下面的宏2会删除最后一个部分,留下4个部分(1,2,3,4)。如果我继续一个接一个地运行宏,它将变为(1,2,3),然后再次变为(1,2),然后在(1)处停止。太好了 Sub Macro2() ' Set repCC = ActiveDocument.SelectContentControlsByTitle("General").Item(1) Dim index As Long

如果我有一个名为“General”的特定RSCC,它有五个部分(1,2,3,4,5),那么运行下面的宏2会删除最后一个部分,留下4个部分(1,2,3,4)。如果我继续一个接一个地运行宏,它将变为(1,2,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将删除第2和第7部分,然后开始逐个删除第6部分。要让它从第7节(而不是第2节)开始逐个删除节,我必须将代码从index=repCC.RepeatingSectionItems.Count的
更改为2步骤-5
到index=repCC.RepeatingSectionItems.Count的
更改为2步骤-7

如果我要为总共九个部分添加另外两个部分,运行macro2将删除第2和第9部分,然后开始逐个删除第8部分。要让它从第9节(而不是第2节)开始逐个删除节,我必须将代码从index=repCC.RepeatingSectionItems.Count的
更改为2步骤-7
到index=repCC.RepeatingSectionItems.Count的
更改为2步骤-9

问题1:我如何随机添加和减去部分,何时运行macro2并开始仅从最后一部分(而不是第二部分)逐个删除,备份到第一部分,这样我就不必在每次更改时手动编辑步骤


问题2:如何仅在文档受保护时选择任何节并删除所选RSCC?

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

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

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

如果有多个RepeatingSectionItems,请删除最后一个

要做到这一点,需要使用
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
如果您的文档不受保护,您可以使用右键单击上下文菜单添加和删除项目

没有简单的方法可以检测选择是否在
RepeatingSectionItem
中,并且由于RSI通常包含其他内容控件,因此识别需要删除的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

@提摩太-谢谢你的帮助。很抱歉,我忘了提及我正试图删除一个选定的部分,而文档被保护为只允许填写表单。@MohamadBachrouche-请花时间阅读,然后您的问题包括所有相关信息。@Timothyrylat-再次感谢Timothy!我已经编辑了我的question@TimothyRylatt-谢谢你,先生!是否有方法删除具有特定名称的选定常规内容控件(不重复)(当然我会问一个新问题)?