Excel·VBA按指定顺序排序函数

与之前写过的《Excel·VBA数组冒泡排序函数》不同,不是按照数值大小的升序/降序对数组进行排序,而是按照指定数组的顺序,对另一个数组进行排序

以下代码调用了《Excel·VBA数组冒泡排序函数》bubble_sort_arr函数(如需使用代码需复制)

Function 按指定顺序排序(ByVal sorted, ByVal arr, Optional ByVal key_col& = 1, Optional start As Boolean = False)'sorted已排序的数组,arr数组第key_col列将按sorted顺序排序,arr如果是一维数组则key_col无意义,key_col从1开始计数'start参数为True时,arr数组第key_col列值的开头符合sorted中的值,也进行排序;否则排在最后(匹配模式)'sorted数组可以是一维或二维,都会读取为字典(从上往下从左往右顺序);返回数组从1开始计数Dim dict As Object, x&, a, c&, dc&, i&, j&, temp, resultSet dict = CreateObject("scripting.dictionary"): On Error Resume NextFor Each s In sorted  'sorted数组转换为字典,键为字符串,值为顺序号If Not dict.Exists(s) Then x = x + 1: dict(s) = xNextx = 0: dc = dict.Count: a = TypeName(UBound(arr, 2))  '利用报错判断,获取数组维数If a = "" Then  'arr为一维数组c = UBound(arr) - LBound(arr) + 1: ReDim temp(1 To c, 1 To 2): ReDim result(1 To c)For Each a In arr  'temp数组,第1列为对应arr的值,第2列为排序序号x = x + 1: temp(x, 1) = aFor Each k In dict.keysIf a = k Thentemp(x, 2) = dict(k): Exit For    '全部相同,使用排序序号ElseIf start And a Like k & "*" Then  '开头符合,使用排序序号+0.1temp(x, 2) = dict(k) + 0.1: Exit ForEnd IfNextIf Len(temp(x, 2)) = 0 Then temp(x, 2) = dc + 1  '都不符合,排在最后Nexttemp = bubble_sort_arr(temp, 2)  '调用函数排序For x = 1 To c  '排序结果写入result数组,并输出result(x) = temp(x, 1)Next按指定顺序排序 = resultElse  'arr为二维数组If LBound(arr) = 0 Or LBound(arr, 2) = 0 Then  '转为从1开始计数arr = WorksheetFunction.Transpose(WorksheetFunction.Transpose(arr))End Ifc = UBound(arr): ReDim temp(1 To c, 1 To 2): ReDim result(1 To c, 1 To UBound(arr, 2))For x = 1 To c  'temp数组,第1列为对应arr的序号,第2列为排序序号temp(x, 1) = x: a = arr(x, key_col)  'key_col从1开始计数For Each k In dict.keysIf a = k Thentemp(x, 2) = dict(k): Exit For    '全部相同,使用排序序号ElseIf start And a Like k & "*" Then  '开头符合,使用排序序号+0.1temp(x, 2) = dict(k) + 0.1: Exit ForEnd IfNextIf Len(temp(x, 2)) = 0 Then temp(x, 2) = dc + 1  '都不符合,排在最后Nexttemp = bubble_sort_arr(temp, 2)  '调用函数排序For i = 1 To c  '排序结果写入result数组,并输出x = temp(i, 1)For j = 1 To UBound(arr, 2)result(i, j) = arr(x, j)NextNext按指定顺序排序 = resultEnd If
End Function
  • 举例1
Sub 排序测试1()Dim arr, brr, crr'一维数组arr = Array("A", "B", "C", "D", "E", "F")brr = Array("AA", "C", "BB", "B", "CC", "A")crr = 按指定顺序排序(arr, brr)[e1].Resize(1, UBound(crr)) = crr  '一维数组单行输出'二维数组arr = [a1].CurrentRegion: brr = [c1].CurrentRegioncrr = 按指定顺序排序(arr, brr)[e1].Resize(UBound(crr), UBound(crr, 2)) = crr  '二维数组单列输出
End Sub

start参数为默认值False,字符串完全相同时确定序号
在这里插入图片描述
start参数为True,使用开头匹配模式,字符串完全相同或开头相同时确定序号,结果与上面不同
在这里插入图片描述

  • 举例2
Sub 按指定顺序排序_测试()Dim arr, brr, crrarr = [a1].CurrentRegion: brr = [c1].CurrentRegioncrr = 按指定顺序排序(arr, brr, , True)  '开头匹配模式[f1].Resize(UBound(crr), UBound(crr, 2)) = crr
End Sub

start参数为True,使用开头匹配模式,字符串完全相同或开头相同时确定序号
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329792.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理系统-基于javaweb的图书管理系统

基于javaweb的图书管理系统 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 本项目采用eclipse工具开发,jspservlet技术编写,样式采用了layui…

python总结-生成器与迭代器

生成器与迭代器 生成器生成器定义为什么要有生成器创建生成器的方式一(生成器表达式) 创建生成器的方式二(生成器函数)生成器函数的工作原理总结 迭代器概念可迭代对象和迭代器区别for循环的本质创建一个迭代器 动态添加属性和方法运行过程中给对象、类添加属性和方法types.Met…

MySQL练习-DDL语法练习

文章目录 1、数据库操作2、表操作3、DDL数据类型 突然想起来好久没写过SQL了,写一下SQL练习一下😊 个人写sql比较喜欢用小写😁 什么是DDL:DDL是对数据库和表的操作 在这里练习DLL的时候先不添加约束,后面会把约束集中…

Lumerical------关闭 drawing grid 去更好地显示 mesh grid

Lumerical------关闭 drawing grid 去更好地显示 mesh grid 引言正文 引言 在 Lumerical 结构设置的时候,有时候我们想要查看 mesh 结构的 grid,但是本身默认的 dtawing grid 黑框会阻碍我们的观察,这时,我们便可以通过设置关闭这…

2024阿里云服务器可用区选择方法

阿里云服务器地域和可用区怎么选择?地域是指云服务器所在物理数据中心的位置,地域选择就近选择,访客距离地域所在城市越近网络延迟越低,速度就越快;可用区是指同一个地域下,网络和电力相互独立的区域&#…

CAD安装教程

CAD安装教程 目录 一. 下载CAD二. 安装CAD 一. 下载CAD 如果需要CAD安装包请私信。 二. 安装CAD 解压压缩包AutoCAD2022中文版,以管理员身份运行AutoCAD_2022_Simplified_Chinese_Win_64bit_dlm.sfx。 选择解压路径。…

计算机毕业设计----SSM场地预订管理系统

项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 用户角色包含以下功能: 按分类查看场地,用户登录,查看网站公告,按分类查看器材,查看商品详情,加入购物车,提交订单,查看订单,修改个人信息等功能。 管理员角…

简单 Web Server 程序的设计与实现 (2024)

1.题目描述 Web 服务是 Internet 最方便与受用户欢迎的服务类型,它的影响力也远远超出了专业技术范畴, 已广泛应用于电子商务、远程教育、远程医疗与信息服务等领域,并且有继续扩大的趋势。目前很多 的 Internet 应用都是基于 Web 技术的&…

Javaweb之Mybatis的XML配置文件的详细解析

2. Mybatis的XML配置文件 Mybatis的开发有两种方式: 注解 XML 2.1 XML配置文件规范 使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在…

案例098:基于微信小程序的电子购物系统的设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

大学物理实验重点——电路暂态过程

RC串联电路的暂态过程: RLC串联电路的暂态过程: 三种解: 半衰期测量法测量时间常数: 测振荡周期: 不断增大电阻直至振荡凸起峰刚好消失,此时即为临界阻尼状态,记下电阻箱的阻值R,…

如何保证本地缓存的一致性(和分布式缓存)

保证本地缓存和分布式缓存的一致性是一个关键的问题,因为这可以确保系统的健壮性和响应速度。以下是一些在Java中实现这一目标的方法: 1.使用一致性哈希:一致性哈希是一种特殊的哈希技术,它能够在节点增减时最小化哈希环上的数据分…