【问题标题】:Adding OptionButtons to the Userform programatically in VBA Excel在 VBA Excel 中以编程方式将选项按钮添加到用户窗体
【发布时间】:2024-01-13 12:19:01
【问题描述】:

我对 VBA 编程非常陌生。 我的场景是我将获得一个字符串值列表我需要使用小窗口上的单选按钮向用户显示这些值,以便每当用户通过单击单选按钮选择任何值时,我应该能够获得该值在 VBA 代码中。我在互联网的用户表单中搜索添加选项按钮,我得到了一些使用 GUI 方法创建选项按钮的解决方案。但我需要通过程序完成。我在 * (How can I dynamically add a radio button on a form using 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 菜单栏中的插入选项创建的用户表单。 我试图在用户窗体上添加一个按钮。我没有在用户窗体上使用初始化功能。 excel 表 Button1 上有一个按钮,我在单击该按钮时调用此函数。

谢谢

【问题讨论】:

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

标签: vba excel label


【解决方案1】:

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



您可以为您的用户窗体设置 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



这会给你这个结果:

当您点击提交时,会弹出一个消息框,显示您选择了哪个选项

【讨论】:

  • 非常感谢您提供完整的代码。但我的 Excel 表上有一个按钮。因此,单击该按钮时,我需要调用 UserForm_Initialize()。那我该怎么做。 button_onclick 代码存在于 module1 中。现在我如何从 button_onclick() 方法调用这个方法。请让我知道这件事。
  • 在你的 button_onclick() 方法中运行 UserForm1.Show
  • 您好,非常感谢它的工作。我将 UserForm1.show 放在 button_click() 方法中。现在显示带有单选按钮的窗口。非常非常感谢你。但接下来是当我单击按钮时,它不显示单击了哪个单选按钮。我的意思是说控件不会使用 commandButton1_onclick() 方法。我的程序就像这个 button_onclick() 具有 UserForm_initializer() 中存在的代码,在此函数之后,我创建了另一个名为 CommandButton1_onclick() 的函数,其中包含您为命令按钮建议的代码。
  • 将COMmandBUtton1_Clicked中的代码更改为更新后的代码。我演示了如何获得所选内容的价值。答案已更新,以显示它如何与模块中的代码一起使用
【解决方案2】:

请记住,在使用选项按钮时,您的选项按钮需要共享相同的 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() 方法。

它是一个名为 Event 的 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)。

希望对您有所帮助。

干杯,
公园

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

【讨论】:

  • 非常感谢您的解决方案。我会试试这个。我没有创建 userform_initilize() 方法。我需要创建它。我已经通过添加我正在处理的代码来编辑我的帖子,如果可能的话,请你检查我的代码一次,让我知道我可以在哪里放置 userform_initialize() 方法。非常抱歉,因为我是这个领域的新手,所以我很难理解用户表单的工作原理。
  • Userform_Initialize() 可以通过右键单击用户表单模块并单击查看代码来找到。然后在代码窗口上方,您将看到两个下拉菜单。在第一个菜单中,选择 Userform,在第二个菜单中选择 Initialize,然后编辑器会为您完成剩下的工作。
  • 非常感谢 kpark91。我非常感谢您的帮助,信息帮助我理解了这些概念。是的,我根据您的建议编辑了我的代码并运行了代码。我收到一条错误消息 "User-defined type not defined",因此我将 rad1 和 rad2 的类型从 Control 更改为 Variant 类型现在它没有显示错误消息,但也没有显示任何表单或按钮。如果可能的话,请你帮我解决这个问题。
最近更新 更多