VBA:ToggleFormsDesign后代码未运行

时间:2016-06-22 14:06:22

标签: vba ms-word word-vba

我在VBA(MS Word)中有以下代码,这是在我点击一个名为 cmdFormPreencher 的按钮后插入我的文档中运行的:

Private Sub cmdFormPreencher_Click()
'
If ActiveDocument.FormsDesign = False Then
    ActiveDocument.ToggleFormsDesign
End If
'
ThisDocument.cmdFormPreencher.Select
ThisDocument.cmdFormPreencher.Delete

ActiveDocument.ToggleFormsDesign

'
UserForm2.Show
End Sub

上面代码的目的是删除插入到我的文档中的按钮。 但是当我运行代码时,只选择了按钮。当我试图通过调试弄清楚发生了什么时,它向我展示了代码运行到ActiveDocument.ToggleFormsDesign并且没有运行剩余的代码

这是VBA的错误,还是我做错了什么?如果是这样,我该如何解决这个问题?

谢谢!

注意:ActiveX按钮不在页眉和页脚中。文本换行设置为在文本前面

修改

当我尝试运行一个宏,激活FormDesign,选择ActiveX按钮然后删除时,我得到这个代码:

Sub Macro1()
'
' Macro1 Macro
'
'
    ActiveDocument.ToggleFormsDesign
    ActiveDocument.Shapes("Control 52").Select
    Selection.ShapeRange.Delete
    ActiveDocument.ToggleFormsDesign
End Sub

但是当我运行此代码时没有任何反应......

1 个答案:

答案 0 :(得分:1)

这是设计的。当Office应用程序处于设计模式时,代码不应在作为文档一部分的ActiveX对象上运行。

我认为这是一个ActiveX按钮,在这种情况下,它是InlineShapes或Shapes集合的一个成员 - Word像图形对象一样处理它。删除图形表示就足够了,您可以通过将其更改为显示为图标而不是按钮来实现。

例如,对于InlineShape:

Sub DeleteActiveX()
  Dim ils As word.InlineShape

  Set ils = ActiveDocument.InlineShapes(1)
  ils.OLEFormat.DisplayAsIcon = True
  ils.Delete
End Sub

您只需要弄清楚如何识别InlineShape或Shape。你可以为InlineShape添加书签;一个Shape有一个Name属性。

编辑:由于根据评论中提供的后续信息,您有一个Shape对象,而不是InlineShape,以下方法应该有效:

Dim shp As word.Shape

Set shp = ActiveDocument.Shapes("Shape Name") 'Index value can also be used
shp.Delete

请注意,Word会自动为Shape.Name属性分配内容,但在ActiveX控件的情况下,这些名称可能会因 无理由而更改。因此,如果您使用其名称而不是索引值来识别控件,那么自己分配一个名称要好得多,哪个Word不会“突发奇想”改变。

  1. 激活设计模式。
  2. 点击控件将其选中
  3. 转到VB编辑器窗口
  4. Ctrl + G将焦点放在“立即窗口”
  5. 键入以下内容(替换您想要的名称),然后按Enter键执行:

    Selection.ShapeRange(1).Name =“要分配的名称”

  6. 在上面的代码中使用此Name