Возникла такая ситуация - есть форма (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
, то ничего не происходит.
Кто-нибудь сталкивался с подобной проблемой? Каким образом можно добавить процедуру?
Добавление элементов (контроллов) в Excel на этапе выполнени
Модератор: Naeel Maqsudov
Как вариант, можно заранее нарисовать кнопку, написать в ней код,
и поставить Visible=false. А потом когда настанет момент отобразить кнопку соответсвенно поставить Visible=true.
и поставить Visible=false. А потом когда настанет момент отобразить кнопку соответсвенно поставить Visible=true.
С этим все понятно.
Но вот если таких кнопок в поле Frame должно быть несколько? И точное количество их неизвестно. Ведь массив из котроллов в VBA не сделаешь, по-моему?
Если представить, что нужно будет загодя рисовать двадцать пять кнопок, и для каждой из них писать процедуру...
Но вот если таких кнопок в поле Frame должно быть несколько? И точное количество их неизвестно. Ведь массив из котроллов в VBA не сделаешь, по-моему?
Если представить, что нужно будет загодя рисовать двадцать пять кнопок, и для каждой из них писать процедуру...
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
насколько я знаю массив контролов как раз можно сделать, только надо книгу смотреть, так не вспомню. Там нескольким контролам даётся имя одинаковое и потом обращаешься к ним как к массиву

Не знаю...
Ведь в классическом Visual Basic'e массив действительно можно организовать таким способом. Сделать один контрол, у которого обязательно должен присутствовать index, равный нулю. Последующие элементы массива контролла можно объявлять с помощью функции Load. Выкидывать из массива можно с помощью Unload.
Ведь в классическом Visual Basic'e массив действительно можно организовать таким способом. Сделать один контрол, у которого обязательно должен присутствовать index, равный нулю. Последующие элементы массива контролла можно объявлять с помощью функции Load. Выкидывать из массива можно с помощью Unload.
Как пример кнопки на форме:
код формы
код модуля
код класс модуляClass1
код формы
Код: Выделить всё
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
Код: Выделить всё
Public WithEvents cmd As MSForms.CommandButton
Private Sub cmd_Click()
MsgBox cmd.Caption
'***Можно разместить Select от cmd.Caption
End Sub
Спасибо, попробую.
Но, похоже, то, что нужно.
Но, похоже, то, что нужно.