2012-01-17 118 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