Страницы: 1
RSS
Обращение к объектам на форме в VBA
 
К объектам TextBox  на форме можно обратиться по его имени Me.Controls( "TextBox" & i), или просто по индексу в коллекции создаваемых объектов Me.Controls(i) в порядке их добавления на форму. При этом индекс отображается в TabIndex.
Где то, что то я сделал и внутренний порядок изменился. Проставление  TabIndex в рукопашную через свойства или View - Tab Order,  не влияет на "внутренний счетчик".
Собственно вопрос - можно ли поменять индексы в коллекции элементов на форме?
Это необходимо для обработки их в цикле в определенном порядке.
Решение нашел  Me.Controls( "TextBox" & i) = aArray(i) при заполнении формы, и на сайте у П.Ю. Климова через массив имен в заданном порядке при выгрузке в таблицы.
Код
lCol = 1
For Each iName in aArray("TextBox1", "TextBox5",...)
.Cells(lRow, lCol).Value = Me.Controls(iName).Value
lCol = lCol +1
Next
 
У объектов есть свойство Tag , его можно проставить, как просто цифрой, которая определяет индекс столбца в который вписывается значение, так и с признаком что это поле в таблицу переносится , например Field_01. тогда просто  
Код
For Each c In Me.Controls
    If c.Tag Like "Field_*" Then _
        Cells(Row, CInt(Right(c.Tag, 2))) = c.Value
Next
Изменено: БМВ - 10.07.2019 23:01:05
По вопросам из тем форума, личку не читаю.
 
БМВ, спасибо. Возьму и этот вариант на вооружение.
 
Ещё можно при инициализации формы создать массив контролов,
в таком порядке который нужен, а потом обращаться по индексам этого массива:
Код
Option Explicit

Dim TxtBoxes() As MSForms.TextBox
Dim K As Long

Private Sub CommandButton1_Click()
    For K = 1 To 3
        ActiveSheet.Cells(2, K) = TxtBoxes(K).Text
    Next
End Sub

Private Sub UserForm_Initialize()
    Dim iName
    ReDim TxtBoxes(1 To 3)
    K = 0
    For Each iName In Array("TextBox1", "TextBox5", "TextBox2")
        K = K + 1: Set TxtBoxes(K) = Me.Controls(iName)
    Next
End Sub
Изменено: С.М. - 11.07.2019 00:44:57
 
С.М.,спасибо. Утащил в свою копилку.
Страницы: 1
Наверх