如何使用集合为用户表单中的下拉列表提供选项 - Excel VBA
How to use a collection to provide options for a drop down list in a user form - Excel VBA
我正在尝试在用户表单中创建一个下拉列表,以填充从同一工作簿中的列表中提取的唯一值。我想避免必须打印这个唯一值列表。
我这里有两个问题:
- 我无法创建此“唯一值列表”
- 我不知道如何让我的下拉列表使用之前生成的唯一值列表。
这是我不成功的尝试(我希望由 H 列中的值组成唯一值的集合):
Private Sub OSizeBox_Click()
Dim arr() As New Collection, a
Dim rng() As Range
Dim LRow As Long
LRow = Cells(Rows.Count, 2).End(xlUp).Row
rng() = Range("H3", "H" & LRow)
For Each a In rng
arr.Add Str(a), Str(a)
Next
OSizeBox.RowSource = arr()
End sub
在 运行 这段代码中,我收到以下错误:“编译错误:无效限定符”,突出显示 For/Next 循环中的 arr
。
非常感谢任何帮助或建议!
提前谢谢你。
好的,我试试看。
Sub OSizeBox_Click()
Dim arr As New Collection, a
Dim rng As Range
Dim LRow As Long
LRow = Worksheets("Sheet_Name").Cells(Rows.Count, "H").End(xlUp).Row
Set rng = Worksheets("Sheet_Name").Range("H3:H" & LRow)
For Each a In rng
' Debug.Print a
arr.Add a
Next
End Sub
应该可以编译,希望它能给你结果。只是一些注意事项。范围对象和集合对象不需要定义为数组,您需要指定 LRow 来自哪一列,我假设的范围是 'H',对象应该是 Set。确保“Sheet_Name”是您的下拉数据所在的 sheet 的名称。
希望这能给你一个开始。
编辑:我还应该说明我正在使用来自 Microsoft 365 的 Excel,最新版本和更新。
此致,
njc
试试这个代码:
Option Explicit
Private Sub UserForm_Activate() 'starts when the form becomes active
Dim col As New Collection, rng As Range, a As Variant
With ThisWorkbook.Worksheets(1) 'your WB and WS
Set rng = .Range("H3", .Cells(.Rows.Count, "H").End(xlUp))
End With
On Error Resume Next ' error suppression if the key is not unique
For Each a In rng
col.Add a.Text, a.Text 'added only unique values
Next
On Error GoTo 0 ' disable error handling
For Each a In col
Me.OSizeBox.AddItem a 'add unique values from col
Next
End Sub
这一行
Dim arr() As New Collection
告诉VBA创建新集合的动态数组。如果你查看你的 locals window 你会看到在上面的行执行后你会得到 'arr = Collection()'.
我怀疑这不是您想要的,而是您想要的
'Arr=collection'
在这种情况下你应该使用
Dim Arr as Collection
set Arr = new collection
'Dim ....as New Object' 形式是 VBA 允许的,但不是一个好的编程习惯。
如果您使用 Arr 的上述定义,您应该会发现您的 'Arr.add a' 应该可以正常工作。
如果您为 VBA 安装免费且出色的 Rubberduck 插件并查看它生成的代码检查,您可以获得很多关于语法错误的反馈。当您看到您的代码生成了多少检查注释时,准备好叹气吧。
我正在尝试在用户表单中创建一个下拉列表,以填充从同一工作簿中的列表中提取的唯一值。我想避免必须打印这个唯一值列表。 我这里有两个问题:
- 我无法创建此“唯一值列表”
- 我不知道如何让我的下拉列表使用之前生成的唯一值列表。
这是我不成功的尝试(我希望由 H 列中的值组成唯一值的集合):
Private Sub OSizeBox_Click()
Dim arr() As New Collection, a
Dim rng() As Range
Dim LRow As Long
LRow = Cells(Rows.Count, 2).End(xlUp).Row
rng() = Range("H3", "H" & LRow)
For Each a In rng
arr.Add Str(a), Str(a)
Next
OSizeBox.RowSource = arr()
End sub
在 运行 这段代码中,我收到以下错误:“编译错误:无效限定符”,突出显示 For/Next 循环中的 arr
。
非常感谢任何帮助或建议! 提前谢谢你。
好的,我试试看。
Sub OSizeBox_Click()
Dim arr As New Collection, a
Dim rng As Range
Dim LRow As Long
LRow = Worksheets("Sheet_Name").Cells(Rows.Count, "H").End(xlUp).Row
Set rng = Worksheets("Sheet_Name").Range("H3:H" & LRow)
For Each a In rng
' Debug.Print a
arr.Add a
Next
End Sub
应该可以编译,希望它能给你结果。只是一些注意事项。范围对象和集合对象不需要定义为数组,您需要指定 LRow 来自哪一列,我假设的范围是 'H',对象应该是 Set。确保“Sheet_Name”是您的下拉数据所在的 sheet 的名称。
希望这能给你一个开始。
编辑:我还应该说明我正在使用来自 Microsoft 365 的 Excel,最新版本和更新。
此致, njc
试试这个代码:
Option Explicit
Private Sub UserForm_Activate() 'starts when the form becomes active
Dim col As New Collection, rng As Range, a As Variant
With ThisWorkbook.Worksheets(1) 'your WB and WS
Set rng = .Range("H3", .Cells(.Rows.Count, "H").End(xlUp))
End With
On Error Resume Next ' error suppression if the key is not unique
For Each a In rng
col.Add a.Text, a.Text 'added only unique values
Next
On Error GoTo 0 ' disable error handling
For Each a In col
Me.OSizeBox.AddItem a 'add unique values from col
Next
End Sub
这一行
Dim arr() As New Collection
告诉VBA创建新集合的动态数组。如果你查看你的 locals window 你会看到在上面的行执行后你会得到 'arr = Collection()'.
我怀疑这不是您想要的,而是您想要的
'Arr=collection'
在这种情况下你应该使用
Dim Arr as Collection
set Arr = new collection
'Dim ....as New Object' 形式是 VBA 允许的,但不是一个好的编程习惯。
如果您使用 Arr 的上述定义,您应该会发现您的 'Arr.add a' 应该可以正常工作。
如果您为 VBA 安装免费且出色的 Rubberduck 插件并查看它生成的代码检查,您可以获得很多关于语法错误的反馈。当您看到您的代码生成了多少检查注释时,准备好叹气吧。