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.mzph.cn/news/603935.shtml

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

相关文章

如何在群晖7.2中运行WPS Office镜像容器并使用固定地址公网访问

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本,通过…

LaTeX矩阵

在 LaTeX 中输入矩阵以及矩阵中增加公式。 LATEX 中 array 环境可以定义二维数组,具体需要定义列数,并用 \\ 换行,数组可作为一个公式块,在外套用 \left、\right 等定界符。 \mathbf{X} \left(\begin{array}{cccc}x_{11} &…

【AI】什么是大模型的偏见

目录 一、什么是大模型的偏见 二、偏见的危害 三、普通人可以做的一些偏见测试用例 1. 性别偏见测试: 2. 种族和民族偏见测试: 3. 职业偏见测试: 4. 年龄偏见测试: 5. 社会经济地位偏见测试: 6. 身体能力偏见…

Leetcode 3002. Maximum Size of a Set After Removals

Leetcode 3002. Maximum Size of a Set After Removals 1. 解题思路2. 代码实现3. 算法优化 题目链接:10037. Maximum Size of a Set After Removals 1. 解题思路 这一题的话我的思路就是分别以两个数组作为主数组,然后从中选择 n / 2 n/2 n/2个元素&…

接口限流方案

1.1 为什么要进行限流? 1.瞬时流量过高,服务被压垮? 2.恶意用户高频光顾,导致服务器宕机? 3.消息消费过快,导致数据库压力过大,性能下降甚至崩溃? 1.2 什么是限流 限流是对某一…

Zuul相关问题及到案(2024)

1、什么是Zuul?它在微服务架构中有什么作用? Zuul是Netflix开源的一种提供API网关服务的应用程序,它在微服务架构中扮演着流量的前门角色。主要功能包括以下几点: 路由转发:Zuul网关将外部请求转发到具体的微服务实例…

【Python常用函数】一文让你彻底掌握Python中的numpy.append函数

大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。而大数据分析的基础是学好编程语言。本文和你一起来探索Python中的append函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固这个函数,让你在处…

高效管理文件方法:每4个文件前面加序号,4个文件后面又单独编号技巧

在日常工作中,文件管理是一项常见的任务。要更高效地管理文件,可以通过在每个文件前面加序号,并在每个序号对应的文件后面进行单独编号的方法来实现。这种方法有助于快速找到所需文件,也能提高工作效率。下面一起来看下云炫文件管…

2024出海潮,生态伙伴搭上华为HMS的“便车”?

作者 | 曾响铃 文 | 响铃说 回顾2023年,中国新能源车市场在加速内卷的同时,还诞生了一个 “超级物种”,那就是华为将车BU分拆。未来,华为智能汽车解决方案未来不仅会独立运营,还吸纳了庞大的盟友阵营,包括…

linux后台运行进程分类查看操作命令

例如需要查看所有运行的python程序进程: 执行的命令如下: ps -ef | grep python 解释: 在 UNIX 或类 UNIX 系统(如 Linux)中的作用是查找所有正在运行的与 Python 相关的进程。这个命令结合了两个常用的命令行工具…

R语言【base】——tempfile():返回一个字符串向量,这些字符串可以用作临时文件的名称

Package base version 4.2.0 Parameters tempfile(pattern "file", tmpdir tempdir(), fileext "") tempdir(check FALSE) 参数【pattern】:一个非空字符向量,给出名称的初始部分。 参数【tmpdir】:提供目录名称的…

修复HTTP动词篡改导致的认证旁路问题的方法

本文于2016年4月完成,发布在个人博客网站上。 诡异的问题 分析AppScan扫描报告的时候,发现报告里提示“HTTP动词篡改导致的认证旁路”,一个名字很长,很怪异的问题。咨询度娘没有获取到必要的信息,于是只好按照AppScan…

物理机与vm文件共享与传输的设置方法

今天跟各位小伙伴,分享一下物理机与vm虚拟机文件共享与传输的设置方法,以供大家参考! 一、物理机与虚拟机文件共享设置方法 第一步:先关闭虚拟机(客户机) 第二步:选择编辑虚拟机设置 第三步&am…

Nacos和Eureka的全面对比

学习目标: 了解Nacos和Eureka的基本概念和特点。理解Nacos和Eureka在服务注册与发现、配置管理、服务路由、负载均衡等方面的区别。掌握Nacos和Eureka的部署和使用方法。比较Nacos和Eureka在性能、可靠性、扩展性等方面的优劣。理解Nacos和Eureka在微服务架构中的应…

leetcode经典【双指针】例题

删除有序数组中的重复项: https://leetcode.cn/problems/remove-duplicates-from-sorted-array/ 解题思路: 首先注意数组是有序的,那么重复的元素一定会相邻。 注: 要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。 考…

【面试高频算法解析】算法练习2 回溯(Backtracking)

前言 本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态 专栏导航 二分查找回溯(Backtracking&…

PyQT5安装配置测试打包教程

文章目录 PyQT5安装配置配置环境变量Pycharm配置Qt Designer和PyUIC 测试测试QT Designer设计的界面软件打包 PyQT5 安装 pip3 install PyQt5 pip3 install pyqt5-tools 配置 配置环境变量 添加xxx\Lib\site-packages\pyqt5_tools至环境变量 Pycharm配置Qt Designer和PyU…

深度解读《Java编程思想》:面向对象导论

深度解读《Java编程思想》:面向对象导论 前言: 欢迎来到本篇博客,我们将深入探讨经典之作《Java编程思想》中的面向对象导论。这本由Bruce Eckel所著的书籍深入浅出,为Java编程提供了一系列深刻的思考和实践经验。 1. Java 编程思想简介&a…

【leetcode】力扣算法之旋转图像【难度中等】

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 用例 输入: matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

1.分组

#include<bits/stdc.h> using namespace std; int main() {unsigned long long a,b,c0,d,s0;cin>>a>>b;for(long long i1;i<a;i){cin>>d;cd;if(c>b){c0;s;}}cout<<s;return 0; }