На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! `
Не забудьте заглянуть в VB6 FAQ, так как большая часть VB-примеров актуальна и для VBA-раздела ;)
Модераторы: Old Bat, MIF
  
> Создание массива контролов в VBA, Управление массивом контролов по событию
    Управление массивом контролов на примере текстбоксов

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

    ExpandedWrap disabled
      Public WithEvents ctl As MSForms.TextBox
       
      Private Sub ctl_Change()
      Cancel = True
      MsgBox ctl.Name
      End Sub

    Ваяем форму с тремя ТехтБоксами
    В модуле формы пишем:

    ExpandedWrap disabled
      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
      В продолжение темы: Ваять контролы можно и не вручную, а с помощью кода.
      Пример с четырьмя ComboBox:
      В Class1:
      ExpandedWrap disabled
        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:
      ExpandedWrap disabled
        Public Massiv() As New Class1

      В UserForm1:
      ExpandedWrap disabled
        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"). Открываем модуль формы и кидаем туда следующий код:


        ExpandedWrap disabled
          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 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,1003 ]   [ 17 queries used ]   [ Generated: 21.02.19, 07:50 GMT ]