旧代码1004、424,-2147024809中的新运行时错误(80070057)

时间:2018-08-01 15:28:20

标签: excel vba excel-vba

Windows 10,Excel 2016该代码位于模块中。

三年前,此代码有效。现在它会引发错误。错误消息的文本与其他具有相同错误代码的线程的文本不同。

代码尝试找到一个按钮并将其删除。每个工作表只有一个按钮。

DeleteShapesByCaption "Create a new Schedule of Values tab", wSht

Sub DeleteShapesByCaption( _
    ByVal Caption As String, _
    Optional ByVal WS As Worksheet = Nothing)
    Dim Shp As Shape
    If WS Is Nothing Then Set WS = ActiveSheet
    WS.Unprotect Protect_Password
    For Each Shp In WS.Shapes
        'What kind of shape is it?
        Select Case Shp.Type
        Case msoOLEControlObject
            'May be a commandbutton
            If Shp.OLEFormat.Object.Object.Caption = Caption Then
                Shp.Delete  'This is where the error occurs
            End If
            Exit For
        Case msoFormControl
            'May be a button
            If Shp.OLEFormat.Object.Caption = Caption Then Shp.Delete
        End Select
    Next
    wSht.Protect Protect_Password
End Sub

该错误总是发生在Shp.Delete

  

需要RTE 404对象

     

RTE -2147024809(80070057)指定的值超出范围

上下文:

工作簿中有一个工作表,它是一个模板。填写完模板后,将其复制到第1个月。完成第1个月的工作表后,单击“创建新工作表”按钮以为第2个月创建新工作表,并且应该删除“创建新工作表”按钮从第一个月开始。每张纸只有一个按钮。

我已经使用debug.print确认活动表是上个月的表。

此代码在2015年正常工作。我修改了单元格公式以反映立法的变化,但我认为这些变化并不重要,因为现在甚至2015年的工作簿都产生了错误。

代码按创建第1个月工作表的预期执行。唯一的区别是创建新图纸按钮不会从模板页面中删除。

1 个答案:

答案 0 :(得分:0)

遍历一个集合以删除某些成员时,向后工作比较安全:

DeleteShapesByCaption "Create a new Schedule of Values tab", wSht

Sub DeleteShapesByCaption( _
    ByVal Caption As String, _
    Optional ByVal WS As Worksheet = Nothing)
    Dim Shp As Shape, i as Long
    If WS Is Nothing Then Set WS = ActiveSheet
    WS.Unprotect Protect_Password

    For i = WS.Shapes.Count To 1 Step -1

        Set Shp = WS.Shapes(i)
        'What kind of shape is it?
        Select Case Shp.Type
        Case msoOLEControlObject
            'May be a commandbutton
            If Shp.OLEFormat.Object.Object.Caption = Caption Then
                Shp.Delete  'This is where the error occurs
            End If
            Exit For
        Case msoFormControl
            'May be a button
            If Shp.OLEFormat.Object.Caption = Caption Then Shp.Delete
        End Select

    Next i

    wSht.Protect Protect_Password
End Sub