虽然我熟悉编程,但我对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语言。这将运行的环境可能不喜欢这样的事情。
答案 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