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

Вы можете пометить все кнопки, используя определенный префикс или суффикс в имени: тогда вы могли бы цикл через все кнопки на листе и удалить все, где имя содержит этот префикс/суффикс. –

+0

Для этого мне понадобится какая-то golbal-переменная, и я пытаюсь избавиться от всех глобальных переменных, поскольку они теряют свою ценность, если есть ошибка в excel. – James

+0

Зачем вам нужна глобальная переменная? Вы этого не сделаете! (Если вы не сосчитаете весь экземпляр Excel как глобальную переменную ...) См. Реализацию @ brettdj. –

ответ

3

Я бы предложил метод Тима с использованием определенного имени - для которого не требуется глобальная переменная. Например, вы могли бы добавить «_ || 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 
+1

Большое спасибо, работала блестяще. – James

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

Смежные вопросы