Консультация № 172980
06.10.2009, 15:21
0.00 руб.
0 2 2
Добрый день, уважаемые эксперты. VBA Excel

Мой вопрос заключается в том, как
создать программно несколько объектов на форме в зависимости от значения textbox

Весь процесс выглядит следующим образом. Я набираю, например число, 5 в textbox. Нажимаю кнопку и появляется новая форма с 5 тью textbox определённого размера и одной кнопкой. И что бы была возможность наложить какое либо событие на кнопку.

Спасибо за внимание.

Обсуждение

Неизвестный
06.10.2009, 17:01
общий
это ответ
Здравствуйте, Соколов В.В..
Долго расписывать пришлось бы. Лучше смотрите пример в файле по ссылке: Пример создания динамической формы. Откройте файл и нажмите кнопку. Дважды кликните по текстовому полю, чтобы увидеть реакцию на двойной клик (другие события я не прописывал) и нажмите на кнопку, чтобы увидеть реакцию на ее событие.
Вкратце это работает так:
  • Создаем два класса. Один для событий, другой — для компонентов. В примере это классы EventsOfControls и ControlsOnForm соответственно;
  • Добавляем в проект форму (программно). Это делает процедура CreateForm(NumberOfTextBoxes As Integer), которой в качестве параметра передается количество текстовых полей, которое должно быть на форме;
  • Программно записываем процедуру инициализации формы. В той же CreateForm;
  • Когда мы показываем созданную, но еще пустую форму, то запускается процедура ее инициализации (UserForm_Initialize()), в которой записан вызов процедуры, добавляющей компоненты на форму GetControlsForForm(ByVal oForm As Object, ByVal NumberOfTextBoxes As Integer);
  • В процедуре GetControlsForForm мы добавляем в цикле текстовые поля, связываем их с классом событий и добавляем в коллекцию класса компонентов.


Этот метод очень удобен тем, что события для компонентов можно прописывать самым обычным образом, только в модуле класса.

Спрашивайте, что непонятно
5
Программа работает, вопрос раскрыт полностью! Спасибо большое, помогло. Язык написания понятен, исчерпывающие комментарии и принцип работы.
Неизвестный
06.10.2009, 17:22
общий
это ответ
Здравствуйте, Соколов В.В..
на форме создаём текстбокс и кнопку, а также добавляем модуль и соответственно пишем на кнопку и в модуль следующие процедуры

Приложение:
на форме
Private Sub CommandButton2_Click()
MakeForm (TextBox1.Text)
End Sub

в модуле
Sub MakeForm(k As String)
Dim TempForm As Object 'VBComponent
Dim NewButton As MSForms.CommandButton
Dim btn As MSForms.TextBox
Dim Line As Integer
Dim TheForm
Application.VBE.MainWindow.Visible = False
' Создание диалогового окна UserForm
Set TempForm = ThisWorkbook.VBProject. _
VBComponents.Add(3) 'vbext_ct_MSForm
With TempForm
.Properties("Caption") = "Временная форма"
.Properties("Width") = 200
.Properties("Height") = 100
End With
' Добавление элемента управления CommandButton
Set NewButton = TempForm.Designer.Controls _
.Add("forms.CommandButton.1")
With NewButton
.Caption = "Щелкни!"
.Left = 60
.Top = 40
End With
Dim tp As Integer
tp = 5
For i = 1 To Int(k)
Set btn = TempForm.Designer.Controls.Add("Forms.TextBox.1")
btn.Left = 5
btn.Top = tp
btn.Width = 20
btn.Height = 10
tp = tp + 10
Next

With TempForm.CodeModule
Line = .CountOfLines
.InsertLines Line + 1, "Private Sub CommandButton1_Click()"
.InsertLines Line + 2, "MsgBox ""Привет!"""
.InsertLines Line + 3, "Unload Me"
.InsertLines Line + 4, "End sub"
End With
' Set MakeForm = TempForm
' Отображение диалогового окна UserForm
VBA.UserForms.Add(TempForm.Name).Show
' Удаление диалогового окна UserForm
ThisWorkbook.VBProject.VBComponents.Remove TempForm
End Sub
4
Спасибо за ответ. 4 потому что есть с чем сравнивать.
Форма ответа