在VBA Excel中以编程方式将OptionButton添加到用户窗体

我对VBA编程非常陌生。 我的场景是我会得到一个string值列表我需要这些值显示给用户使用单选button在一个小窗口,以便每当用户通过单击单选buttonselect任何值,我应该能够得到该值在VBA代码中。 我search在互联网上的用户forms添加选项button我有一些解决scheme,使用GUI方法创build选项button。 但我需要通过程序完成。 我发现了一个有用的线程在stackoverflow( 我怎样才能dynamic地添加一个单选button在窗体上使用VBA )我用这个,但我仍然无法获得用户窗体上的任何标签或button,将显示一个普通的用户窗体。 所以请有人提供这方面的信息。

代码是:

Sub Button1_Click() lResult As Variant ' this is a array which contains string vaues to be dispayed as radio button. ' Some operatin is done here to get the list of values in lResult Dim rad As Variant Set rad = UserForm1.Controls.Add("Forms.OptionButton.1", "radioFoo", True) rad.Caption = "bar" rad.Left = 10 rad.Width = 10 rad.Top = 10 End Sub 

UserForm1是我在VBA菜单栏中使用“插入”选项创build的用户表单。 我试图在用户窗体上添加一个button。 我没有使用userform的初始化函数。 excel表单上有buttonButton1我点击这个button就调用这个函数。

谢谢

如果您有一个名为UserForm1的表单包含名为CommandButton1

用户窗体

您可以为您的用户窗体设置Initialize方法以编程方式创build一组单选button

 Private Sub UserForm_Initialize() Dim OptionList(1 To 3) As String Dim btn As CommandButton Set btn = UserForm1.CommandButton1 Dim opt As Control Dim s As Variant Dim i As Integer OptionList(1) = "Option 1" OptionList(2) = "Option 2" OptionList(3) = "Option 3" For Each s In OptionList Set opt = UserForm1.Controls.Add("Forms.OptionButton.1", "radioBtn" & i, True) opt.Caption = s opt.Top = opt.Height * i opt.GroupName = "Options" UserForm1.Width = opt.Width UserForm1.Height = opt.Height * (i + 2) i = i + 1 Next btn.Caption = "Submit" btn.Top = UserForm1.Height - btn.Height + (0.5 * opt.Height) btn.Left = (UserForm1.Width * 0.5) - (btn.Width * 0.5) UserForm1.Height = UserForm1.Height + btn.Height + (0.5 * opt.Height) End Sub Private Sub CommandButton1_Click() Dim i As Integer For i = 0 To UserForm1.Controls.Count - 1 If UserForm1.Controls(i) Then SelectedOption = UserForm1.Controls(i).Caption End If Next UserForm1.Hide End Sub 

如果你想从一张纸上拉你的名单,你可以改变

 Dim OptionList(1 To 3) As String OptionList(1) = "Option 1" OptionList(2) = "Option 2" OptionList(3) = "Option 3" 

从这样的范围拉

 Dim OptionList() as Variant OptionList = Range("A1:A3") 

在存储在模块中的“button_onclick()”过程中添加以下代码:

 'This is set by the code in UserForm1 Public SelectedOption As String Sub Button1_OnClick() UserForm1.Show MsgBox SelectedOption End Sub 

哪个让你得到这个结果:

在这里输入图像说明

当你点击提交时,会popup一个消息框,显示你select了哪个选项

在这里输入图像说明

请记住,在使用选项button时,您的选项button需要共享相同的GroupName。
您的控件名称仅供您参考,以便更改/阅读。
您的标题是一个string,出现在用户窗体上的用户。
您的GroupName是允许Excel识别选项button链接在一起的string。

因此,如果opt1的GroupName是“1”,而opt2的GroupName是“2”,那么您将能够select两者,因为它们在不同的组中。

 Private Sub UserForm_Initialize() Dim opt1 As Control, opt2 As Control Set opt1 = UserForm1.Controls.Add("Forms.OptionButton.1", , True) With opt1 .Name = "radioFoo" .GroupName = "1" .Caption = "Option 1" End With Set opt2 = UserForm1.Controls.Add("Forms.OptionButton.1", , True) With opt2 .Name = "radioFoo2" .GroupName = "1" .Caption = "Option 2" .Left = 100 End With End Sub 

编辑:
从看到你的编辑post和你的评论…
不,你不需要有UserForm_Initialize()方法。

这是一个名为Event的Excel-VBAfunction。
它的用途是指定用户表单在userform初始化(首次启动)时执行某些操作。
同样来自你的代码,Button1_Click()也是一个事件。
由于您告诉Excel在Button1被用户点击的事件中执行以下操作…

无论如何,让我简单地向你解释一下选项button的function。
选项button强制用户从程序给出的选项中只select一个选项。
VBA中的选项button只允许您创build一个选项。 所以,如果你想创build2个选项,你必须创build2个选项button。
但是只有一个问题:如果你想创build2组选项button,以便用户可以select2个单独的选项? 例如,食物和饮料?
VBA为我们提供了一个名为GroupName的选项button的属性。 GroupName允许VBA区分不同的选项button组。
因此,在您创build的每个选项button中,初始化其GroupName值是非常重要的。 如果你看到任何没有GroupName的选项button的实现,你正在玩火。

那么,让我们终于看看你的代码:

 Sub Button1_Click() ' Some operatin is done here to get the list of values in lResult Dim rad1 As Control, rad2 As Control Set rad1 = UserForm1.Controls.Add("Forms.OptionButton.1", "radioFoo1", True) rad1.Caption = "bar" rad1.Left = 10 rad1.Width = 10 rad1.Top = 10 rad1.GroupName = "Group1" Set rad2 = UserForm1.Controls.Add("Forms.OptionButton.1", "radioFoo2", True) rad2.Caption = "foo" rad2.Left = 10 rad2.Width = 10 rad2.Top = 50 rad2.GroupName = "Group1" End Sub 

就一件事:
– 正如我以前隐含提到的,只有一个选项的选项button并不意味着什么。 如果你正在寻找开/关types的function,你不妨selectcheckbox。
所以,我创build了另一个选项button,将它定义在与您创build的第一个选项button(rad1)相同的组中。

希望能帮助到你。

干杯,
kpark

当问题已被回答/解决时,请务必select最佳答案。 谢谢。