MyTetra Share
Делитесь знаниями!
Создание массива контролов в VBA, Управление массивом контролов по событию
Время создания: 31.07.2019 23:04
Текстовые метки: Controls
Раздел: !Закладки - VBA - Форма
Запись: xintrea/mytetra_db_adgaver_new/master/base/15128519828al4rv9l0g/text.html на raw.githubusercontent.com

forum.sources.ru

Создание массива контролов в VBA -> Форум на Исходниках.Ру


Большая часть VB-примеров актуальна и для VBA-раздела

 Создание массива контролов в VBA, Управление массивом контролов по событию


Управление массивом контролов на примере текстбоксов

Создаем класс clsCtrlArr

В модуле класса пишем:


Public WithEvents ctl As MSForms.TextBox

Private Sub ctl_Change()

Cancel = True

MsgBox ctl.Name

End Sub

Ваяем форму с тремя ТехтБоксами

В модуле формы пишем:


Private Massiv() As New clsCtrlArr

Private Sub UserForm_Initialize()

Dim Contr As MSForms.Control, i As Long

For Each Contr In Me.Controls

    If Left(Contr.Name, 7) = "TextBox" Then

ReDim Preserve Massiv(0 To i)

        Set Massiv(i).ctl = Contr

        i = i + 1

    End If

Next

End Sub

Сайт автора: www.dimit.pochta.ru


Junior


В продолжение темы: Ваять контролы можно и не вручную, а с помощью кода.

Пример с четырьмя ComboBox:

В Class1:



Public WithEvents comb As MSForms.ComboBox

Private MyIndex As Integer

Private Sub comb_Change()

    MsgBox "Вы изменили ComboBox" & MyIndex

End Sub

Public Property Let Item(NewCtrl As MSForms.ComboBox)

    Set comb = NewCtrl

End Property

Public Property Let Index(NewIndex As Integer)

    MyIndex = NewIndex

End Property

Public Property Get Item() As MSForms.ComboBox

    Set Item = comb

End Property

Public Property Get Index() As Integer

    Index = MyIndex

End Property

В Module1:


В UserForm1:


Private Sub UserForm_Initialize()

Dim cm As ComboBox, i As Long

For i = 0 To 3

    Set cm = UserForm1.Controls.Add("Forms.ComboBox.1")

    With cm

        .AddItem "123"

        .Top = i * 30

    End With

ReDim Preserve Massiv(i)

    With Massiv(i)

        .Item = cm

        .Index = i

    End With

Next

End Sub

Событие comb_Change, конечно, можно изменить на другое. И реакция на него должна быть требуемая Вам.

Сообщения были разделены в тему "программное создание контролов"


Открываем, например, Аксесс. Создаём форму. На неё кидаем 5 лабелов (они получают имена "Надпись0...4") и кнопку (она получает имя "Кнопка5"). Открываем модуль формы и кидаем туда следующий код:

Private Sub Кнопка5_Click()

Dim ArrayOfControls(0 To 4) As Control

Dim i As Integer

For i = 0 To 4

    Set ArrayOfControls(i) = Me.Controls("Надпись" & CStr(i))

Next

For i = 0 To 4

    ArrayOfControls(i).Properties("Caption") = CStr(Rnd)

Next

End Sub

Полученную форму открываем на просмотр и убеждаемся, что каждое нажатие кнопки изменяет надписи. Есть желание - можно и потрассировать. Поскольку все контролы, складываемые в массив, есть надписи, можно было определить его и как ArrayOfControls(0 To 4) As Label, и не потребовалось бы дёргать коллекцию Properties - но я хотел показать универсальность метода.

Есть претензии ко мне как к модератору? читайте Правила, разделы 5 и 6, и действуйте соответственно.
Есть претензии ко мне как к участнику? да ради бога.
Не нравятся мои ответы? не читайте их.
В общем, берегите себя. Нервные клетки не восстанавливаются.

0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

0 пользователей:



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования