在VBA Excel中以编程方式向Userform添加选项按钮

时间:2013-08-01 17:35:30

标签: excel vba excel-vba label

我对VBA编程很新。 我的场景是我将获得一个字符串值列表我需要使用小窗口上的单选按钮向用户显示这些值,以便每当用户通过单击单选按钮选择任何值时,我应该能够获得该值在VBA代码中。我在互联网上搜索用户表单中的添加选项按钮我得到了一些使用GUI方法创建选项按钮的解决方案。但我需要通过程序完成它。我在stackoverflow中发现了一个有用的线程(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菜单栏中使用“插入”选项创建的用户窗体。 我试图在userform上添加一个按钮。我没有在userform上使用initialize函数。 excel工作表上有按钮Button1我点击该按钮调用此功能。

谢谢

2 个答案:

答案 0 :(得分:6)

如果您的表单名为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

答案 1 :(得分:1)

请记住,在使用选项按钮时,您的选项按钮需要共享相同的GroupName 您的控件名称仅供您参考,以便更改/阅读 您的标题是用户表单上显示给用户的字符串。
您的 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功能 它的用途是指定userform在初始化userform(首次启动)时执行某些操作。
与你的代码类似,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

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