Vba 保存后禁用子项

Vba 保存后禁用子项,vba,ms-word,Vba,Ms Word,我在word中的文档中有此代码。docm: Private Sub selConcept_Click() 'enable the content field, delete the other two fields, 'and delete the buttons including itself ActiveDocument.ContentControls(3).LockContents = False ActiveDocument.ContentContro

我在word中的文档中有此代码。docm:

Private Sub selConcept_Click()
    'enable the content field, delete the other two fields,
    'and delete the buttons including itself

    ActiveDocument.ContentControls(3).LockContents = False
    ActiveDocument.ContentControls(4).Delete
    ActiveDocument.ContentControls(4).Delete
    ActiveDocument.InlineShapes(3).Delete
    ActiveDocument.InlineShapes(3).Delete
    ActiveDocument.InlineShapes(3).Delete


    End Sub

    Private Sub selTask_Click()

    ActiveDocument.ContentControls(4).LockContents = False
    ActiveDocument.ContentControls(3).Delete
    ActiveDocument.ContentControls(4).Delete

    ActiveDocument.InlineShapes(3).Delete
    ActiveDocument.InlineShapes(3).Delete
    ActiveDocument.InlineShapes(3).Delete


    End Sub

    Private Sub selRef_Click()

    ActiveDocument.ContentControls(5).LockContents = False
    ActiveDocument.ContentControls(3).Delete
    ActiveDocument.ContentControls(3).Delete
    ActiveDocument.InlineShapes(3).Delete
    ActiveDocument.InlineShapes(3).Delete
    ActiveDocument.InlineShapes(3).Delete
    End Sub



    Private Sub formatSaveB_Click()
     With Dialogs(wdDialogFileSaveAs)
            .Format = wdFormatFilteredHTML
            .Show
        End With
End Sub
selConcept、selTask
selRef
是命令按钮,页面上还有三个富文本内容控件。单击这三个命令按钮中的一个将删除自身和其他两个按钮,并删除两个富格文本控件

换句话说:单击任何
sel
按钮都会给您留下一个富文本控件和零个
sel
按钮

formatSaveB
是末尾的另一个命令按钮,与之关联的代码将打开一个对话框以另存为.htm文档

如果用户完成该过程并使用
formatSaveB
按钮进行保存,则一切正常;它将保存为HTM文件

但是,如果可能的话,我希望用户能够保存Word草稿,但是如果我单击了三个
sel
按钮中的一个,那么我会将文档保存为重命名的.docm文件,就像
draft.docm
,然后当我再次打开它时,
formatSaveB
按钮不会起任何作用。在另存为.docm之后,它似乎被完全禁用。即使我从draft.docm ThisDocument页面中删除了所有其他内容,它仍然不起作用

我注意到,如果我只保存为
draft.docm
而不关闭它,那么
formatSaveB
按钮仍然有效

当我尝试调试时,我看到“运行时错误430:Word vba类不支持自动化”

更新:

谢谢Peter,事实上我认为正确的一个是目标,这很棘手,因为当它删除(3)时,下一个就会变成(3),正如你所说的。不过,我想我已经解决了这个问题,在任何情况下,当我单击时,正确的字段都会被删除。停止工作的Format按钮不会被删除,它只是停止工作,并按名称进行选择。它没有选择或删除任何其他控件,只是应该另存为.htm(它会这样做,直到我将.docm另存为草稿)

另一方面,我发现按索引选择确实很痛苦,但我还没有找到按名称选择ContentControls的方法,你能给我一些建议吗?我可以按名称选择按钮,但相同的方法似乎不适用于ContentControls

例如,我有一个使用Word中的设计模式创建的富文本内容控件,如果我右键单击它,我可以给它命名(
Concept
)和标记(
ConceptTag
)。以这种方式命名和标记,这两种方法都不适用:

ActiveDocument.ConceptControls("Concept").Delete

ActiveDocument.ConceptControls("Concept").Select
    Selection.Delete

有没有关于如何按名称选择和删除这些内容的建议?我尝试了一个按标记选择的建议,但也没有成功。

诀窍是标记控件和形状。我的建议(如下所示)是在每个要保留的控件中使用
.Tag
字段。将此字段设置为已知且唯一的字符串(在我的示例中设置为
“KeepThisControl”

然后在代码中,当您循环遍历所有控件时,检查标记并仅删除未标记的控件——并注意控件列表索引

(为了检查您的工作,我在下面添加了许多调试语句,因此请务必删除这些语句。)


ContentControls
InlineShapes
使用数字索引的危险在于,您总是会得到第三个和第四个控件/形状,但无法保证是哪个控件/形状!您需要找到要删除的每个控件和形状的另一个不同方面,并/或在创建它们时为它们指定一个特定的名称。我强烈怀疑您的按钮是
ContentControls(3)
ContentControls(4)
。谢谢Peter,请查看我的更新。
Option Explicit

Const KEEPER_TAG = "KeepThisControl"

Public Sub DeleteControlsAndShapes()
    Dim thisDoc As Document
    Dim totalNotDeleted As Integer
    Dim total As Integer
    Dim i As Integer

    Set thisDoc = ActiveDocument

    '----- delete this after fully debugged -------
    total = thisDoc.ContentControls.Count
    Debug.Print "initial count of ALL    controls = " & thisDoc.ContentControls.Count
    totalNotDeleted = 0
    For i = 1 To total
        If thisDoc.ContentControls(i).Tag = KEEPER_TAG Then
            totalNotDeleted = totalNotDeleted + 1
        End If
    Next i
    Debug.Print "initial count of KEEPER controls = " & totalNotDeleted
    '----- delete this after fully debugged -------

    '--- work up one index at a time and check the tag...
    '      -- advance the index if the tag is a keeper
    '      -- delete the item and keep the index if not
    i = 1
    Do
        If thisDoc.ContentControls(i).Tag = KEEPER_TAG Then
            i = i + 1
        Else
            thisDoc.ContentControls(i).Delete
        End If
    Loop Until (i = thisDoc.ContentControls.Count)

    '----- delete this after fully debugged -------
    Debug.Print "All non-keeper controls deleted!"
    total = thisDoc.ContentControls.Count
    Debug.Print "initial count of ALL    controls = " & thisDoc.ContentControls.Count
    totalNotDeleted = 0
    For i = 1 To total
        If thisDoc.ContentControls(i).Tag = KEEPER_TAG Then
            totalNotDeleted = totalNotDeleted + 1
        End If
    Next i
    Debug.Print "initial count of KEEPER controls = " & totalNotDeleted
    Debug.Print "Finished."
    '----- delete this after fully debugged -------
End Sub