【问题标题】:Word 2016- Deleting last and current sections one by one in RSCC VBAWord 2016-在RSCC VBA中一一删除最后和当前部分
【发布时间】:2020-10-27 04:47:13
【问题描述】:

如果我有一个名为“常规”的特定 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

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

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

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

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

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

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

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

    显然你想做的事情可以概括为:

    如果有多个RepeatingSectionItem,则删除最后一个。

    您需要使用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
    

    【讨论】:

    • @TimothyRylatt-感谢您的帮助。抱歉,我忘了提到我正在尝试删除选定的部分,而文档受到保护,只允许填写表格。
    • @MohamadBachrouche - 请花时间阅读 How do I ask a good question?,然后阅读 edit 您的问题以包含所有相关信息。
    • @TimothyRylatt-再次感谢蒂莫西!我已经编辑了我的问题
    • @TimothyRylatt- 谢谢先生!有没有办法删除具有特定名称的选定常规内容控件(不重复)(我当然会问一个新问题)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多