views:

416

answers:

3

I want to dynamically add a radio button on a form, using VBA.

I tried writing this code, but it crashes with 'Type Mismatch'

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"

I also tried doing this:

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"

but I get a Control, not a OptionButton - how can I cast it to a OptionButton ? (sorry, I'm new to VB)

+1  A: 

I was able to get it work with this (Excel 2003):

Dim lbl As Variant

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

Update to reflect your change from a Label to an OptionButton

Again, the key is use a Variant type for the variable that you are assigning the returned control to:

Dim opt As Variant

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

Keep in mind that autocomplete won't work on the variables that are defined as Variants. However you can still refer to properties and methods of those variables by typing them manually.

Mark Biek
A: 

mark's code should work, but I often prefer to create the item manually then show/hide it based on the need.

guitarthrower
It all depends on what you're trying to do. I've had situations where the form displayed changed depending on the information in the spreadsheet. In that case, dynamic control creation is pretty much the only way to handle it.
Mark Biek
I agree. I would hate to have to create them all the time if I only needed to unhide... It was hard to tell from the question the where the OP was coming from.As long as we're throwing options out there... I will also use Multi-page tools and hide the tabs to control form flow.
guitarthrower
A: 

You need to define the object as an optionbutton from the msforms library.

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