数値と文字列を混在させたまま、カスタムルールで並べ替える方法
(例:文字列を先にして数値を後に)
通常のソートでは「数値」「文字列」を同じ基準で並べ替えますが、カスタムルールを作れば「文字列を先に、その後に数値を並べる」といった柔軟な並べ替えが可能です。
1. 汎用ソート関数(カスタムルール対応)
Function SortMixedCustom(arr As Variant, Optional ascending As Boolean = True) As Variant
Dim tmp As Variant, i As Long, j As Long, t As Variant
tmp = arr
For i = LBound(tmp) To UBound(tmp) - 1
For j = i + 1 To UBound(tmp)
Dim vi As Variant, vj As Variant
vi = tmp(i): vj = tmp(j)
' カスタムルール: 文字列を数値より優先
If IsNumeric(vi) And Not IsNumeric(vj) Then
' viが数値、vjが文字列 → 文字列を先に
t = tmp(i): tmp(i) = tmp(j): tmp(j) = t
ElseIf Not IsNumeric(vi) And IsNumeric(vj) Then
' viが文字列、vjが数値 → そのまま
Else
' 同じ型同士なら通常の昇順/降順比較
If ascending Then
If CStr(vi) > CStr(vj) Then t = tmp(i): tmp(i) = tmp(j): tmp(j) = t
Else
If CStr(vi) < CStr(vj) Then t = tmp(i): tmp(i) = tmp(j): tmp(j) = t
End If
End If
Next j
Next i
SortMixedCustom = tmp
End Function
VB2. 使用例
Sub TestCustomSort()
Dim arr As Variant
arr = Array("Banana", 10, "Apple", 2, 1, "Cherry", 20)
Dim sortedArr As Variant
sortedArr = SortMixedCustom(arr, True) ' 昇順(文字列先、数値後)
Dim i As Long
For i = LBound(sortedArr) To UBound(sortedArr)
Debug.Print sortedArr(i)
Next i
End Sub
VB3. 出力例
元の配列:
("Banana", 10, "Apple", 2, 1, "Cherry", 20)
VB結果(文字列を先に → 昇順、数値を後に → 昇順):
Apple
Banana
Cherry
1
2
10
20
まとめ
- カスタムルールを組み込むことで「文字列を先に、数値を後に」など自由に並べ替え可能
- 同じ型同士は通常の昇順/降順で比較
- ルールを変えれば「数値を先に」「文字列を後に」「特定の文字列を最優先」なども実現できる
👉 この方法を応用すれば「文字列を先にして数値を後に」だけでなく、任意のカスタムルールで並べ替えが可能になります。

