文字列や数値を混在させた配列をソートする方法(VBA)
VBAでは配列に 文字列と数値が混在している場合、通常の比較演算子では型の違いでエラーになったり、期待通りに並ばないことがあります。そこで「型を統一して比較」する工夫が必要です。
1. 文字列として統一してソート
最も簡単なのは すべて文字列に変換して比較する方法です。
Function SortMixedArray(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)
If ascending Then
If CStr(tmp(i)) > CStr(tmp(j)) Then
t = tmp(i): tmp(i) = tmp(j): tmp(j) = t
End If
Else
If CStr(tmp(i)) < CStr(tmp(j)) Then
t = tmp(i): tmp(i) = tmp(j): tmp(j) = t
End If
End If
Next j
Next i
SortMixedArray = tmp
End Function
VB👉 この方法だと "10" は "2" より前に並ぶ(文字列比較になる)ので注意。
2. 数値は数値として、文字列は文字列としてソート
「数値は数値として」「文字列は文字列として」扱いたい場合は、型を判定して比較します。
Function SortMixedArraySmart(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 IsNumeric(vj) Then
' 数値同士
If ascending Then
If CDbl(vi) > CDbl(vj) Then t = tmp(i): tmp(i) = tmp(j): tmp(j) = t
Else
If CDbl(vi) < CDbl(vj) Then t = tmp(i): tmp(i) = tmp(j): tmp(j) = t
End If
Else
' 文字列同士 or 型が違う場合は文字列比較
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
SortMixedArraySmart = tmp
End Function
VB👉 この方法なら 1, 2, 10, "Apple", "Banana" のように 数値は数値順、文字列は文字列順で並べられます。
3. 使用例
Sub TestMixedSort()
Dim arr As Variant
arr = Array("Banana", 10, "Apple", 2, 1)
Dim sortedArr As Variant
sortedArr = SortMixedArraySmart(arr, True) ' 昇順
Dim i As Long
For i = LBound(sortedArr) To UBound(sortedArr)
Debug.Print sortedArr(i)
Next i
End Sub
VB出力例(昇順):
1
2
10
Apple
Banana
まとめ
- 文字列に統一してソート → 簡単だが
"10"と"2"の順序に注意 - 型を判定してソート → 数値は数値順、文字列は文字列順で並べられる
- 昇順・降順切り替えは引数で制御可能
👉 この方法を使えば「文字列と数値が混在した配列」でも柔軟にソートできます。

