我如何使用 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 在同一时间只能在其组中选择一个。
- 当您将它们添加到
Frame
时,它们会自动分组到 Frame
(see here stating they are mutually exclusive) 之外的选项按钮。
- 我在与您的工作表无关的范围内使用了虚拟数据 - 但您只需要更改对工作表和范围的引用。
- 我已经将
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
我正在寻找一种方法,它可以根据所选的选项框轻松地 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 在同一时间只能在其组中选择一个。- 当您将它们添加到
Frame
时,它们会自动分组到Frame
(see here stating they are mutually exclusive) 之外的选项按钮。
- 当您将它们添加到
- 我在与您的工作表无关的范围内使用了虚拟数据 - 但您只需要更改对工作表和范围的引用。
- 我已经将
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