キーと値を同時にソートして、結果を配列や新しいDictionaryに格納する方法
Scripting.Dictionary は順序を保持しないため、キーと値をペアとしてまとめてソート → 新しい配列やDictionaryに格納する必要があります。これで「キーと値を同時にソートした結果」を扱えるようになります。
1. キーと値をペアにして配列へ格納
まず、キーと値をペアとして配列にまとめます。
Function DictToArray(dict As Object) As Variant
Dim arr() As Variant
Dim i As Long, k As Variant
ReDim arr(1 To dict.Count, 1 To 2)
i = 1
For Each k In dict.Keys
arr(i, 1) = k
arr(i, 2) = dict(k)
i = i + 1
Next k
DictToArray = arr
End Function
VB2. 配列をソート(キーまたは値で)
Sub SortArrayByColumn(arr As Variant, colIndex As Long)
Dim i As Long, j As Long
Dim tmpKey As Variant, tmpVal As Variant
For i = LBound(arr, 1) To UBound(arr, 1) - 1
For j = i + 1 To UBound(arr, 1)
If arr(i, colIndex) > arr(j, colIndex) Then
tmpKey = arr(i, 1): tmpVal = arr(i, 2)
arr(i, 1) = arr(j, 1): arr(i, 2) = arr(j, 2)
arr(j, 1) = tmpKey: arr(j, 2) = tmpVal
End If
Next j
Next i
End Sub
VBcolIndex = 1→ キーでソートcolIndex = 2→ 値でソート
3. 新しいDictionaryに格納
Function ArrayToDict(arr As Variant) As Object
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long
For i = LBound(arr, 1) To UBound(arr, 1)
dict(arr(i, 1)) = arr(i, 2)
Next i
Set ArrayToDict = dict
End Function
VB4. 実行例
Sub TestDictSortBoth()
Dim dict As Object, arr As Variant, sortedDict As Object
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "C", "Cherry"
dict.Add "A", "Apple"
dict.Add "B", "Banana"
' キーと値を配列化
arr = DictToArray(dict)
' 値でソート
SortArrayByColumn arr, 2
' 新しいDictionaryに格納
Set sortedDict = ArrayToDict(arr)
' 出力確認
Dim k As Variant
For Each k In sortedDict.Keys
Debug.Print k & " => " & sortedDict(k)
Next k
End Sub
VB出力:
A => Apple
B => Banana
C => Cherry
まとめ
- Dict → 配列化 → キーと値をペアにする
- 配列をソート → キー順・値順を選べる
- 新しいDictionaryに再格納 → ソート済みの結果を保持できる
👉 この方法を使えば「キーと値を同時にソートして結果を配列や新しいDictionaryに格納」できるので、データを整理して扱うのがぐっと楽になります。

