Vba 保存后禁用子项
我在word中的文档中有此代码。docm: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
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