问题描述
如果我有一个标题为“ 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
如果您的文档不受保护,则可以使用右键单击上下文菜单来添加和删除项目。
没有简单的方法来检测选择是否在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