Introduction to Bubble Sort in VBA
                        Bubble sort is not the fastest sorting method, but it is the simplest to code, understand, and modify. This makes it a great choice for many tasks in VBA, especially when performance is not the absolute top priority.
                        The scalable solutions below can be expanded to any number of sort columns. These examples assume that Option Base is set to the default of 0, meaning the first column of an array is column zero.
                        Tip: To sort a column in descending order, simply reverse the greater-than sign (`>`) to a less-than sign (`<`).
                    
                    
                    
                        Sort a 2D Array on 1 Column
                        This example sorts a two-dimensional array named `ArrayName` on the first column (column 0). The sort is ascending. 
                        
' Sort a 2D array by a single column (ascending)
Dim i As Long, j As Long, y As Long
Dim t As Variant
Dim SortColumn1 As Long
Dim Condition1 As Boolean
SortColumn1 = 0 ' Sort by the first column
For i = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
    For j = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
        Condition1 = ArrayName(j, SortColumn1) > ArrayName(j + 1, SortColumn1)
        
        If Condition1 Then
            ' Swap entire rows
            For y = LBound(ArrayName, 2) To UBound(ArrayName, 2)
                t = ArrayName(j, y)
                ArrayName(j, y) = ArrayName(j + 1, y)
                ArrayName(j + 1, y) = t
            Next y
        End If
    Next j
Next i
                        
                    
                    
                    
                        Sort a 2D Array on 2 Columns
                        This example sorts `ArrayName` on the first column (column 0) and then by the fourth column (column 3) for any ties.
                        
' Sort a 2D array by two columns (both ascending)
' ... (Declare i, j, y, t as above) ...
Dim SortColumn1 As Long, SortColumn2 As Long
Dim Condition1 As Boolean, Condition2 As Boolean
SortColumn1 = 0
SortColumn2 = 3
For i = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
    For j = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
        ' Primary sort condition
        Condition1 = ArrayName(j, SortColumn1) > ArrayName(j + 1, SortColumn1)
        
        ' Secondary sort condition (if primary columns are equal)
        Condition2 = ArrayName(j, SortColumn1) = ArrayName(j + 1, SortColumn1) And _
                     ArrayName(j, SortColumn2) > ArrayName(j + 1, SortColumn2)
        If Condition1 Or Condition2 Then
            For y = LBound(ArrayName, 2) To UBound(ArrayName, 2)
                t = ArrayName(j, y)
                ArrayName(j, y) = ArrayName(j + 1, y)
                ArrayName(j + 1, y) = t
            Next y
        End If
    Next j
Next i
                        
                    
                    
                    
                        Sort a 2D Array on 3 Columns
                        This example extends the logic to three sort levels: column 0, then column 3, then column 5.
                        
' Sort a 2D array by three columns (all ascending)
' ... (Declare i, j, y, t as above) ...
Dim SortColumn1 As Long, SortColumn2 As Long, SortColumn3 As Long
Dim Condition1 As Boolean, Condition2 As Boolean, Condition3 As Boolean
SortColumn1 = 0
SortColumn2 = 3
SortColumn3 = 5
For i = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
    For j = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
        Condition1 = ArrayName(j, SortColumn1) > ArrayName(j + 1, SortColumn1)
        
        Condition2 = ArrayName(j, SortColumn1) = ArrayName(j + 1, SortColumn1) And _
                     ArrayName(j, SortColumn2) > ArrayName(j + 1, SortColumn2)
        Condition3 = ArrayName(j, SortColumn1) = ArrayName(j + 1, SortColumn1) And _
                     ArrayName(j, SortColumn2) = ArrayName(j + 1, SortColumn2) And _
                     ArrayName(j, SortColumn3) > ArrayName(j + 1, SortColumn3)
        If Condition1 Or Condition2 Or Condition3 Then
            For y = LBound(ArrayName, 2) To UBound(ArrayName, 2)
                t = ArrayName(j, y)
                ArrayName(j, y) = ArrayName(j + 1, y)
                ArrayName(j + 1, y) = t
            Next y
        End If
    Next j
Next i
                        
                    
                    
                        Sort a 2D Array on 4 Columns
                        Finally, this example shows a four-level sort. Notice the fourth condition uses `<` for a descending sort on that column, demonstrating how to mix sort orders.
                        
' Sort a 2D array by four columns (mixed order)
' ... (Declare i, j, y, t as above) ...
Dim SortColumn1 As Long, SortColumn2 As Long, SortColumn3 As Long, SortColumn4 As Long
Dim Condition1 As Boolean, Condition2 As Boolean, Condition3 As Boolean, Condition4 As Boolean
SortColumn1 = 0  ' Ascending
SortColumn2 = 3  ' Ascending
SortColumn3 = 5  ' Ascending
SortColumn4 = 1  ' Descending
For i = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
    For j = LBound(ArrayName, 1) To UBound(ArrayName, 1) - 1
        Condition1 = ArrayName(j, SortColumn1) > ArrayName(j + 1, SortColumn1)
        
        Condition2 = ArrayName(j, SortColumn1) = ArrayName(j + 1, SortColumn1) And _
                     ArrayName(j, SortColumn2) > ArrayName(j + 1, SortColumn2)
                     
        Condition3 = ArrayName(j, SortColumn1) = ArrayName(j + 1, SortColumn1) And _
                     ArrayName(j, SortColumn2) = ArrayName(j + 1, SortColumn2) And _
                     ArrayName(j, SortColumn3) > ArrayName(j + 1, SortColumn3)
                     
        Condition4 = ArrayName(j, SortColumn1) = ArrayName(j + 1, SortColumn1) And _
                     ArrayName(j, SortColumn2) = ArrayName(j + 1, SortColumn2) And _
                     ArrayName(j, SortColumn3) = ArrayName(j + 1, SortColumn3) And _
                     ArrayName(j, SortColumn4) < ArrayName(j + 1, SortColumn4) ' Note: < for descending
        If Condition1 Or Condition2 Or Condition3 Or Condition4 Then
            For y = LBound(ArrayName, 2) To UBound(ArrayName, 2)
                t = ArrayName(j, y)
                ArrayName(j, y) = ArrayName(j + 1, y)
                ArrayName(j + 1, y) = t
            Next y
        End If
    Next j
Next i