簡體   English   中英

在VBA Excel中以編程方式將OptionButtons添加到Userform

[英]Adding OptionButtons to the Userform programatically in VBA Excel

我對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菜單欄中使用“插入”選項創建的用戶窗體。 我試圖在userform上添加一個按鈕。 我沒有在userform上使用initialize函數。 excel工作表上有按鈕Button1我點擊該按鈕調用此功能。

謝謝

如果您有一個名為UserForm1的表單,其中包含一個名為CommandButton1

用戶窗體



您可以為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



哪個得到了這個結果:

在此輸入圖像描述

當您單擊“提交”時,將彈出一個消息框,顯示您選擇了哪個選項

在此輸入圖像描述

請記住,在使用選項按鈕時,您的選項按鈕需要共享相同的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()方法。

它是一個名為Event的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

當問題/問題得到解答/解決時,請務必選擇最佳答案。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM