Как я могу динамически добавить переключатель в форму с помощью VBA

Я хочу динамически добавить переключатель в форму, используя VBA.

Я пытался написать этот код, но он вылетает из-за «Несоответствия типов».

Dim optionBtn As OptionButton
Set optionBtn = UserForm1.Controls.Add("Forms.OptionButton.1", "name", True)

optionBtn.Left = 10
optionBtn.Top = 10
optionBtn.Width = 30
optionBtn.Group = "q1"

Я также пытался сделать это:

Dim optionBtn As Control
Set optionBtn = UserForm1.Controls.Add("Forms.OptionButton.1", "name", True)

optionBtn.Left = 10
optionBtn.Top = 10
optionBtn.Width = 30
optionBtn.Group = "q1"

но я получаю элемент управления, а не OptionButton - как я могу преобразовать его в OptionButton? (извините, я новичок в VB)


person melculetz    schedule 12.01.2010    source источник


Ответы (4)


Я смог заставить его работать с этим (Excel 2003):

Dim lbl As Variant

Set lbl = UserForm1.Controls.Add("Forms.Label.1", "lblFoo", True)
lbl.Caption = "bar"

Обновить, чтобы отразить ваш переход с Label на OptionButton

Опять же, ключ использует тип Variant для переменной, которой вы назначаете возвращаемый элемент управления:

Dim opt As Variant

Set opt = UserForm1.Controls.Add("Forms.OptionButton.1", "radioFoo", True)
opt.Caption = "Bar"

Имейте в виду, что автозаполнение не будет работать с переменными, которые определены как варианты. Однако вы по-прежнему можете обращаться к свойствам и методам этих переменных, вводя их вручную.

person Mark Biek    schedule 12.01.2010

На самом деле, я считаю, что ваша проблема заключается в том, что вы называете optionBtn кнопкой объекта. Она должна быть названа опциональной кнопкой MSForms. Поскольку Variant может быть объектом, он будет работать при использовании варианта.

Я использовал следующее, и он отлично работает.

Dim TempForm As Object
Dim newOptionButton as MSForms.OptionButton
Dim sUserformName as string
Dim i as integer
Dim x as integer
Dim y as integer
' other junk removed for example sake...


sUserformName = sheet1.cells(1,1)

' create form
Set TempForm = ThisWorkbook.VBProject.VBComponents.Add(3)
With TempForm
    .Properties("Caption") = sUserformName
    .Properties("Width") = 450
    .Properties("Height") = 300
End With

for i = 3 to sheet1.range("A65536").End(XlUp).Row
sDefault = sheet1.cells(i,5)
iGN = sheet1.cells(i,6)


' additional code removed... for sake of example... the code would add labels, text boxes, etc...

    Set newOptionButton = TempForm.designer.Controls.Add("Forms.optionbutton.1")
    With newOptionButton
        .Caption = sDefault
        .GroupName = "Group" & iGN
        .Top = 20 + (20 * x)
        .Left = y
        .Height = 16
        .Font.Size = 8
        .Font.Name = "Ariel"
    End With

' здесь код изменяет x и y в зависимости от того, куда пользователь (шаблон Excel) направляет следующий элемент управления.

следующий я

Удачи....

person Joshua Matisoff    schedule 31.01.2012

код mark должен работать, но я часто предпочитаю создавать элемент вручную, а затем показывать/скрывать его в зависимости от необходимости.

person guitarthrower    schedule 12.01.2010
comment
Все зависит от того, что вы пытаетесь сделать. У меня были ситуации, когда отображаемая форма менялась в зависимости от информации в электронной таблице. В этом случае создание динамического элемента управления является почти единственным способом справиться с этим. - person Mark Biek; 12.01.2010
comment
Я согласен. Я бы не хотел создавать их все время, если бы мне нужно было только показать... Из вопроса было трудно сказать, откуда берется ОП. Пока мы выбрасываем варианты... Я также буду использовать многостраничные инструменты и скрывать вкладки, чтобы управлять потоком форм. - person guitarthrower; 13.01.2010

Вам нужно определить объект как optionbutton из библиотеки msforms.

Dim optionBtn As MSForms.OptionButton
Set optionBtn = UserForm1.Controls.Add("Forms.OptionButton.1", "name", True)
person Andy Pope    schedule 13.01.2010