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

news2024/12/23 15:44:28

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

在这里插入图片描述

示例代码如下。

Sub demo()
    Dim data(), i, idx, k, s
    lstRow = Cells(Rows.Count, 2).End(xlUp).Row
    ReDim data(1 To lstRow, 1)
    idx = 1
    For i = 3 To lstRow
        If Cells(i, 1) <> "" Then
            data(idx, 0) = Cells(i, "D")
            data(idx, 1) = Cells(i, "D").MergeArea.EntireRow.Address
            idx = idx + 1
        End If
    Next
    idx = idx - 1
    For k = 1 To idx
        p_val = data(k, 0)
        For s = k + 1 To idx
            If data(s, 0) > p_val Then
                tmp = data(k, 1)
                data(k, 0) = data(s, 0): data(k, 1) = data(s, 1)
                data(s, 0) = p_val: data(s, 1) = tmp
                p_val = data(k, 0)
            End If
        Next
    Next
    anchor = lstRow + 2
    For k = 1 To idx
        Set r = Range(data(k, 1))
        Application.CutCopyMode = False
        r.Copy Cells(anchor, 1)
        Cells(anchor, 1) = k
        anchor = anchor + r.Rows.Count
    Next
    Range("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.coloradmin.cn/o/597151.html

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

相关文章

02-项目系统架构

1、为何选择xxxxx 1.1、高并发场景有哪些&#xff1f; 商品秒杀&#xff0c;双11 微信支付宝平台 微博突发热点 用户操作日志 购票平台 1.2、为何选择xxxxx 业务复杂度高于淘宝双11&#xff0c;考验个人程序设计能力 动态库存 选座功能 线上线下 持续高并发业务&…

5G宏基站的形态5G基站长什么样?

据说&#xff0c;全国建了约273.3万个5G基站。 真是春城无处不飞花&#xff0c;5G遍布千万家。 今天我们换个轻松的话题&#xff0c;来看看春光下的5G宏基站。 胜日寻芳泗水滨&#xff0c;无边光景一时新。 等闲识得东风面&#xff0c;万紫千红总是春。 古人在春游时寻芳&am…

QGIS 对 GeoJson 文件数据进行压缩

项目场景 地图开发&#xff0c;友商提供的是边界Shapefile文件&#xff0c;文件比较大&#xff0c;例如某个文件就 29.2 M &#xff0c;这么大的数据&#xff0c;在echarts 上显示地图&#xff0c;前端会很卡&#xff0c;特别是有地图下钻的时候&#xff0c;体验很不好&#x…

【终极计算平台】上海道宁为您提供​Wolfram技术,支持跨桌面、云、服务器和移动设备的强大工作流程

Wolfram帮助世界 加快研究、教育、技术发展和 革新的步伐 无论您所在任何领域 无论您需要任何应用 Wolfram技术都是您的终极计算平台 Mathematica 具有 涵盖所有技术计算领域的 将近 6,000 个内置函数—— 所有这些都经过精心制作 使其完美地 整合在Mathematica系统中…

黑马优购学习笔记

1. uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码&#xff0c;可发布到 iOS、Android、 H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#xff09;、快应用等多个平台。 详细的 uni-app 官方文档&#xff0c;请翻…

PX4之commander详解

如前所述commander的作用主要处理各种事件&#xff0c;调度控制系统的运行&#xff0c;事件包括遥控输入、用户指令、状态变更等。调度的作用主要设置控制系统运行的变量和模式&#xff0c;以使控制系统按照用户期望的模式运行&#xff0c;实现不同的控制功能。控制系统主要由n…

PIC 使能485/422_Part2.1使能485_Tx_Only

1.需求 工作中需要把目前设备的单向232转为485/422模式&#xff0c;实现双向通讯&#xff0c;目前查找相关资料。突然想到一件事&#xff0c;我是否能让232现有的单向上发线同时连工控机的tx,rx&#xff0c;然后靠协议&#xff0c;来定时切换PIC一侧的tx rx?PIC可能不支持这个…

零基础学会用Airtest-Selenium对Firefox进行自动化测试

1. 前言 本文将详细介绍如何使用AirtestIDE驱动Firefox测试&#xff0c;以及脱离AirtestIDE怎么驱动Firefox&#xff08;VScode为例&#xff09;。 看完本文零基础小白也能学会Firefox浏览器自动化测试&#xff01;&#xff01;&#xff01; 2. 如何使用AirtestIDE驱动Firef…

MyBatis 所有的 jdbcType类型

MyBatis处理MySQL字段类型date与datetime 1&#xff09; DATETIME 显示格式&#xff1a;yyyy-MM-dd HH:mm:ss 时间范围:[ 1000-01-01 00:00:00到9999-12-31 23:59:59]2&#xff09; DATE 显示格式&#xff1a;yyyy-MM-dd 时间范围&#xff1a;[1000-01-01到9999-12-31]3&#…

【SpringCloud】1.一文带你入门SpringCloud微服务

文章目录 1. 搭建父工程2. 搭建注册中心3. 搭建一个服务提供者4. 搭建一个服务消费者5. 整合OpenFeign实现服务之间的调用 1. 搭建父工程 最近打算使用 springcloud 搭建微服务玩一下&#xff0c;用到的东西大致有以下这些&#xff1a; jdk 1.8idea 2019maven 3.6.3springclo…

CS5466应用电路图|CS5466设计方案原理图|TypeC转HDMI8K30HZ(4K144HZ)芯片方案原理图

CS5466支持dsc1.1/12a压缩视频传输&#xff0c;是一款Type-C转HDMI8K30HZ或者4K144HZ方案芯片&#xff0c;其设计原理图如下&#xff1a; CS5466 Type-C/DP1.4转HDMI2.1的显示协议转换芯片, 内部集成了PD3.0及DSC decoder&#xff0c;可支持DP 2Lane最高8K30或4K144, 并能按客户…

拉取maven项目 pom出现 The <project> element is the root of the descriptor.

引入将各个module 修改JDK版本为1.8&#xff0c;然后再修改 Perferences -> Build -》Compiler -> Java Compiler各个版本&#xff0c;对各个项目改为1.8

Docker容器学习笔记

一、初始Docker 实质上&#xff1a;是将开发的代码和运行环境打包成一个容器。解决开发&#xff08;开发环境&#xff09;、测试&#xff08;测试环境&#xff09;、运维&#xff08;生产环境&#xff09;之间的沟通交流。 1.1Docker的概念 docker&#xff1a;解决跨环境迁移…

B. 广告投放

B. 广告投放 Problem - B - Codeforces 思路&#xff1a;对于这个题来说&#xff0c;我们很容易可以想到是一个dp问题&#xff0c;我们可以使用f[i][j]表示我们已经处理了前i-1个问题&#xff0c;并且当前剩余的人数是j的情况下&#xff0c;能够得到的最大的收益&#xff0c;那…

共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)

一、内存映射 概念&#xff1a;使一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必再调用read,write。 mmap()的优点&#xff1a; 实现了用户空间和内核空间的高效交互方式 二、函数定义 void *mmap(void *ad…

PMP课堂模拟题目及解析(第17期)

161. 项目发起人任命一位高级工程师到指导委员会&#xff0c;来帮助监督项目管理计划。该工程师经常不同意由项目团队制定的计划&#xff0c;并在提交批准之前对项目管理计划表达严重关切。项目经理应该怎么做&#xff1f; A. 通知项目发起人&#xff0c;该工程师延迟了规划过程…

2、Kingbase - 修改密码报错

情况 Kingbase数据库修改密码后&#xff0c;重新连接失败 提示信息 致命错误: 用户 "system" Password 认证失败 (kbjdbc: autodetected server-encoding to be GB2312, if the message is not readable, please check database logs and/or host, port, dbname, u…

软件外包开发项目管理工具

随着软件项目的规模越做越大&#xff0c;项目管理人员需要使用工具管理项目进度&#xff0c;从而更有成效的管理好软件开发进度。软件开发的进度管理工具有很多&#xff0c;今天和大家分享一些常用的系统工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xf…

phpStudy2018 mysql启动失败问题

phpStudy2018 mysql启动失败问题 1.winR运行窗口输入services.msc&#xff0c;检查服务里面有MySQLa没有。 有&#xff0c;就打开服务 没有&#xff0c;就打开phpstudy面板&#xff0c;点击其他选项菜单——>服务管理器——>MySQL——>安装服务&#xff1b;然后刷新…