在 VBA Word 2010 中按名称删除命令按钮

Deleting CommandButtons by name in VBA Word 2010

在word模板中,我有两个命令按钮,即

  1. [添加部分] 名为 "CommandButton1"

  2. [完成] - 名为 "CommandButton2"

我需要在单击 [完成] 时删除两个按钮

到目前为止,这是我的代码

Private Sub CommandButton2_Click()

    Dim i As Integer

    For i = ThisDocument.InlineShapes.Count To 1 Step -1

      With ThisDocument.InlineShapes(i)
          If .OLEFormat.Object.Name = "CommandButton1" Then
              .Delete
          End If
       End With
   Next

End Sub

该代码是我在网上找到的片段的组合。我只添加了 "CommandButton1" 用于测试目的,并计划添加对 CommandButton2 的检查(如果可行的话)。

在执行代码时,它成功删除了 CommandButton2,并在不删除 CommandButton1 的情况下给我一个错误“无法在水平线上访问对象”。

我试着弄乱 "count to 1 Step -1" 部分(我不知道他们暗示什么),但结果都是一样的。

for ... next 循环从数组末尾 (ThisDocument.InlineShapes.Count) 到数组开头,以确保遍历所有需要删除的项目。

例如,如果您的数组有 3 个项目,从第一项到最后一项:

  • 对象(1)
  • 对象(2)
  • 对象(3)

通过删除第一项,数组将重新排序,Object(2) 将获得索引 1,Object(3) 将获得索引 2。使用 for ... next 可能会导致问题因为数组中的项目总数与开始循环时不同。

在这种情况下,我宁愿使用 do while ... loop

Private Sub CommandButton2_Click()

    On Error Resume Next
    Err.Clear

    Dim i As Integer
    i = ThisDocument.InlineShapes.Count
    Do While (i > 0)
        If ThisDocument.InlineShapes(i).OLEFormat.ClassType = "Forms.CommandButton.1" Then

            If ThisDocument.InlineShapes(i).OLEFormat.Object.Name = "CommandButton1" _
            Or ThisDocument.InlineShapes(i).OLEFormat.Object.Name = "CommandButton2" Then

                If Err.Number = 0 Then
                    ThisDocument.InlineShapes(i).Delete
                End If
                Err.Clear

            End If

        End If
        i = i - 1
    Loop
End Sub