Excel VBA | 数値と文字列を混在させたまま、カスタムルールで並べ替える方法

Excel VBA VBA
スポンサーリンク

数値と文字列を混在させたまま、カスタムルールで並べ替える方法

(例:文字列を先にして数値を後に)

通常のソートでは「数値」「文字列」を同じ基準で並べ替えますが、カスタムルールを作れば「文字列を先に、その後に数値を並べる」といった柔軟な並べ替えが可能です。


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
VB

2. 使用例

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
VB

3. 出力例

元の配列:

("Banana", 10, "Apple", 2, 1, "Cherry", 20)
VB

結果(文字列を先に → 昇順、数値を後に → 昇順):

Apple
Banana
Cherry
1
2
10
20

まとめ

  • カスタムルールを組み込むことで「文字列を先に、数値を後に」など自由に並べ替え可能
  • 同じ型同士は通常の昇順/降順で比較
  • ルールを変えれば「数値を先に」「文字列を後に」「特定の文字列を最優先」なども実現できる

👉 この方法を応用すれば「文字列を先にして数値を後に」だけでなく、任意のカスタムルールで並べ替えが可能になります。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました