我如何使用 OptionBox 来驱动具有来自我的工作表的选择值的 ComboBox 的值?

How can I use an OptionBox to drive the value of a ComboBox with selective values from my worksheet?

我正在寻找一种方法,它可以根据所选的选项框轻松地 link 从组合框列表中的工作表中选择值。我是 VBA 的新手,我想知道我的语法是否有误。 我认为我的方法是正确的,但在选择该选项时我一直收到错误消息:编译错误:未定义函数的子程序。当 Private Sub 选项按钮为 运行 时存在此错误。如果我删除那部分代码,那么我的 ComboBox 列表是空的,但我没有收到任何错误消息。 我习惯使用 JavaScript,所以调用函数很常见,也许不使用 VBA?

Dim myTable As Range

'Updated by Extendoffice 2018/1/30
Private Sub UserForm_Initialize()
    Set myTable = Worksheets("Sheet1").Range("A2:B8")
    If OptionButton1 = True And OptionButton2 = False Then

       Me.ComboBox1.List = myTable.Range("A2:A3").Value
    ElseIf OptionButton2 = True And OptionButton1 = False Then
     Me.ComboBox1.List = myTable.Range("A5:A8").Value
    End If

End Sub


Private Sub OptionButton1_Change()
Call UserForm
End Sub

Private Sub OptionButton2_Change()
Call UserForm
End Sub

This is the form outcome when the option box is selected without including the last 6 lines of the code above

根据您的用户表单图像,我已经使用 UserForm1 和所有控件的所有默认名称复制了您的表单。

如果您将 If...Then 声明移动到 Optionbutton_Change() 事件中,您将填充您的列表。

根据 Microsoft Documentation about the Initialize event:

The Initialize event is typically used to prepare an application or UserForm for use.Variables are assigned initial values, and controls may be moved or resized to accommodate initialization data.

所以一旦您已经加载了表单就不会更新数据。

我已经在一个新工作簿上测试了以下内容,第一个选项按钮列表的 A1:A10 中的虚拟数据和第二个选项按钮列表的 B1:B10 中的虚拟数据。

注意:这都包含在UserForm代码模块中。

Option Explicit

Private Sub OptionButton1_Change()
Dim TargetRange As Range
Dim TargetCell As Range

If Me.OptionButton1 = True Then
    Me.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
    Me.ComboBox1.Value = "" '<~~ Removes the default value added at initialization. 
    Set TargetRange = Sheet1.Range("A1:A10")
    For Each TargetCell In TargetRange
        Me.ComboBox1.AddItem TargetCell.Value
    Next TargetCell
End If

End Sub

Private Sub OptionButton2_Change()
If Me.OptionButton2 = True Then
    Me.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
    Me.ComboBox1.Value = "" '<~~ Removes the default value added at initialization. 
    Set TargetRange = Sheet1.Range("B1:B10")
    For Each TargetCell In TargetRange
        Me.ComboBox1.AddItem TargetCell.Value
    Next TargetCell
End If
End Sub

Private Sub UserForm_Initialize() 

Me.ComboBox1.Value = "Select an OptionButton below..."

End Sub

我的代码中对您的代码的主要更改:

  • 我正在更新 OptionButton_Change() 事件处理程序中的 ComboBox 列表。
  • 我没有评估一个是 True,另一个是 False,因为 OptionButtons 在同一时间只能在其组中选择一个。
  • 我在与您的工作表无关的范围内使用了虚拟数据 - 但您只需要更改对工作表和范围的引用。
  • 我已经将 Me.ComboBox1.Clear 作为第一个执行的语句,如果选择了有问题的 OptionButton,因为这会清除可能已经填充的列表
    • 如果您省略此操作并且用户单击 OptionButton1 填充 ComboBox 中的第一个值范围,然后他们单击 OptionButton2 您将最终将第二个值范围添加到列表底部,在已经填充的第一个值范围之后。
  • 我在 Initialize 事件中添加的 ComboBox 中包含了一个默认值。 这不是强制性的。

表单行为的屏幕截图示例:

Sheet1 上的虚拟数据:

首次打开:

OptionButton1 列表:______________________ OptionButton2 列表:_______________________


您可以将整个事情写入函数(或子例程)并以您尝试调用 Initialize 事件的方式调用 that

这是一个示例子例程:

Public Sub ChangeMyComboBoxList()

Dim TargetRange As Range
Dim TargetCell As Range

If UserForm1.OptionButton1 = True Then
    UserForm1.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
    UserForm1.ComboBox1.Value = "" '<~~ Removes the default value added at initialization.
    Set TargetRange = Sheet1.Range("A1:A10")
    For Each TargetCell In TargetRange
        Me.ComboBox1.AddItem TargetCell.Value
    Next TargetCell
ElseIf UserForm1.OptionButton2 = True Then
    UserForm1.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
    UserForm1.ComboBox1.Value = "" '<~~ Removes the default value added at initialization.
    Set TargetRange = Sheet1.Range("B1:B10")
    For Each TargetCell In TargetRange
        UserForm1.ComboBox1.AddItem TargetCell.Value
    Next TargetCell
End If

End Sub

Private Sub OptionButton1_Change()

ChangeMyComboBoxList '<~~ Call is not required

End Sub

Private Sub OptionButton2_Change()

ChangeMyComboBoxList '<~~ Call is not required

End Sub