2017-03-08 13 views
2

私はVBやVBAに精通していませんが、私はプログラミングに精通しています。VBAでリストを作成するにはどうすればいいですか?

私はExcel 2016で作業していて、別のワークシートのセルの列に基づいてコンボボックス(ユーザーフォームに表示されます)を作成しようとしています。私は空のセル、重複、いくつかの既知の値を削除し、次に私が巻き上げるものを並べ替える必要があります。

私は大部分は動作していました(私はすべてをソートしていました)が、それを上書きする前に保存しませんでした。それはthis answerに基づいていました。私はそれにソートを追加する方法を見つけることができませんでした。それは辞書を使って、ユーザーフォームをポップアップしてコンボボックスに入力するのに5秒かかりました。リストには10​​00個のセルしかないので、辞書はこのプロジェクトのデータ構造には複雑すぎるようです。

私はhereからコードを取得しようとしていますが、変数名が非常に曖昧で、VBに慣れていないので、何をしているのか分かりません。

この時点で、私は自分の検索を行い、置き換えて並べ替えるだけで、コピペスタに頼らないと思っています。 VBAにList()オブジェクトがあるかどうかはわかりません。誰もが配列と辞書について話しています。私はソート機能を提供するデータ構造を使用したいと思います。

このようなデータ構造にはどのようなデータ構造を使用しますか?

私は主に動作するコードを再構築しました。これは明らかでない場合、これはUserForm Initializeにあります。

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

関連する問題