MyTetra Share
Делитесь знаниями!
Создание массива контролов в VBA, Управление массивом контролов по событию
09.12.2017
23:39
Текстовые метки: Controls
Раздел: VBA

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.52
Яндекс индекс цитирования