VBA删除一个范围的button

我想弄清楚如何删除范围内的所有button。 我已经看到了很多关于如何删除表单内的所有button但不是范围的例子。 我创build了一个范围variables,包含每个可能发生的button(这是用来重新初始化一个可变大小的forms)。 问题是,范围不支持对象.Shapes或.Buttons。

Set totalTable = Range(ActiveCell, ActiveCell.Cells(1000, 1000)) For Each gen_btn In totalTable.Shapes gen_btn.Delete Next 

任何帮助,将不胜感激。 另外,我不能使用ActiveSheet,因为有我想要保留的button,因为一个button调用macros。 因此需要一个范围。 谢谢。

此解决scheme使用Intersect方法来查看该形状是否在您的范围内,如果是,则删除该形状。

 Sub Delete_Shapes_In_Range() Dim btn As Shape Dim totalTable As Range Set totalTable = Range(ActiveCell, ActiveCell.Cells(1000, 1000)) For Each btn In ActiveSheet.Shapes If Not Intersect(btn_rng, totalTable) Is Nothing Then btn.Delete Next btn End Sub 

请注意,此代码不仅会删除button,还会删除其他形状。 如果这是一个问题,您可以添加一个If语句来跳过某些形状。 例如:

 If Not btn.Name Like "Picture*" Then '<~~Will skip pictures 

要么

 If Not btn.Name Like "*box*" Then '<~~Will skip textboxes 

等等。这假设你自创build它们以来没有重新命名这些形状。

我会告诉你如何提取一个button的“位置”(这不是最佳的,但它的工作原理)。 让你去适应它,使其工作,因为它应该。 这将在连续的消息框中显示每个button所触及的左上angular单元格的行和列(在ActiveSheet )。

 Sub Testing() For Each butt In ActiveSheet.Buttons MsgBox "Row : " & butt.TopLeftCell.Row & vbCrLf & "Column : " & butt.TopLeftCell.Column Next butt End Sub 

完整的代码:

 Sub DeleteRangeButtons() rng = "A1:A10" ' Place range here. Dim btn As Button, ws As Worksheet For Each ws In ActiveWorkbook.Worksheets For Each btn In ws.Buttons If isinrange(btn.TopLeftCell.Row, btn.TopLeftCell.Column, rng) Then btn.Delete End If Next btn Next ws End Sub Function isinrange(x, y, rng) Cells(x, y).Activate If Intersect(ActiveCell, Range(rng)) Is Nothing Then isinrange = False Else isinrange = True End If End Function 

评论ARICH的答案(对我有用),因为我不能直接添加评论。 它错过了设置btn_rng,但是可以使用btn.TopLeftCell。 此外,我更喜欢btn.Type = msoPicture而不是btn.Name像“图片。

这是我的方法基于:

 Public Sub DeleteIntersectingPictures(ByVal sheetToDeleteIn As Worksheet, ByVal rangeToLookIn As range) Dim noOfRowsInSheet As Long Dim pictureItem As Shape Dim pictureRange As range For Each pictureItem In sheetToDeleteIn.Shapes If pictureItem.Type = msoPicture Then Set pictureRange = sheetToDeleteIn.range( _ pictureItem.TopLeftCell.Address & ":" & pictureItem.BottomRightCell.Address) If Not Intersect(pictureRange, rangeToLookIn) Is Nothing Then Call pictureItem.Delete End If End If Next pictureItem End Sub