Страница 1 из 1

Добавление элементов (контроллов) в Excel на этапе выполнени

Добавлено: 12 апр 2005, 10:34
mouse
Возникла такая ситуация - есть форма (frmglav), на ней существует фрейм (Frame1). Необходимо во фрейм во время открытия формы добавить контролл (кнопку).

private sub frmglav_activate()
dim mybutton as MSForms.CommandButton

set mybutton = frmglav.Frame1.Controls.Add("Forms.CommandButton.1", "mybutton", True)

End Sub

Все замечательно, кнопка добавляется. Но возникает другая проблема - каким образом прописать процедуру выполнения кода по событию клика на этой кнопке.
Если написать в модуле формы

Private Sub mybutton_Click()
msgbox "dsfjklsajdsajksafd"
End Sub
, то ничего не происходит.

Кто-нибудь сталкивался с подобной проблемой? Каким образом можно добавить процедуру?

Добавлено: 12 апр 2005, 15:02
Zigi
Как вариант, можно заранее нарисовать кнопку, написать в ней код,
и поставить Visible=false. А потом когда настанет момент отобразить кнопку соответсвенно поставить Visible=true.

Добавлено: 12 апр 2005, 15:54
mouse
С этим все понятно.
Но вот если таких кнопок в поле Frame должно быть несколько? И точное количество их неизвестно. Ведь массив из котроллов в VBA не сделаешь, по-моему?

Если представить, что нужно будет загодя рисовать двадцать пять кнопок, и для каждой из них писать процедуру...

Добавлено: 12 апр 2005, 16:44
Игорь Акопян
насколько я знаю массив контролов как раз можно сделать, только надо книгу смотреть, так не вспомню. Там нескольким контролам даётся имя одинаковое и потом обращаешься к ним как к массиву

Добавлено: 12 апр 2005, 17:25
mouse
Не знаю...
Ведь в классическом Visual Basic'e массив действительно можно организовать таким способом. Сделать один контрол, у которого обязательно должен присутствовать index, равный нулю. Последующие элементы массива контролла можно объявлять с помощью функции Load. Выкидывать из массива можно с помощью Unload.

Добавлено: 12 апр 2005, 20:11
Дмит
Как пример кнопки на форме:
код формы

Код: Выделить всё

Private Sub UserForm_Initialize()
Dim cm As MSForms.CommandButton, i As Long
For i = 0 To 3
    Set cm = UserForm1.Controls.Add("Forms.CommandButton.1")
    cm.Top = i * 30
    cm.Caption = i
ReDim Preserve Massiv(i)
    Set Massiv(i).cmd = cm
Next
End Sub
код модуля

Код: Выделить всё

Public Massiv() As New Class1
код класс модуляClass1

Код: Выделить всё

Public WithEvents cmd As MSForms.CommandButton
Private Sub cmd_Click()
    MsgBox cmd.Caption
'***Можно разместить Select от cmd.Caption
End Sub

Добавлено: 12 апр 2005, 20:21
mouse
Спасибо, попробую.

Но, похоже, то, что нужно.