领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

自定义通用数组排序函数

nixiaole 2025-01-20 15:39:25 知识剖析 13 ℃

VBA编程中,除了使用字典外,同样也会大量使用到数组。数组其实也不难,前面的文章中讲到了字典,其实你也是可以把它当成一个二维数组来看待的,只是字典的操作更加简洁,更容易理解,也更容易上手。

不管是字典,还是数组,其中一个最大的难题便是排序。我们在对数据处理的时候,肯定需要对数据进行排序的,以便筛选需要的数据。下面提供一个VBA中的自定义函数,它是一个通用的排序函数,可以做到拿来便用。

Function Array_Sort(Array_, Key1, Order)    '(Array_[将要排序的数组], Key1[垂直数组(y,x)中x,像表格中的哪一列作关键字], Order[=1,升序;<>1,降序])
    Dim t, x&, y&, i&, j&, k&, xx&, yy&, tt&, AD&
    For i = 1 To 60
        On Error Resume Next
        Err.Clear
        tt = UBound(Array_, i)
        If Err.Number = 9 Then AD = i - 1: Exit For    'AD,数组维数
    Next
    If AD = 2 Then
        If Not (Key1 >= LBound(Array_, 2) And Key1 <= UBound(Array_, 2)) Then Exit Function
    ElseIf AD = 1 Then
        Array_ = Application.Transpose(Array_)
        Key1 = 1
    Else
        Exit Function
    End If
    y = LBound(Array_, 1): x = LBound(Array_, 2)
    yy = UBound(Array_): xx = UBound(Array_, 2)
    If Order = 1 Then    '升序
        For i = y To yy - 1
            For j = i + 1 To yy
                If Array_(j, Key1) < Array_(i, Key1) Then    '冒泡排序法
                    For k = x To xx
                        t = Array_(j, k): Array_(j, k) = Array_(i, k): Array_(i, k) = t
                    Next
                End If
            Next
        Next
    Else    '降序
        For i = y To yy - 1
            For j = i + 1 To yy
                If Array_(j, Key1) > Array_(i, Key1) Then
                    For k = x To xx
                        t = Array_(j, k): Array_(j, k) = Array_(i, k): Array_(i, k) = t
                    Next
                End If
            Next
        Next
    End If
    If AD = 2 Then Array_Sort = Array_ Else Array_Sort = Application.Transpose(Array_)
End Function

自定义函数中有三个参数,其中,Array_[将要排序的数组], Key1[垂直数组(y,x)中x,像表格中的哪一列作关键字], Order[=1,升序;<>1,降序]

然后另外要强调的是,该自定义函数仅只能用于一维数组和二维数组。

下面举几个简单的例子来说明它的用法。

对一维数组的排序

Private Sub hong1_Click()
    Dim arr(1 To 5)    '一维数组
    For i = 1 To 5
        arr(i) = [int(rand()*100)+1]
    Next
    [a1].Resize(1, 5) = arr
    brr = Array_Sort(arr, 1, 1)    '详见自定义函数Array_Sort使用
    [a2].Resize(1, 5) = brr
End Sub

先对代码稍加解释一下:

Dim arr(1 To 5),首先定义一个一维数组

然后我们给数组随机赋值

[a1].Resize(1, 5) = arr,我们把数组填充到A1:E1

brr = Array_Sort(arr, 1, 1),然后通过自定义函数对原有的数组进行排序,并赋值给新数组

[a2].Resize(1, 5) = brr,排序后的结果填充到A2:E2

运行结果如下:

对二维数组的排序

与一维数组相比较,唯一不同的点自定义函数中的Key,它可以是第一维,也可以是第二维,或者第三维。

如下面的代码,以第三维按降序排列。

Private Sub hong2_Click()
    Dim arr(1 To 5, 1 To 3)    '二维数组
    For i = 1 To 5
        arr(i, 1) = [int(rand()*100)+1]
        arr(i, 2) = [int(rand()*100)+1]
        arr(i, 3) = [int(rand()*100)+1]
    Next
    [a4].Resize(5, 3) = arr
    brr = Array_Sort(arr, 3, 0)
    [f4].Resize(5, 3) = brr
End Sub

运行结果如下图:

如果以第二维按升序排列的话,只要修改自定义函数中的Key和Order即可。

brr = Array_Sort(arr, 1, 1)

运行结果如下:

通过以上自定义函数,我们便能轻松的完成数组的排序了。建议收藏,直接拿来使用。

最近发表
标签列表