如何使用集合为用户表单中的下拉列表提供选项 - Excel VBA

How to use a collection to provide options for a drop down list in a user form - Excel VBA

我正在尝试在用户表单中创建一个下拉列表,以填充从同一工作簿中的列表中提取的唯一值。我想避免必须打印这个唯一值列表。 我这里有两个问题:

  1. 我无法创建此“唯一值列表”
  2. 我不知道如何让我的下拉列表使用之前生成的唯一值列表。

这是我不成功的尝试(我希望由 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 插件并查看它生成的代码检查,您可以获得很多关于语法错误的反馈。当您看到您的代码生成了多少检查注释时,准备好叹气吧。