私はユーザーフォームにコンボボックスを持っています。アルファベット順に並べ替える最も簡単な方法は何ですか?その値はvbaでハードコードされ、新しいものは下に追加されていますので、すでに何らかの順序ではありません。アルファベット順にコンボボックスの値を並べ替え
ユーザフォームが現在使用されているため、ユーザはデータベースからExcelにデータをインポートできます。コンボボックスがあるので、どのクライアントデータをインポートするかを指定できます。
私はユーザーフォームにコンボボックスを持っています。アルファベット順に並べ替える最も簡単な方法は何ですか?その値はvbaでハードコードされ、新しいものは下に追加されていますので、すでに何らかの順序ではありません。アルファベット順にコンボボックスの値を並べ替え
ユーザフォームが現在使用されているため、ユーザはデータベースからExcelにデータをインポートできます。コンボボックスがあるので、どのクライアントデータをインポートするかを指定できます。
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
のこのルーチンの部分を確認します。フレームワークがインストールされていない場合、これはもちろん失敗します。
答えをありがとう。しかし、これは他の人々のコンピュータ上でExcelアドインとして実装されていますが、私は.NETフレームワークを持っていますが、彼らがそれを持っていることを確認する方法はありません。 –
うん。この場合、VBAで利用可能な多数のソートソリューションの1つを使用する必要があります。ここでHeapsortを使って私がGoogleで見つけたランダムなものを紹介します。http://www.source-code.biz/snippets/vbasic/1.htm – Tomalak
おそらく最小限のバブルトートは、パフォーマンスを低下させませんが、のコンボボックスアイテム。そしてそれはコードが少なくて済みます。 – Tomalak
これは、ほとんどのコンピュータ(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データセットのより単純なバージョン)です。
ソートする配列を作成することは、思ったほど難しくありません。 Sorting Mulicolumn Listboxを参照してください。 ListプロパティをVariant型に配置し、配列としてソートし、そのVariant ArrayをListプロパティにダンプすることができます。それでも素晴らしいことはありませんが、最高のVBAがあります。
これを追加するときに、すでにコンボボックスにある値と比較してください。 あなたが出会ったアイテムよりも少ない場合は、アイテムを交換してください。 以下でない場合は、アイテムがより小さいものが見つかるまで移動します。 アイテムが見つからない場合は、最後に追加します。
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:
次のようにこれは、簡単に次のようになります。私はこのテンプレートで使用している
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
が、これはフィールドのリストですおよび/またはテーブル?データベースのスキーマを使用して、ハードコードされたリストではなくリストボックスを作成することを検討しましたか? – Fionnuala
それは良い点です、おそらくリストは私にどのような方法で事前に来るだろう。私が見ることができる唯一の問題は、セキュリティとパフォーマンスの問題です。提案していただきありがとうございます。 –