如何通过标记查找和禁用内容控件以删除它及其内容?

时间:2014-08-08 08:47:20

标签: ms-word word-vba

我有一个不幸的任务是被迫为我公司的设备设计一个基于Word的电子生产卡,尽管我从未使用过VBA。我更愿意在Excel中完成这项工作,因为我不必在页面上的各种表格中与内容控件和难以找到的位置进行斗争,但公司的文档系统会强制使用这一特定的一个在Word中。 / p>

我的问题是,对于生产卡的正确形式,我需要使用表格,并且我需要生产卡是动态的,以将其大小限制为与特定订单相关的操作。我选择的解决方案是创建一个完整的表单,并使用用户表单/提示符,他们可以选择要使用的部分和要忽略的部分,然后将删除已省略的部分。解决方案的部分原因是因为这是他们之前(和基于Excel)的生产卡的工作方式,因此它会使最终用户更熟悉。

因为MS Word很挑剔,我需要在这些表中使用内容控制,不让最终用户意外地破坏它的一半,但是在一整个工作日后我仍然无法弄清楚如何查找和关闭单元格的内容控制在我要删除的表中。我确实标记了内容控件,因为这似乎是找到它们的唯一合理方法。

这是我目前的子程序代码,但由于某些原因我无法通过ccID行获取ID,即使我已经验证了作为参数提供的字符串是正确的。

Private Sub DeleteCCByTag(ccTag As String)
    Dim cc As ContentControl
    Dim ccID As String
    ccID = ThisDocument.SelectContentControlsByTag(ccTag).Item(1).ID
    'MsgBox ccID        'Debug prompt
    Set cc = ThisDocument.ContentControls(ccID)
    cc.LockContentControl = False
    cc.LockContents = False
    cc.Delete (False)
End Sub

2 个答案:

答案 0 :(得分:1)

首先 - 您的代码正在为我找到但是......

  1. ContentControls tag区分大小写,可能会出现问题

  2. 您可以通过以下方式搜索ID值来解决问题:

    Private Sub DeleteCCByTag_Alternative(ccTag As String)
    
        Dim cc As ContentControl
        Set cc = ThisDocument.SelectContentControlsByTag(ccTag).Item(1)
    
        With cc
    
            .LockContentControl = False
            .LockContents = False
    
            .Range.Delete               'to delete CC content
    
            .Delete (False)
        End With
    End Sub
    
  3. 代码中的
  4. CC.Delete仅删除ContentControl objects本身,但不删除其内容。要删除内容,您需要添加我在上面的代码中添加的其他行。

答案 1 :(得分:0)

我会将此作为对KazJaw答案的评论,但我没有代表。

根据Microsoft的documentation,如果您将True传递给Delete方法,则会删除内容控件及其内容。

所以:只要像KazJaw所展示的那样获得该项目,而不是跳过获取其ID的箍:

Set cc = ThisDocument.SelectContentControlsByTag(ccTag).Item(1)

然后在上面调用.Delete(True)。