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)
运行结果如下:
二维数组排序结果
通过以上自定义函数,我们便能轻松的完成数组的排序了。建议收藏,直接拿来使用。