Как я могу динамически добавить переключатель на форму, используя VBA - PullRequest
1 голос
/ 12 января 2010

Я хочу динамически добавить переключатель в форму, используя 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)

Ответы [ 4 ]

2 голосов
/ 12 января 2010

Мне удалось заставить его работать с этим (Excel 2003):

Dim lbl As Variant

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

Обновление, чтобы отразить ваше изменение с ярлыка на OptionButton

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

Dim opt As Variant

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

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

1 голос
/ 31 января 2012

На самом деле, я считаю, что ваша проблема заключается в том, что вы называете 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) направляет следующий элемент управления.

следующий я

Удачи ....

0 голосов
/ 13 января 2010

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

Dim optionBtn As MSForms.OptionButton
Set optionBtn = UserForm1.Controls.Add("Forms.OptionButton.1", "name", True)
0 голосов
/ 12 января 2010
Код отметки

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

...