Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VBA(不是字典)中制作列表?_Vba_Excel - Fatal编程技术网

如何在VBA(不是字典)中制作列表?

如何在VBA(不是字典)中制作列表?,vba,excel,Vba,Excel,我不太熟悉VB或VBA,尽管我熟悉编程 我正在使用Excel 2016,并尝试根据另一个工作表中的一列单元格填充组合框(位于用户窗体上)。我需要删除空单元格、重复项和一些已知值,然后对最后得到的内容进行排序 我有一些代码基本上可以工作(除了排序,我什么都有),但在覆盖它之前我没有保存它。它是基于。我想不出如何添加排序。它使用了一个字典,花了5秒钟弹出一个用户表单并填充组合框。列表中只有1000个单元格,所以在我看来,字典的数据结构对于这个项目来说太复杂了 我试图让代码从开始工作,但我不知道它在做

我不太熟悉VB或VBA,尽管我熟悉编程

我正在使用Excel 2016,并尝试根据另一个工作表中的一列单元格填充组合框(位于用户窗体上)。我需要删除空单元格、重复项和一些已知值,然后对最后得到的内容进行排序

我有一些代码基本上可以工作(除了排序,我什么都有),但在覆盖它之前我没有保存它。它是基于。我想不出如何添加排序。它使用了一个字典,花了5秒钟弹出一个用户表单并填充组合框。列表中只有1000个单元格,所以在我看来,字典的数据结构对于这个项目来说太复杂了

我试图让代码从开始工作,但我不知道它在做什么,因为变量名太模糊了,我对VB也不熟悉

在这一点上,我想我只需要做我自己的搜索、替换和排序,而不是依赖于复制。我似乎找不到VBA是否有List()对象。每个人都在谈论数组和字典。如果存在排序函数,我想使用一个提供排序函数的数据结构

我应该使用什么样的数据结构来处理这样的事情

我已经重建了大部分有效的代码。这是在用户表单初始化上,如果不明显的话

Private Sub UserForm_Initialize()

    '*Start with empty inputs
    InitialsTextBox.Value = ""

    MakeComboBox.Clear
    ModelComboBox.Clear

    '*Fill the Combo Boxes

    Dim oDictionary As Object
    Dim strCellContent As String
    Dim rngComboValues As Range
    Dim rngCell As Range

    Set rngComboValues = Sheets("BOM").Range("B:B")
    Set oDictionary = CreateObject("Scripting.Dictionary")

    For Each rngCell In rngComboValues
        strCellContent = rngCell.Value

        If Not oDictionary.exists(strCellContent) Then
            oDictionary.Add strCellContent, 0
        End If
    Next rngCell

    For Each itm In oDictionary.keys
        Me.MakeComboBox.AddItem itm
    Next itm

    Set oDictionary = Nothing
    End Sub
编辑/更新

下面的答案很好,但需要在运行VBA代码的机器上安装额外的库。虽然这可能适用于大多数情况(.NET在任何情况下都很常见),但对于这个项目,我强烈希望没有依赖项和/或离开VBA语言。运行此功能的环境可能不喜欢这种情况

如果存在排序函数,我想使用一个提供排序函数的数据结构

存在,例如,可以使用.Net framework

SortedList
表示按键排序并可按键和索引访问的键/值对集合

VBA代码示例:

添加对
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb的引用

输出


更多信息,例如。HTH

这是否让你朝着正确的方向前进:字典是收藏吗?也许相反?或者它们之间没有关系?字典是一种集合类型。这可能有助于将字典与集合进行比较:列表(您可能从java中了解到)在VBA中不存在。但是,在将字典添加到组合框之前,您似乎只是缺少了字典中的“排序”部分:我假设您的
组合框
没有16384个潜在值(如果有,这是一些非常糟糕的用户体验)。没有理由测试范围
B:B
中最后15000个左右的空单元格,以查看您的
字典中是否已经有
empty
-将您的数据范围限制为数据。调用.NET是否需要额外的代码、库、权限或与Windows 10、Citrix的兼容性问题,或Office 2013?.Net framework必须安装在目标系统上,才能使用其类。我不明白你说的附加代码是什么意思。示例中显示了您需要的代码。一旦安装了.net framework,您需要在
VBA
code中添加对.net framework(或实际安装的.net framework的其他版本)中提到的类型库文件的引用然后您可以创建这些类的实例。
SortedList
ComVisibleAttribute
标记,因此它可以通过
COM
在任何地方使用。但是,您可以自己在目标环境中进行尝试。
Sub SortedListDemo()
    Dim sr As mscorlib.SortedList
    Set sr = New mscorlib.SortedList
    sr.Add "D", "D"
    sr.Add "B", "B"
    sr.Add "A", "A"
    sr.Add "C", "C"
    Dim i As Integer
    For i = 0 To sr.Count - 1
        Debug.Print "Key: " & sr.GetKey(i) & ", Value: " & sr.GetByIndex(i)
    Next i
    Set sr = Nothing
End Sub
Key: A, Value: A
Key: B, Value: B
Key: C, Value: C
Key: D, Value: D