如何在VBA(不是字典)中制作列表?
我不太熟悉VB或VBA,尽管我熟悉编程 我正在使用Excel 2016,并尝试根据另一个工作表中的一列单元格填充组合框(位于用户窗体上)。我需要删除空单元格、重复项和一些已知值,然后对最后得到的内容进行排序 我有一些代码基本上可以工作(除了排序,我什么都有),但在覆盖它之前我没有保存它。它是基于。我想不出如何添加排序。它使用了一个字典,花了5秒钟弹出一个用户表单并填充组合框。列表中只有1000个单元格,所以在我看来,字典的数据结构对于这个项目来说太复杂了 我试图让代码从开始工作,但我不知道它在做什么,因为变量名太模糊了,我对VB也不熟悉 在这一点上,我想我只需要做我自己的搜索、替换和排序,而不是依赖于复制。我似乎找不到VBA是否有List()对象。每个人都在谈论数组和字典。如果存在排序函数,我想使用一个提供排序函数的数据结构 我应该使用什么样的数据结构来处理这样的事情 我已经重建了大部分有效的代码。这是在用户表单初始化上,如果不明显的话如何在VBA(不是字典)中制作列表?,vba,excel,Vba,Excel,我不太熟悉VB或VBA,尽管我熟悉编程 我正在使用Excel 2016,并尝试根据另一个工作表中的一列单元格填充组合框(位于用户窗体上)。我需要删除空单元格、重复项和一些已知值,然后对最后得到的内容进行排序 我有一些代码基本上可以工作(除了排序,我什么都有),但在覆盖它之前我没有保存它。它是基于。我想不出如何添加排序。它使用了一个字典,花了5秒钟弹出一个用户表单并填充组合框。列表中只有1000个单元格,所以在我看来,字典的数据结构对于这个项目来说太复杂了 我试图让代码从开始工作,但我不知道它在做
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