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个月工作表的预期执行。唯一的区别是创建新图纸按钮不会从模板页面中删除。
答案 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