2009-05-13 40 views
1

私はユーザーフォームにコンボボックスを持っています。アルファベット順に並べ替える最も簡単な方法は何ですか?その値はvbaでハードコードされ、新しいものは下に追加されていますので、すでに何らかの順序ではありません。アルファベット順にコンボボックスの値を並べ替え

ユーザフォームが現在使用されているため、ユーザはデータベースからExcelにデータをインポートできます。コンボボックスがあるので、どのクライアントデータをインポートするかを指定できます。

+0

が、これはフィールドのリストですおよび/またはテーブル?データベースのスキーマを使用して、ハードコードされたリストではなくリストボックスを作成することを検討しましたか? – Fionnuala

+0

それは良い点です、おそらくリストは私にどのような方法で事前に来るだろう。私が見ることができる唯一の問題は、セキュリティとパフォーマンスの問題です。提案していただきありがとうございます。 –

答えて

0

VBAには、このようなものの組み込みソート機能がありません。残念ながら。自分はCOM経由で.NET FrameworkのArrayListクラスを使用することで人気のソートアルゴリズムのいずれかを使用して/実装伴わない

一つの安価な方法:

Sub test() 
    Dim l As Object 
    Set l = CreateObject("System.Collections.ArrayList") 

    ''# these would be the items from your combobox, obviously 
    ''# ... add them with a for loop 
    l.Add "d" 
    l.Add "c" 
    l.Add "b" 
    l.Add "a" 

    l.Sort 

    ''# now clear your combobox 

    Dim k As Variant 
    For Each k In l 
    ''# add the sorted items back to your combobox instead 
    Debug.Print k 
    Next k 

End Sub 

UserForm_Initializeのこのルーチンの部分を確認します。フレームワークがインストールされていない場合、これはもちろん失敗します。

+0

答えをありがとう。しかし、これは他の人々のコンピュータ上でExcelアドインとして実装されていますが、私は.NETフレームワークを持っていますが、彼らがそれを持っていることを確認する方法はありません。 –

+0

うん。この場合、VBAで利用可能な多数のソートソリューションの1つを使用する必要があります。ここでHeapsortを使って私がGoogleで見つけたランダムなものを紹介します。http://www.source-code.biz/snippets/vbasic/1.htm – Tomalak

+0

おそらく最小限のバブルトートは、パフォーマンスを低下させませんが、のコンボボックスアイテム。そしてそれはコードが少なくて済みます。 – Tomalak

0

これは、ほとんどのコンピュータ(Excelがインストールされている)で利用できるADOライブラリを使用しています。

 

Sub SortSomeData() 
Dim rstData As New ADODB.Recordset 
rstData.Fields.Append "Name", adVarChar, 40 
rstData.Fields.Append "Age", adInteger 

rstData.Open 

rstData.AddNew 
rstData.Fields("Name") = "Kalpesh" 
rstData.Fields("Age") = 30 
rstData.Update 

rstData.AddNew 
rstData.Fields("Name") = "Jon" 
rstData.Fields("Age") = 29 
rstData.Update 

rstData.AddNew 
rstData.Fields("Name") = "praxeo" 
rstData.Fields("Age") = 1 
rstData.Update 

MsgBox rstData.RecordCount 
Call printData(rstData) 

Debug.Print vbCrLf & "Name DESC" 
rstData.Sort = "Name DESC" 
Call printData(rstData) 

Debug.Print vbCrLf & "Name ASC" 
rstData.Sort = "Name ASC" 
Call printData(rstData) 

Debug.Print vbCrLf & "Age ASC" 
rstData.Sort = "Age ASC" 
Call printData(rstData) 

Debug.Print vbCrLf & "Age DESC" 
rstData.Sort = "Age DESC" 
Call printData(rstData) 
End Sub 

Sub printData(ByVal data As Recordset) 
    Debug.Print data.GetString 
End Sub 

 

これは、開始するための十分な背景を提供します。
FYI - これは切断されたレコードセット(メモリテーブルの.netデータセットのより単純なバージョン)です。

2

ソートする配列を作成することは、思ったほど難しくありません。 Sorting Mulicolumn Listboxを参照してください。 ListプロパティをVariant型に配置し、配列としてソートし、そのVariant ArrayをListプロパティにダンプすることができます。それでも素晴らしいことはありませんが、最高のVBAがあります。

2

これを追加するときに、すでにコンボボックスにある値と比較してください。 あなたが出会ったアイテムよりも少ない場合は、アイテムを交換してください。 以下でない場合は、アイテムがより小さいものが見つかるまで移動します。 アイテムが見つからない場合は、最後に追加します。

For X = 0 To COMBOBOX.ListCount - 1 
    COMBOBOX.ListIndex = X 
    If NEWVALUE < COMBOBOX.Value Then 
    COMBOBOX.AddItem (NEWVALUE), X 
    GoTo SKIPHERE 
    End If 
Next X 
     COMBOBOX.AddItem (NEWVALUE) 
SKIPHERE: 
0

次のようにこれは、簡単に次のようになります。私はこのテンプレートで使用している

Sub fill_combobox() 
Dim LastRow, a, b As Long, c As Variant 
ComboBox1.Clear 
LastRow = Sheets("S1").Cells(Rows.Count, 2).End(xlUp).Row 

For x = 2 To LastRow 
ComboBox1.AddItem Cells(x, 2).Value 
Next 
    For a = 0 To ComboBox1.ListCount - 1 
    For b = a To ComboBox1.ListCount - 1 
     If ComboBox1.List(b) < ComboBox1.List(a) Then 
c = ComboBox1.List(a) 
    ComboBox1.List(a) = ComboBox1.List(b) 
    ComboBox1.List(b) = c 
     End If 
    Next 
    Next 
End Sub 

はアルファベット順にユーザーフォームコンボボックスにアイテムを追加 enter image description here

関連する問題