如何在VBA中创建列表(不是字典)?

时间:2017-03-08 20:48:13

标签: vba excel-vba excel

虽然我熟悉编程,但我对VB或VBA并不熟悉。

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

我有一些大部分工作的代码(除了排序之外我还有其他东西),但是在覆盖它之前我没有保存它。它基于this answer。我无法弄清楚如何添加排序。它使用字典并花了5秒钟弹出用户窗体并填充组合框。列表中只有1000个单元格,因此在我看来,字典对于此项目来说太复杂了。

我正在尝试从here获取代码,但我无法弄清楚它在做什么,因为变量名称太模糊了,而且我不熟悉VB。

此时,我认为我只需要自己进行搜索并进行替换和排序,而不是依赖copypasta。我似乎无法找到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语言。这将运行的环境可能不喜欢这样的事情。

1 个答案:

答案 0 :(得分:4)

  

我想使用提供排序功能的数据结构(如果存在)。

是存在,例如可以使用来自.Net框架的SortedList

SortedList表示按键排序的键/值对的集合,可通过键和索引访问。

  

VBA代码示例:

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

的引用
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

更多信息,例如 here。 HTH