使用VBA快速梳理多层级族谱(组织架构)

实例需求:族谱(或者公司组织架构等)都是典型的带有层级关系数据,例如下图中左侧表格所示。

  • A列为层级(准确的讲是B列成员的层级),从一开始递增
  • B列和C列为成员直接的父(/母)子(/女)关系
  • D列为辅助标记

现需要整理为右侧表格的形式,按照每个家族链依次排列,如标记颜色部分所示。

在这里插入图片描述

由于每个层级的成员梳理,层级深度不确定,因此需要使用递归过程实现。

实例代码如下。

Dim arrRes(), iR As Long
Sub Demo()Dim i As Long, j As Long, objDic As ObjectDim arrData, rngData As Range, aRow(1 To 4)Dim sParent As String, sChild As String, sFirst As StringSet rngData = ActiveSheet.Range("A1").CurrentRegionarrData = rngData.ValueReDim arrRes(1 To UBound(arrData), 1 To 4)iR = 1For j = 1 To 4arrRes(iR, j) = arrData(1, j)NextSet objDic = CreateObject("scripting.dictionary")For i = LBound(arrData) To UBound(arrData)If arrData(i, 1) = 1 Then If Len(sFirst) > 0 ThenCall GetChild(objDic, "", sFirst)objDic.RemoveAllEnd IfsFirst = arrData(i, 3)End IfsParent = arrData(i, 2): sChild = arrData(i, 3)If Not objDic.exists(sParent) ThenSet objDic(sParent) = CreateObject("scripting.dictionary")End IfFor j = 1 To 4aRow(j) = arrData(i, j)NextobjDic(sParent)(sChild) = aRow()Next iCall GetChild(objDic, "", sFirst)With ActiveSheet.Range("F1").Resize(iR, 4).EntireColumn.Clear.Value = arrResEnd With
End Sub
Sub GetChild(oDic As Object, sParent As String, sChild As String)Dim vKey, aRow, j As LongaRow = oDic(sParent)(sChild)iR = iR + 1For j = 1 To 4arrRes(iR, j) = aRow(j)NextIf oDic.exists(sChild) ThenFor Each vKey In oDic(sChild).keysCall GetChild(oDic, sChild, vKey)NextEnd If
End Sub

【代码解析】
第1行代码声明模块基本变量,用于保存结果数据。
第2~36行代码为主过程。
第6行代码获取A1开始的当前数据区域。
第7行代码将数据加载到数组中。
第8行代码为结果数组分配存储空间。
第10~12行代码将表头复制到结果数组中。
第13行代码创建字典对象。
第14~30行代码循环处理每行数据。
第15行代码判断当前数据是否为第一级。
如果是的话,第16~20行代码进行相应处理。
第16行代码判断sFirst变量是否为空,如果不为空,说明从该行开始一个新的族系。
第17行代码调用递归过程GetChild(),将objDic对象中保存的族谱整理到结果数组中。
第18行代码清空字典对象。
第20行代码将当前行的C列成员保存到sFirst变量中。
第22行代码分别读取B列和C列数据。
第23行代码判断父成员是否已经存在于字典对象中,如果不存在,第24行代码创建一个嵌套的字典对象。
第26~28行代码将该行4个数据保存到临时数组变量aRow中。
第29行代码将行数据保存到嵌套字典对象中,父成员为外层字典的键,子成员为内层字典的键。
第31行代码作用与第17行相同,用于处理最后一个家族。
第32行代码为结果输出区域Range对象。
第33行代码清空输出区域。
第34行代码将结果写入工作表。
第37~49行代码为递归过程用于查找下一级子成员。
第39行代码读取嵌套字典对象中保存的行数据。
第40行行指针标记递增,由于iR是模块级别变量,因此每次在GetChild中调用此变量时,仍保留原值,不会被初始化。
第41~43行代码将行数据写入结果数组中。
第44行代码判断字典中是否存在子成员的键,如果存在的话,说明该成员具备下一级子成员(即孙成员)。
第46行代码再次调用递归过程,注意此处的参数值,sChild作为第二个参数,即作为下一次调用的父成员。


递归过程代码并不复杂,其难点在于如何提炼递归逻辑,确保递归过程返回相应的结果。

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

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

相关文章

项目解决方案:视频监控接入和录像系统设计方案(下)

目 录 1.概述 2. 建设目标及需求 2.1建设总目标 2.2 需求描述 ​2.3 需求分析 3.设计依据与设计原则 3.1设计依据 3.2 设计原则 4.建设方案设计 4.1系统方案设计 4.2组网说明 5.产品介绍 5.1视频监控综合资源管理平台介绍 5.2视频录像服务器和存储 5.2.…

PostgreSQL中In, Exists在SQL查询中到底有无区别

前言 SQL查询当中,In和Exists子查询到底有无区别?记得很多年以前,确实是有相关的使用戒条的,或者说存在一些使用的惯用法。试图完全抹开两者的区别,就有点过了。 两者的主要区别: 从目的上讲&#xff0c…

数据库create详细用法

数据库版本:KingbaseES V008R006C008B0014 简介 本篇文章主要以kingbase为例介绍创建表的基本语法、使用案例和添加描述等方法,在目录2、目录3再详细介绍数据类型和列级约束。 文章目录如下 1. 基本用法 1.1. 基础语法 1.2. 基础案例 1.3. 添加描述 …

防御保护作业六

实验拓扑图: 配置过程: FW1 自定义服务ike 创建nat策略,让10.0.2.0/24访问192.168.1.0/24的流量不进行nat转换,并将这条策略置于nat策略最上面,优先匹配 FW3 测试

vmware添加新磁盘

文章目录 前言一、新增磁盘二、初始化磁盘1.查看2.初始化3.挂载 总结 前言 虚拟机磁盘空间很散乱,大部分都在/root和/home下不好操作,故考虑新增磁盘、增加挂载点。 一、新增磁盘 右键打开虚拟机设置 二、初始化磁盘 1.查看 fdisk -l2.初始化 …

基于SpringBoot在线考试系统

基于SpringBootHtmlJavascript css 的在线考试系统 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 一、项目背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内…

Java 学习和实践笔记(33):多态详解

多态(polymorphism): 不同的对象,调用同一个方法,对象的行为状态可能完全不同,也就是说,有多种状态,这种情况就叫做多态。 以下的例子里,同样都是人吃饭这个方法,但是不同的人使用吃…

【SpringBoot框架篇】36.整合Tess4J搭建提供图片文字识别的Web服务

文章目录 简介文件下载引入依赖main函数中使用基于Springboot搭建OCR Web服务配置traineddata路径枚举用到的语种类型定义接口响应的json数据格式封装OCR服务引擎编写web提供服务的接口启动服务并且测试html demo扩展 项目配套代码 简介 Tess4J是一个基于Tesseract OCR引擎的J…

网上超市系统|基于Springboot的网上超市系统设计与实现(源码+数据库+文档)

网上超市系统目录 目录 基于Springboot的网上超市系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、用户管理 1、 商品信息 2、购物车 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

重要通告 | 公司更名为“浙江实在智能科技有限公司”

更名公告 升级蜕变、砥砺前行 因业务快速发展和战略升级,经相关政府机构批准,自2024年3月1日起,原“杭州实在智能科技有限公司”正式更名为“浙江实在智能科技有限公司”。 更名后,公司统一社会信用代码不变,业务主体…

力扣hot100:152.乘积最大子数组(动态规划)

一个子数组问题,我们要使用线性dp,最好先考虑以i结尾,如果定义dp[i]为前i个数最大子数组乘积值 那么dp[i-1]就无法转移到dp[i]。因此我们先考虑dp[i]定义为以第i个数结尾的最大子数组乘积值。 53. 最大子数组和 最大子数组和是一个动态规划问…

b树(一篇文章带你 理解 )

目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…

yolov5体验

无须安装CUDA,只需要有NVIDIA图形驱动即可 1. 安装Miniconda miniconda下载地址 1.1 安装细节 一个对勾都不要选择 1.2 配置环境变量 在环境变量Path中添加如下变量 C:\Server\miniconda C:\Server\miniconda\Scripts C:\Server\miniconda\Library\bin2. …

不同路径 不同路径 II 整数拆分

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。…

mysql题库详解

1、如何创建和删除数据库? 创建数据库 CREATE DATABASE 数据库名; 删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别? 1)事务:MyISAM 不支持事务 InnoDB 支持 2)行锁/表锁:MyISAM 支持表级锁…

冒险和预测

前言 大家好我是jiantaoyab,这是我所总结作为学习的笔记第十篇,在这里分享给大家,还有一些书籍《深入理解计算机系统》,《计算机体系结构:量化研究方法》,这篇文章讲冒险和预测 流水线设计需要解决的三大冒险,分别是结…

CodeReview 规范及实施

优质博文:IT-BLOG-CN 一、为什么需要CodeReview 随着业务压力增大,引发代码质量下降,代码质量的下降导致了开发效率的降低,维护成功高等问题,开发效率下降后又加重了业务压力,最终陷入了死亡三角的内耗之…

VScode的列选

可以用来优化代码排布,让变量整齐成为一排 一、批量复制: 在1处左键单击,然后摁住SHIFTALT键的同时,左键单击2处,即可复制一整块的内容 如果所示 就可以复制了 二、批量输入 在1处左键单击,然后摁住SHI…

基于斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)的无人机三维路径规划(MATLAB)

一、无人机路径规划模型介绍 二、算法介绍 斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO),是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法,它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵…

Linux系统中的任务迁移技术

任务迁移技术是指将任务从一个处理器核心(CPU核心)移动到另一个核心的过程,以实现负载均衡、优化系统性能或者其他系统目标的技术。任务迁移技术在多核系统中具有重要的作用,可以通过动态调整任务位置来避免负载不均衡和性能瓶颈&…