Удаление коллекций кнопок VBA - PullRequest
4 голосов
/ 17 января 2012

Я использую следующий скрипт для создания кнопок в Excel, диапазон - это то место, где я бы хотел разместить его.

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

Единственная проблема, я хотел бы метод, который может удалить все кнопки, созданные этим методом? Я хочу избежать глобальных переменных, если это возможно. Любая помощь будет принята с благодарностью. Джеймс

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Я бы предложил метод Тима, использующий конкретное имя, которому не нужна глобальная переменная. Например, вы можете добавить "_ || ForDeletion" суффикс к каждому имени кнопки и затем искать его в подпрограмме удаления

 .Name = "Add_||ForDeletion"

Кнопка Forms предоставляет другую альтернативу, хотя (без каламбура) вы можете сохранить текстовую строку в AlternativeText в «Свойствах», затем «Веб» и использовать ее в качестве идентификатора для процедуры удаления.

Процедура удаления внизу работает в обратном направлении, чтобы избежать ошибок при циклическом переключении диапазона

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
0 голосов
/ 17 января 2012

Кнопки в 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, по-видимому, является типом для всех элементов управления Form и ActiveX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...