保存

时间:2015-05-03 19:43:19

标签: vba ms-word word-vba

我在ThisDocument中有一个单词.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, selTaskselRef是命令按钮,页面上还有三个富文本内容控件。单击这三个命令按钮之一将删除自身和另外两个按钮,并删除两个富文本控件。

换句话说:点击任意sel按钮,您将获得一个富文本控件和零sel个按钮。

formatSaveB是最后的另一个命令按钮,与之关联的代码会打开一个对话框以保存为.htm文档。

如果用户完成整个过程并使用formatSaveB按钮保存,则一切正常;它被保存为HTM文件。

我希望用户能够保存Word草稿,但如果可能的话,如果我点击了三个sel按钮中的一个,那么我将文档保存为重命名的.docm文件,如{{ 1}},然后当我再次打开它时,draft.docm按钮什么都不做。保存为.docm后似乎完全禁用。即使我从draft.docm ThisDocument页面中取出其他所有内容,它仍然无法正常工作。

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

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

更新

谢谢Peter,实际上我认为正确的目标是有针对性的,这很棘手,因为当它删除(3)时,那么下一个变成(3),正如你所说。我想我已经解决了这个问题,无论如何,当我点击时,正确的字段会被删除。停止工作的格式按钮不会被删除,它只是停止工作,并且它是按名称选择的。它不是选择或删除任何其他控件,它只是保存为.htm(它确实存在,直到我将.docm保存为草稿。)

另一方面,我确实发现通过索引选择了一个痛苦,但我还没有找到一种方法来按名称选择ContentControls,你能建议吗?我可以按名称选择按钮,但同样的方法似乎不适用于ContentControls。

例如,我有一个Rich Text内容控件,使用Word中的设计模式创建,如果我右键单击它,我可以给它命名(formatSaveB)和标记({{1} })。以这种方式命名和标记,这些都不起作用:

Concept

有关如何按姓名选择和删除这些建议的任何建议?我尝试了按标签选择的建议,它也没有用。

1 个答案:

答案 0 :(得分:1)

诀窍是标记你的控件和形状。我的建议(并在下面的解决方案中显示)是在您要保留的每个控件中使用.Tag字段。将此字段设置为已知且唯一的字符串(在我的示例中设置为"KeepThisControl")。

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

(我在下面包含了很多调试语句来检查你的工作,所以一定要删除它们。)

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