网站首页 > 知识剖析 正文
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)
运行结果如下:
通过以上自定义函数,我们便能轻松的完成数组的排序了。建议收藏,直接拿来使用。
猜你喜欢
- 2025-01-20 Excel中的6个经典排序技巧都不掌握,还敢称Excel达人?
- 2025-01-20 查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
- 2025-01-20 一起学《C程序设计》第六课——数组、字符串及实战练习
- 2025-01-20 一文解决CSP-J考纲所有排序算法
- 2025-01-20 Excel VBA 自定义函数/数组字段定位/数组字段排序
- 2025-01-20 java基础,arrays类,Java的八种排序,冒泡排序
- 2025-01-20 excel中什么是数组,数组的作用是什么,这篇文章就带你入门
- 2025-01-20 16.9 数组 - 数据排序技术
- 2025-01-20 怎么求第K大的数,topK 问题(快排的应用)java
- 2025-01-20 VBA按日期统计就餐时段刷卡及人数(数组字典内置函数去重排序)
- 04-29php开发者composer使用看这一篇就够了
- 04-29引用和变量声明在不同语言中的实作
- 04-29PHP 没你想的那么差
- 04-29Ubuntu linux 上的 Nginx 和 Php 安装
- 04-29CentOS下通过yum搭建lnmp(单版本PHP)
- 04-29为什么 PHP8 是个高性能版本
- 04-29PHP8函数包含文件-PHP8知识详解
- 04-29使用无参数函数进行命令执行
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)