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

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
mouse
Сообщения: 4
Зарегистрирован: 12 апр 2005, 10:32

Возникла такая ситуация - есть форма (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
, то ничего не происходит.

Кто-нибудь сталкивался с подобной проблемой? Каким образом можно добавить процедуру?
Zigi
Сообщения: 32
Зарегистрирован: 18 янв 2005, 16:45
Откуда: СПб

Как вариант, можно заранее нарисовать кнопку, написать в ней код,
и поставить Visible=false. А потом когда настанет момент отобразить кнопку соответсвенно поставить Visible=true.
mouse
Сообщения: 4
Зарегистрирован: 12 апр 2005, 10:32

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

Если представить, что нужно будет загодя рисовать двадцать пять кнопок, и для каждой из них писать процедуру...
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

насколько я знаю массив контролов как раз можно сделать, только надо книгу смотреть, так не вспомню. Там нескольким контролам даётся имя одинаковое и потом обращаешься к ним как к массиву
Изображение
mouse
Сообщения: 4
Зарегистрирован: 12 апр 2005, 10:32

Не знаю...
Ведь в классическом Visual Basic'e массив действительно можно организовать таким способом. Сделать один контрол, у которого обязательно должен присутствовать index, равный нулю. Последующие элементы массива контролла можно объявлять с помощью функции Load. Выкидывать из массива можно с помощью Unload.
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Как пример кнопки на форме:
код формы

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

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
mouse
Сообщения: 4
Зарегистрирован: 12 апр 2005, 10:32

Спасибо, попробую.

Но, похоже, то, что нужно.
Ответить