Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2018, 16:44   #1
EvgChud
Новичок
Джуниор
 
Регистрация: 25.02.2018
Сообщений: 1
По умолчанию Динамическое создание пользовательской формы

Возникла необходимость создать форму не вручную, используя встроенный редактор, а программно, в зависимости от внешних условий.
Т.е. сначала нужно программно добавить в проект форму, затем на эту форму добавить компоненты, и связать компоненты с событиями.
Нашел пример проекта в котором создается три модуля: обычный программный модуль и два модуля класса. В одном модуле класса определяются коллекции, в которые добавляются компоненты по мере их добавления на форму. Второй класс отвечает за события, происходящие с компонентами.
Программный модуль:
Код:
    1 Option Explicit
    2 Dim COF As ControlsOnForm, EOC As EventsOfControls
    3 
    4 Sub CreateForm(NumberOfTextBoxes As Integer)
    5 'Добавляем пустую форму и код процедуры, которая выполняется при запуске формы
    6 Dim oNewForm 'Новая форма
    7 Dim sCode 'Переменная для хранения кода формы
    8 '  Application.VBE.MainWindow.Visible = False
    9 'Создаем форму
   10 Set oNewForm = ThisDocument.VBProject.VBComponents.Add(3) 'vbext_ct_MSForm
   11 'Добавляем конструкторы классов для событий формы
   12 sCode = ""
   13 'Создаем процедуру инициализации формы
   14 sCode = sCode & "Sub UserForm_Initialize()" & vbCrLf
   15 sCode = sCode & vbTab & "GetControlsForForm Me, " & NumberOfTextBoxes & vbCrLf
   16 '  sCode = sCode & vbTab & "UpdateControls" & vbCrLf
   17 sCode = sCode & "End Sub" & vbCrLf
   18 'Вставляем код формы
   19 oNewForm.CodeModule.InsertLines oNewForm.CodeModule.CountOfLines + 1, sCode
   20 'Показываем форму
   21 VBA.UserForms.Add(oNewForm.Name).Show
   22 'Удаляем форму из рабочей книги
   23 ThisDocument.VBProject.VBComponents.Remove oNewForm
   24 
   25 End Sub
   26 'Процедура, создающая указанное количество текстовых полей на указанной форме, и кнопку
   27 Sub GetControlsForForm(ByVal oForm As Object, ByVal NumberOfTextBoxes As Integer)
   28 'Переменные для объектов на форме
   29 Dim oBtn As MSForms.CommandButton
   30 Dim oTxt As MSForms.TextBox
   31 'Верхний левый угол компонента
   32 Dim iLeft As Integer, iTop As Integer
   33 'Счетчик
   34 Dim i As Integer
   35 'Максимальный размер формы
   36 Dim iMaxWidth As Integer, iMaxHeight As Integer
   37 
   38 'Заполняем форму компонентами
   39 Set COF = New ControlsOnForm
   40 iLeft = 6: iTop = 6 'Верхний левый угол первого текстового поля
   41 For i = 1 To NumberOfTextBoxes
   42 'Создаем кнопку
   43 Set oTxt = oForm.Controls.Add("Forms.TextBox.1", "txtNumber" & i)
   44 With oTxt
   45 .Text = .Name
   46 .Left = iLeft: .Top = iTop
   47 iTop = iTop + .Height
   48 iMaxWidth = iLeft + .Width + 6
   49 iMaxHeight = iTop - .Height + 20
   50 End With
   51 'Связываем текстовое поле с обработчиком событий
   52 Set EOC = New EventsOfControls: Set EOC.TextBoxEv = oTxt
   53 'Добавляем в коллекцию
   54 COF.TextBoxes.Add EOC
   55 Next i
   56 'Теперь добавляем кнопку
   57 Set oBtn = oForm.Controls.Add("Forms.CommandButton.1", "btnTest")
   58 With oBtn
   59 .Caption = "Моя кнопка"
   60 .Left = iLeft
   61 .Top = iTop
   62 iMaxWidth = iLeft + .Width + 6
   63 iMaxHeight = iTop + .Height + 20
   64 End With
   65 'Связываем кнопку с обработчиком событий
   66 Set EOC = New EventsOfControls: Set EOC.ButtonEv = oBtn
   67 'Добавляем в коллекцию
   68 COF.Buttons.Add EOC
   69 'Подгоняем размеры формы
   70 oForm.Height = iMaxHeight: oForm.Width = iMaxWidth
   71 End Sub
   72 
   73 'Основная процедура, запускающая весь процесс
   74 Sub СоздатьФорму()
   75 Dim TBCount As Integer
   76 Dim sInput As String
   77 Do
   78 sInput = InputBox("Введите число нужных текстовых полей", "Динамическое создание формы", 5)
   79 If Len(sInput) = 0 Then Exit Sub 'Если ничего не ввели, или нажали отмену
   80 'Если ввели не число, предлагаем ввод еще раз
   81 If IsNumeric(sInput) Then TBCount = CInt(sInput) Else sInput = ""
   82 Loop Until Len(sInput) > 0
   83 CreateForm (TBCount)
   84 End Sub
Модуль класса 1:
Код:
    1 Option Explicit
    2 'Класс, для хранения в коллекциях элементов формы
    3 Public Buttons As New Collection
    4 Public TextBoxes As New Collection
Модуль класса 2:
Код:
    1 Option Explicit
    2 'Этот класс содержит в себе обработчики событий для различных элементов формы
    3 'Элемент, ответсвтвенный за обработку событий в текстовом поле
    4 Public WithEvents TextBoxEv As MSForms.TextBox
    5 'Обработчик событий кнопки
    6 Public WithEvents ButtonEv As MSForms.CommandButton
    7 
    8 Private Sub ButtonEv_Click()
    9   Dim oForm As Object
   10   Set oForm = Me.ButtonEv.Parent
   11   MsgBox "Вы кликнули на кнопке " & Me.ButtonEv.Name & vbCr & _
   12     "На форме расположено " & Me.ButtonEv.Parent.Controls.Count - 1 & " текстовых полей", vbInformation, _
   13     "Динамическое создание формы"
   14 End Sub
   15 'Обработчик двойного нажатия в текстовом поле
   16 Private Sub TextBoxEv_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
   17   MsgBox "Вы дважды кликнули мышкой в текстовом поле " & Me.TextBoxEv.Name & "!", vbInformation, _
   18     "Динамическое создание формы"
   19 End Sub
При запуске ругается на то, что не создан пользовательский тип ControlsOnForm и EventsOfControls. Пожалуйста, помогите довести скрипт до работоспособного состояния.
EvgChud вне форума Ответить с цитированием
Старый 26.02.2018, 00:38   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

кросс http://www.cyberforum.ru/vba/thread2201244.html
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание формы NaumOff Общие вопросы Delphi 2 17.09.2012 18:52
Создание пользовательской формы dreik92 Microsoft Office Excel 0 16.04.2011 02:08
Динамическое создание формы BoT_T Win Api 4 10.12.2010 12:36
Создание теста в VBA с пом-ью пользовательской формы. HellkilleR Microsoft Office Excel 3 14.04.2010 23:00
Динамическое создание формы. Son Общие вопросы Delphi 1 04.02.2009 15:33