2012-01-17 87 views
3

我使用以下脚本来生成Excel中的按钮,范围正是我希望放置的位置。删除VBA按钮集合

Sub CreateAddButton(rng As Range) 
    Dim btn As Button 
    With Worksheets("User") 
     Set btn = .Buttons.Add(rng.Left, rng.Top, rng.width, rng.Height) 
     With btn 
      .name = "Add" 
      .Caption = "Add Column" 
      .OnAction = "CreateVariable" 
     End With 
    End With 
End Sub 

唯一的问题是,我想要一个方法,可以删除由此方法产生的所有按钮?如果可能的话,我想避开全局变量。任何帮助将受到感谢。 James

+3

您可以通过在名称中使用特定的前缀或后缀标记所有按钮:那么你可以循环通过工作表上的所有按钮并删除名称中包含该前缀/后缀的任何地方。 – 2012-01-17 17:49:57

+0

我想给你一些golbal变量来做到这一点,我试图摆脱所有的全局变量,因为如果在Excel中有错误,它们将失去它们的价值。 – James 2012-01-18 09:14:07

+0

为什么你需要一个全局变量来做到这一点?你不要! (除非您将整个Excel实例作为全局变量计数......)请参阅@ brettdj的实现。 – 2012-01-18 11:36:53

回答

3

我建议蒂姆的方法使用一个特定的名称 - 这不需要一个全局变量。例如,你可以后缀添加 “_ || ForDeletion”每个按钮的名称,然后寻找它在删除程序

.Name = "Add_||ForDeletion" 

一个Forms按钮确实提供了另一种选择,但(没有双关语意),你可以将文本存储在AlternativeText下的“属性”和“Web”下,并将其用作删除例程的标识符。

在底部的删除程序在后台工作来避免错误通过一系列循环时

enter image description here

Sub TesMe() 
    Call CreateAddButton([a2]) 
End Sub 

Sub CreateAddButton(rng As Range) 
    Dim btn As Button 
    With Worksheets("User") 
     Set btn = .Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height) 
     With btn 
      .Name = "Add" 
      .Caption = "Add Column" 
      .OnAction = "CreateVariable" 
      .ShapeRange.AlternativeText = "MyCollection" 
     End With 
    End With 
End Sub 


Sub GetMyButtons() 
    Dim btns As Object 
    Dim lngRow As Long 
    Set btns = Sheets("User").Buttons 
    For lngRow = btns.Count To 1 Step -1 
     If btns(lngRow).ShapeRange.AlternativeText = "MyCollection" Then 
      MsgBox "Found one", vbCritical 
      btns(lngRow).Delete 
     End If 
    Next 
End Sub 
+1

非常感谢,工作出色。 – James 2012-01-18 14:25:29

0

VBA中的按钮位于Shapes集合中。您可以使用:

Sub deleteButtons() 
Dim btn As Shape 

For Each btn In ActiveSheet.Shapes 
    If btn.AutoShapeType = msoShapeStyleMixed Then btn.Delete 
Next 

End Sub 

msoShapeStyleMixed似乎是所有表格和ActiveX控件的类型。

+0

这会很棒,但我需要在页面上保留一些按钮。我认为唯一可以识别我想删除的按钮的方法是通过名称或标题属性。 – James 2012-01-18 09:15:12