当前位置: 首页 > news >正文

Excel数据检视——对角线连续数据连线

实例需求:数据表如下图所示,现需要根据规则,在符合要求的单元格上,添加连线。

  • 连续单元格位于对角线方向
  • 单元格内容相同
  • 连续单元格数量不少于7个

在这里插入图片描述

示例代码如下。

Sub LT2RB()Dim objDic As Object, rngData As Range, bFlag As BooleanDim i As Long, j As Long, r As Long, c As Long, sKey As StringDim arrData, RowCnt As Long, ColCnt As Long, iCount As LongDim oSht1 As Worksheet, oSht2 As WorksheetDim sCell As Range, eCell As RangeConst S_ROW = 5Const S_COL = 2Set rngData = Cells(S_ROW, S_COL).CurrentRegionarrData = rngData.ValueRowCnt = UBound(arrData)ColCnt = UBound(arrData, 2)For i = 1 To ColCntFor j = 1 To RowCntbFlag = FalseIf i = 1 Or j = 1 ThenbFlag = TrueElser = j - 1: c = i - 1If r < 1 Then r = 1If c < 1 Then c = 1If Not arrData(j, i) = arrData(r, c) Then bFlag = TrueEnd IfIf bFlag ThensKey = arrData(j, i)iCount = 0: r = j: c = iSet sCell = Cells(S_ROW + r - 1, S_COL + c - 1)DoIf sKey = arrData(r, c) TheniCount = iCount + 1Set eCell = Cells(S_ROW + r - 1, S_COL + c - 1)ElseIf iCount > 6 ThenDebug.Print sCell.Address, eCell.AddressAddLine sCell, eCellEnd IfiCount = 1sKey = arrData(r, c)Set sCell = Cells(S_ROW + r - 1, S_COL + c - 1)End Ifr = r + 1: c = c + 1Loop Until r = RowCnt + 1 Or c = ColCnt + 1If iCount > 6 ThenDebug.Print sCell.Address, eCell.AddressAddLine sCell, eCellEnd IfEnd IfNext jNext i
End Sub

【代码解析】
LT2RB代码过程实现左上到右下的数据查找。
第7~8行代码定义数据表格的起始行和列。
第9行代码获取数据表区域。
第10行代码将数据表加载到数组中。
第11~12行代码获取数据表的行数和列数。
第13~14行代码循环遍历数据表中每个单元格。
第15行代码初始化标志变量bFlag。
第16行代码判断是否为首行或者首列单元格。
如果满足条件,第17行代码设置bFlag为True,否则行和列减一,即arrData(r, c)和arrData(j, i) 为对角线上相邻的两个单元格,如果二者不等,第22行设置bFlag为True。
如果bFlag至为True,arrData(j, i)与其左上相邻单元格内容不同,那么将开始一个新的查找。
第25行代码将查找值保存到变量sKey中。
第26行代码初始化变量。
第27行代码将线条的起始单元格保存在变量sCell中。
第28~42行代码循环查找对角线的单元格。
第29行代码判断对角线上相邻单元格是否相同。
如果二者相同,第30行代码计数器累加一,第31行代码将线条的结束单元格保存在变量eCell中。
如果二者不同,第33行代码判断当前的计数器是否满足条件(至少7个)。
如果满足条件,第35行代码将调用AddLine添加线条。
如果不满足,第37行代码将计数器重置为1,第38行代码跟新查找值,第40行代码更新线条起始单元格,开始新的一次查找。
第41行代码行号和列号递增一。
第42行代码循环退出条件为行或者列超出数据表范围。
第4346行代码与第3336行代码相同,不再赘述。


Sub LB2RT()Dim objDic As Object, rngData As Range, bFlag As BooleanDim i As Long, j As Long, r As Long, c As Long, sKey As StringDim arrData, RowCnt As Long, ColCnt As Long, iCount As LongDim oSht1 As Worksheet, oSht2 As WorksheetDim sCell As Range, eCell As RangeConst S_ROW = 5Const S_COL = 2Set rngData = Cells(S_ROW, S_COL).CurrentRegionarrData = rngData.ValueRowCnt = UBound(arrData)ColCnt = UBound(arrData, 2)For i = 1 To ColCntFor j = 5 To RowCntbFlag = FalseIf i = 1 Or j = RowCnt ThenbFlag = TrueElser = j + 1: c = i - 1If r > RowCnt Then r = RowCntIf c < 1 Then c = 1If Not arrData(j, i) = arrData(r, c) Then bFlag = TrueEnd IfIf bFlag ThensKey = arrData(j, i)iCount = 0: r = j: c = iSet sCell = Cells(S_ROW + r - 1, S_COL + c - 1)DoIf sKey = arrData(r, c) TheniCount = iCount + 1Set eCell = Cells(S_ROW + r - 1, S_COL + c - 1)ElseIf iCount > 6 ThenDebug.Print sCell.Address, eCell.AddressAddLine sCell, eCellEnd IfiCount = 1sKey = arrData(r, c)Set sCell = Cells(S_ROW + r - 1, S_COL + c - 1)End Ifr = r - 1: c = c + 1Loop Until r = 0 Or c = ColCnt + 1If iCount > 6 ThenDebug.Print sCell.Address, eCell.AddressAddLine sCell, eCellEnd IfEnd IfNext jNext i
End Sub

【代码解析】
LB2RT代码过程实现左下到右上的数据查找,其原理与LT2RB类似。


Sub Main()ActiveSheet.DrawingObjects.DeleteLT2RBLB2RT
End Sub
Sub AddLine(s As Range, e As Range)ActiveSheet.Shapes.AddConnector(msoConnectorStraight, _s.Left + s.Width / 2, s.Top + s.Height / 2, _e.Left + e.Width / 2, e.Top + e.Height / 2).SelectWith Selection.ShapeRange.Line.Visible = msoTrue.Weight = 2End With
End Sub

【代码解析】
第2行代码清除工作表中的全部线条。
第3~4行代码分别调用两个Sub过程查找对角线数据。
第6~14行代码用于条件线条。
第7~9行代码添加一个线条对象,并选中该对象。
第11行代码设置线条对象可见。
第11行代码设置线条粗度为2。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第三篇 第17章 工程计量与支付
  • 2025秋招LLM大模型多模态面试题(八)- langchain完整面试题
  • Rust GUI框架 tauri V2 项目创建
  • Java基础——字节流和字符流
  • 韦唯出席平遥国际电影展开幕式 中英文歌曲连唱尽显国际范
  • 国内可以使用 ChatGPT 吗?为什么? ChatGPT镜像集合
  • 一步一步优化一套生成式语言模型系统
  • 在线PDF转图片怎么转?4种简单转换的方法分享
  • ATTCK实战系列-Vulnstack靶场内网域渗透(二)
  • DK5V100R15VL 贴片12V3.4A同步整流芯片
  • 「芯片知识」MP3解码ic方案,音乐芯片在数字音频中的作用
  • 全新热门电商API接口,实现闲鱼商品详细搜索功能
  • 快递智能地址解析API接口代码
  • vmware 里 centos7 扩展 /dev/mapper/centos-root 容量
  • 【YashanDB知识库】查询YashanDB表空间使用率
  • php的引用
  • 345-反转字符串中的元音字母
  • angular组件开发
  • CSS中外联样式表代表的含义
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Git学习与使用心得(1)—— 初始化
  • Javascript弹出层-初探
  • Java多态
  • js递归,无限分级树形折叠菜单
  • markdown编辑器简评
  • 后端_MYSQL
  • 面试总结JavaScript篇
  • 什么软件可以剪辑音乐?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 数论-逆元
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #Z2294. 打印树的直径
  • (55)MOS管专题--->(10)MOS管的封装
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Charles)如何抓取手机http的报文
  • (k8s中)docker netty OOM问题记录
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)原生js案例之数码时钟计时
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (算法)N皇后问题
  • (转)iOS字体
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core + vue 搭建前后端分离的框架
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net6使用WebSocket与前端进行通信