包含合并单元格的表格快速排序

news/2024/11/8 12:15:19/

实例需求:现需要将原料配方成分表按照“原料含量”从高到低排序,如下图所示。由于表格中包含合并单元格,因此Excel的排序功能无法正常。

在这里插入图片描述

示例代码如下。

Sub demo()Dim data(), i, idx, k, slstRow = Cells(Rows.Count, 2).End(xlUp).RowReDim data(1 To lstRow, 1)idx = 1For i = 3 To lstRowIf Cells(i, 1) <> "" Thendata(idx, 0) = Cells(i, "D")data(idx, 1) = Cells(i, "D").MergeArea.EntireRow.Addressidx = idx + 1End IfNextidx = idx - 1For k = 1 To idxp_val = data(k, 0)For s = k + 1 To idxIf data(s, 0) > p_val Thentmp = data(k, 1)data(k, 0) = data(s, 0): data(k, 1) = data(s, 1)data(s, 0) = p_val: data(s, 1) = tmpp_val = data(k, 0)End IfNextNextanchor = lstRow + 2For k = 1 To idxSet r = Range(data(k, 1))Application.CutCopyMode = Falser.Copy Cells(anchor, 1)Cells(anchor, 1) = kanchor = anchor + r.Rows.CountNextRange("3:" & lstRow + 1).Delete
End Sub

【代码解析】
第3行代码获取最后数据行的行号。
第4行代码声明动态数组。
第6~12行代码循环读取数据,保存在数组data中,第一个元素为D列的数值(排序依据),第二个元素为该原料所在行,例如第3个原料所在行为6:8
第9行代码中使用MergeArea获取D列单元格的合并单元格区域,EntireRow代表整行单元格区域。
第13行代码将变量idx减一,变量的值为数据表中原料的个数。
第14~24行代码使用双重循环冒泡法排序(需要详细学习此算法的同学,可以自行搜索相关资料)。
第15行代码读取第k个元素(D列值)用于作为排序判断的基准。
第16~23行代码冒泡排序确保把待排序数据(数组中第k个元素至最后一个元素)中的最大一个排列调整到第k个位置。
第19~20行代码用于交换数组的值,由于data是二维数组,所以需要使用一个临时变量tmp作为中转。
排序完成之后,接下来是就需要调整数据表中相应数据行的次序,由于数组中记录的使用每个原料所有行号,剪切操作将导致其他数据行号的相应变化,所以最方便的操作方式是将按照排序后的结果将数据复制到一个空白区域,然后再删除原数据区域。
第25行代码设置保存数据的目标区域起始单元格(下文称为锚点单元格)行号。
第26~31行代码循环拷贝数据行。
第27行代码清空系统剪贴板。
第28行代码将数据行拷贝到锚点单元格。
第29行代码设置原料序号。
第30行代码计算下一个锚点单元格的行号。
第32行代码删除原数据表。


http://www.ppmy.cn/news/141655.html

相关文章

Spring Boot 3.1中如何整合Spring Security和Keycloak

在今年2月14日的时候&#xff0c;Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器。其中包括Spring Security和Spring Boot的适配器&#xff0c;这意味着今后Keycloak团队将不再提供针对Spring Security和Spring Boot的集成方案。但是&#xff0c;如此强大的Keycloak&…

HBase相关的一些基础概念

0 小序 之前面试前司星环的时候&#xff0c;面试官问到HBase那一块的时候直接把我问懵了。上一次使用HBase还是本科的那个图书推荐系统的项目&#xff0c;已经年代久远了&#xff0c;所以今天我特意整理了下HBase相关的知识点。 1 HBase的数据模型 Hbase是以Hdfs为数据存储…

VITS开源项目汇总(更新至2023-06-01)

一、摘要 VITS理论基础&#xff1a;https://github.com/jaywalnut310/vits VITS工程实现&#xff1a;GitHub - rhasspy/piper: A fast, local neural text to speech system VITS一键克隆&#xff0c;中英日三语&#xff0c;Plachtaa/VITS-fast-fine-tuning VITS中文模型&a…

雷神 ffmpeg_雷神之锤II.NET!

雷神 ffmpeg Scott Stanfield and his motley crew have ported Quake II (125k lines of C) to Managed C(.NET)! Madness! But the good kind of madness...check it out. 斯科特斯坦菲尔德( Scott Stanfield)和他的团队成员已将Quake II(C语言的125k行)移植到托管C (。NET…

雷神之锤3源代码注释(1)

2016.1.10 这是我最后一个寒假了&#xff0c;这个寒假来注释了雷神之锤3。同时希望做出自己的mod。 可编译的雷神之锤3源代码免费下载链接&#xff1a;雷神之锤3源代码下载 时间晚了些&#xff0c;先睡了&#xff0c;后续更新。 by 朽木钢丸

linux运行雷神之锤,Ubuntu下多人射击类游戏 Quake Live 雷神之锤

今天本人开始Ubuntu 游戏系列专题咯&#xff0c;第一个推荐游戏是Quake Live 雷神之锤。Quake Live 雷神之锤是一款可以运行于Windows Linux及mac系统的多人射击游戏&#xff0c;游戏是借助浏览器插件来运行的&#xff0c;可以实现多人联网游戏。本人今天也体验了一下&#xff…

B雷神之锤

新增分组与属性关联 查询分组未关联的属性 删除关联属性 销售属性维护 规格修改 规格参数列表 规格参数新增与VO 品牌分类关联与级联更新 显示完整的分类信息 获取分类属性分组 分组校验 字符串都是用blank 统一异常处理 JSR303校验 递归树形结构数据获取

雷神之锤源码linux,雷神之锤3 的源代码查看

Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。该系列的游戏不但画面和内容不错&#xff0c;而且即使计算机配置低&#xff0c;也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代&#xff0c;只要能在PC上搞个小动画…