使用VBA Excel在用户窗体中编程添加选项按钮

4
我是一个很新的VBA编程者。我的情景是,我会得到一系列字符串值,我需要用单选按钮在一个小窗口上将这些值显示给用户,以便每当用户通过单选按钮选择任何值时,我就能够在VBA代码中获取该值。我在互联网上搜索添加选项按钮到用户表单的方法,我得到了一些使用GUI方法创建选项按钮的解决方案。但是我需要通过程序完成它。我在stackoverflow上找到了一个有用的线程(如何使用VBA在表单上动态添加单选按钮)。我使用了这个方法,但仍然无法在用户表单上获取任何标签或按钮,只显示一个简单的用户表单。所以请帮忙提供相关信息。
代码如下:
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菜单栏中的插入选项创建的用户窗体。 我试图在用户窗体上添加一个按钮。我没有在用户窗体上使用initialize函数。Excel表格上有一个名为Button1的按钮,我在点击该按钮时调用此函数。

谢谢


为什么不使用“列表样式”设置为“listStyleOption”的列表框,并将其格式化为看起来像一组选项按钮(无边框,背景颜色与表单相同...)?这将更容易管理。 - Tim Williams
你目前在 UserForm_Initialize() 中有什么代码?像这样模糊的问题如果没有看到你已经有的代码,很难回答。 - Declan_K
@Declan_k 非常感谢。很抱歉我添加了我正在使用的代码部分。请告诉我应该做出什么更正。 - Anup
@Tim Williams:感谢您的回复。我会尝试按照您的方法进行操作。如果可能的话,您能否提供任何关于您方法的示例链接或信息链接? - Anup
1
我认为这并不需要太多的解释 - 实际上,这是一件非常简单的事情:在您的表单上放置一个列表框,设置其属性以使其呈现您想要的外观,并将其填充。 - Tim Williams
2个回答

7
如果您有一个名为UserForm1的表单,其中包含一个名为CommandButton1的按钮。

UserForm

您可以为您的UserForm设置Initialize方法来以编程方式创建一组单选按钮。
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

这将为您提供以下结果:



这是您得到的结果:

enter image description here

当您单击提交时,将弹出一个消息框,显示所选的选项

enter image description here


非常感谢您提供完整的代码。但是我在我的Excel表格上有一个按钮。因此,当单击该按钮时,我需要调用UserForm_Inititialize()方法。那么我该如何做呢?button_onclick代码位于module1中。现在我该如何从button_onclick()方法中调用此方法。请告诉我相关信息。 - Anup
在你的button_onclick()方法中运行UserForm1.Show - Ripster
非常感谢,它起作用了。我把UserForm1.show放在button_click()方法中。现在窗口显示了单选按钮。非常非常感谢。但是下一件事是,当我单击按钮时,它没有显示哪个单选按钮被单击。我的意思是控制权没有转到commandButton1_onclick()方法。我的程序是这样的:button_onclick()有UserForm_initializer()中存在的代码,而在这个函数之后,我创建了一个名为CommandButton1_onclick()的函数,其中包含您建议的命令按钮代码。 - Anup
将CommandButton1_Clicked中的代码更改为更新后的代码。我演示了如何获取所选内容的值。答案已更新,以显示它如何与您在模块中拥有的代码一起使用。 - Ripster

1

使用选项按钮时,请确保它们具有相同的 GroupName。
控件名称仅供您引用以进行更改/读取。
Caption 是在用户窗体上显示的字符串。
GroupName 是一个字符串,允许 Excel 认识到选项按钮彼此链接在一起。

因此,如果 opt1 的 GroupName 是 "1",而 opt2 的 GroupName 是 "2",那么您将能够选择两个选项,因为它们属于不同的组。

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
编辑:
从您编辑的帖子和评论中看来...
不,您不需要有UserForm_Initialize()方法。

这是一个名为事件的Excel-VBA功能。
它的作用是在用户界面初始化(第一次启动)时指定用户界面执行某些操作。
类似地,从您的代码中可以看出,Button1_Click()也是一个事件。
因为您告诉Excel在用户单击Button1时执行以下操作...

无论如何,让我简要地解释一下选项按钮的作用。
一组选项按钮强制用户只能从程序提供的选项中选择一个选项。
在VBA中,选项按钮只允许您创建一个选项。因此,如果您想创建2个选项,则必须创建2个选项按钮。
但是有一个问题:如果您想创建2组选项按钮,以便用户可以选择2个不同的选项怎么办?例如,食物和饮料?
VBA为我们提供了一个名为GroupName的选项按钮属性。 GroupName允许VBA区分不同的选项按钮组。
因此,在创建每个选项按钮时,重要的是初始化其GroupName值。如果您看到没有GroupName的选项按钮实现,则会出现问题。

那么,最后让我们来看一下你的代码:

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

只有一件事:
- 正如我之前暗示的那样,只有一个选项的选项按钮是没有意义的。如果你正在寻找开/关类型的功能,你可以选择复选框。
所以,我创建了另一个选项按钮,将其定义为与你创建的第一个选项按钮(rad1)在同一组中。

希望对你有所帮助。

祝好,
kpark

当问题/问题得到回答/解决时,请务必选择最佳答案。 谢谢。


非常感谢您的解决方案。我会尝试这个。我没有创建userform_initialize()方法。我需要创建吗?我已经通过添加我正在工作的代码来编辑了我的帖子,如果可能的话,您能否请检查一下我的代码并告诉我在哪里可以放置userform_initialize()方法。非常抱歉,由于我是新手,我对用户表单的工作原理有点难以理解。 - Anup
可以通过右键单击用户窗体模块并点击查看代码来找到Userform_Initialize()。然后在代码窗口上方,您将看到两个下拉菜单。在第一个菜单中,选择Userform,在第二个菜单中选择Initialize,编辑器应该会为您完成其余的工作。 - kpark
非常感谢您,kpark91。我非常感激您的帮助和信息,这些帮助我理解了这些概念。是的,我按照您的建议编辑了我的代码并运行了代码。我收到了一个错误消息“用户定义的类型未定义”,因此我将rad1和rad2的类型从“Control”更改为“Variant”类型,现在它没有显示错误消息,但也没有显示任何表单或按钮。如果可能的话,您能否就此向我提供帮助。 - Anup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接