2017-03-08 1379 views
2

雖然我對編程很熟悉,但我並不熟悉VB或VBA。如何在VBA中創建列表(而不是字典)?

我正在使用Excel 2016,並試圖根據另一個工作表中的一列單元格填充組合框(位於用戶窗體上)。我需要刪除空單元格,重複項,一些已知的值,然後對結果進行排序。

我有一些代碼主要工作(我有一切,但排序),但我沒有保存它覆蓋之前。它基於this answer。我無法弄清楚如何添加排序。它使用了一個字典,並花了5秒鐘彈出一個用戶窗體並填充組合框。列表中只有1000個單元格,所以在我看來,這個項目的字典對於數據結構來說太複雜了。

我試圖從here得到代碼的工作,但我不知道它在做什麼,因爲變量名稱是如此模糊,我不熟悉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語言。這將運行的環境可能不喜歡這樣的事情。

+0

這是否讓你走在正確的方向:http://stackoverflow.com/questions/3587662/how-do-i-sort-a-collection – sous2817

+0

是一個字典集合?也許換一種方式呢?或者他們不相關? – YetAnotherRandomUser

+1

字典是一種集合 – sous2817

回答

4

我想使用提供排序功能的數據結構(如果存在)。

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

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

+0

調用.NET是否需要Windows 10,Citrix或Office 2013的其他代碼,庫,權限或兼容性問題? – YetAnotherRandomUser

+0

.Net框架必須安裝在目標系統上,以便您可以使用它的類。我不明白你的意思是用附加的代碼。示例中顯示了您需要的代碼。一旦你安裝了.net框架,在'VBA'代碼中,你需要從.net框架(或者實際安裝的某個其他版本的.net框架)添加對所提到的類型庫文件的引用,然後你可以創建實例.SortedList'被標記爲'ComVisibleAttribute',所以它可以在任何地方通過'COM'使用。但是請嘗試一下你自己的目標環境。 – dee