VBA

Sorting

Introduction#

Unlike the .NET framework, the Visual Basic for Applications library does not include routines to sort arrays.

There are two types of workarounds: 1) implementing a sorting algorithm from scratch, or 2) using sorting routines in other commonly-available libraries.

Algorithm Implementation - Quick Sort on a One-Dimensional Array

From https://stackoverflow.com/questions/152319/vba-array-sort-function

Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)

  Dim pivot   As Variant
  Dim tmpSwap As Variant
  Dim tmpLow  As Long
  Dim tmpHi   As Long

  tmpLow = inLow
  tmpHi = inHi

  pivot = vArray((inLow + inHi) \ 2)

  While (tmpLow <= tmpHi)

     While (vArray(tmpLow) < pivot And tmpLow < inHi)
        tmpLow = tmpLow + 1
     Wend

     While (pivot < vArray(tmpHi) And tmpHi > inLow)
        tmpHi = tmpHi - 1
     Wend

     If (tmpLow <= tmpHi) Then
        tmpSwap = vArray(tmpLow)
        vArray(tmpLow) = vArray(tmpHi)
        vArray(tmpHi) = tmpSwap
        tmpLow = tmpLow + 1
        tmpHi = tmpHi - 1
     End If

  Wend

  If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
  If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi

End Sub

Using the Excel Library to Sort a One-Dimensional Array

This code takes advantage of the Sort class in the Microsoft Excel Object Library.

For further reading, see:

  • https://stackoverflow.com/questions/28616373/copy-a-range-to-a-virtual-range

  • https://stackoverflow.com/questions/18000617/how-to-copy-selected-range-into-given-array

    Sub testExcelSort()

    Dim arr As Variant

    InitArray arr ExcelSort arr

    End Sub

    Private Sub InitArray(arr As Variant)

    Const size = 10 ReDim arr(size)

    Dim i As Integer

    ’ Add descending numbers to the array to start For i = 0 To size arr(i) = size - i Next i

    End Sub

    Private Sub ExcelSort(arr As Variant)

    ’ Ininitialize the Excel objects (required) Dim xl As New Excel.Application Dim wbk As Workbook Set wbk = xl.Workbooks.Add Dim sht As Worksheet Set sht = wbk.ActiveSheet

    ’ Copy the array to the Range object Dim rng As Range Set rng = sht.Range(“A1”) Set rng = rng.Resize(UBound(arr, 1), 1) rng.Value = xl.WorksheetFunction.Transpose(arr)

    ’ Run the worksheet’s sort routine on the Range Dim MySort As Sort Set MySort = sht.Sort

    With MySort .SortFields.Clear .SortFields.Add rng, xlSortOnValues, xlAscending, xlSortNormal .SetRange rng .Header = xlNo .Apply End With

    ’ Copy the results back to the array CopyRangeToArray rng, arr

    ’ Clear the objects Set rng = Nothing wbk.Close False xl.Quit

    End Sub

    Private Sub CopyRangeToArray(rng As Range, arr)

    Dim i As Long Dim c As Range

    ’ Can’t just set the array to Range.value (adds a dimension) For Each c In rng.Cells arr(i) = c.Value i = i + 1 Next c

    End Sub


This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow