Я "" створюю інструмент управління запасами з Excel VBA. Я створив код, який збирає список імен з випадаючого списку в Internet Explorer і поміщає їх в масив.
Що мені потрібно зробити, це щось подібне vba створює декілька текстових полів, що об'єднуються, у динамічному режимі в userform, але я буду динамічно додавати мітки для імен користувачів і текстових полів для кількості FLN, які кожна людина буде отримувати. Потім вони перейдуть у попередньо визначену форму користувача, яку я вже створив.
За прикладом коду вище, я розумію, що не можу використовувати .Name = "Textbox" & i
щоб перейменувати наступну мітку або текстове поле. i
має дорівнювати постійно змінюваному списку, тому він не може бути встановлений в камені; UBound(UserArray)
.
ОНОВЛЕНО
Private Sub CreateControl()
Dim newTxt As msforms.Control, newLbl
Dim i As Integer, TopAmt
Dim UserArray As String
TopAmt = 30
For i = LBound(MyArray) + 1 To UBound(MyArray) - 1
Set newLbl = MultipleOptionForm.Controls.Add("Forms.Label.1")
With newLbl
.Name = "Label" & i
.Left = 10
.Top = TopAmt
.WordWrap = False
.AutoSize = True
.Visible = True
.Caption = MyArray(i)
Debug.Print .Name,
End With
Set newTxt = MultipleOptionForm.Controls.Add(bstrProgID:="Forms.Textbox.1", Name:="Textbox" & i)
With newTxt
.Left = 150
.Top = TopAmt
.Visible = True
.Width = 20
Debug.Print .Name
End With
TopAmt = TopAmt + newTxt.Height
Next
MultipleOptionForm.Show
End Sub
Відповіді:
2 для відповіді № 1Лу відповідь на це питання вводить в оману. Питання хоче надати ім'я за замовчуванням при додаванні елемента керування, змінюючи його ProgID (bstrProgID - це рядок, який посилається на клас, який буде створено).
Нові елементи керування можна перейменувати за умови, що інший елемент керування не має однакової назви.
Також можна передавати ім'я елементів керування як аргумент до Controls.Add
метод
Ваші мітки не показуються, що ви ніколи не встановлювали Label.Caption
вартість
Private Sub CreateControl()
Dim newLbl As MSForms.Label
Dim newTxt As MSForms.Control
Dim i As Integer, TopAmt
Dim UserArray As Variant
TopAmt = 50
UserArray = Array("Cat", "Dog", "Horse", "Gorrilla")
For i = LBound(UserArray) To UBound(UserArray)
Set newLbl = MultipleOptionForm.Controls.Add("Forms.Label.1")
With newLbl
.Name = "Label" & i
.Left = 50
.Top = TopAmt
.Visible = True
.Caption = UserArray(i)
Debug.Print .Name,
End With
Set newTxt = MultipleOptionForm.Controls.Add(bstrProgID:="Forms.Textbox.1", Name:="Textbox" & i)
With newTxt
.Left = 100
.Top = TopAmt
.Visible = True
Debug.Print .Name
End With
TopAmt = TopAmt + newTxt.Height
Next
End Sub
Наступний випуск: як отримати дані з цих динамічно створених текстових полів?
Dim newTxt As MSForms.Control
For i = LBound(UserArray) To UBound(UserArray)
set newTxt = MultipleOptionForm.Controls("Textbox" & i)
If UserArray(i) <> newTxt.Value then
"Do something
End if
Next