我在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, selTask
和selRef
是命令按钮,页面上还有三个富文本内容控件。单击这三个命令按钮之一将删除自身和另外两个按钮,并删除两个富文本控件。
换句话说:点击任意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
有关如何按姓名选择和删除这些建议的任何建议?我尝试了按标签选择的建议,它也没有用。
答案 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