Excel VBA | 昇順・降順を切り替えられる汎用ソート関数

Excel VBA VBA
スポンサーリンク

文字列や数値を混在させた配列をソートする方法(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" の順序に注意
  • 型を判定してソート → 数値は数値順、文字列は文字列順で並べられる
  • 昇順・降順切り替えは引数で制御可能

👉 この方法を使えば「文字列と数値が混在した配列」でも柔軟にソートできます。

タイトルとURLをコピーしました