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

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

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

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

在这里插入图片描述

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

实例代码如下。

Dim arrRes(), iR As Long
Sub Demo()
    Dim i As Long, j As Long, objDic As Object
    Dim arrData, rngData As Range, aRow(1 To 4)
    Dim sParent As String, sChild As String, sFirst As String
    Set rngData = ActiveSheet.Range("A1").CurrentRegion
    arrData = rngData.Value
    ReDim arrRes(1 To UBound(arrData), 1 To 4)
    iR = 1
    For j = 1 To 4
        arrRes(iR, j) = arrData(1, j)
    Next
    Set objDic = CreateObject("scripting.dictionary")
    For i = LBound(arrData) To UBound(arrData)
        If arrData(i, 1) = 1 Then 
            If Len(sFirst) > 0 Then
                Call GetChild(objDic, "", sFirst)
                objDic.RemoveAll
            End If
            sFirst = arrData(i, 3)
        End If
        sParent = arrData(i, 2): sChild = arrData(i, 3)
        If Not objDic.exists(sParent) Then
            Set objDic(sParent) = CreateObject("scripting.dictionary")
        End If
        For j = 1 To 4
            aRow(j) = arrData(i, j)
        Next
        objDic(sParent)(sChild) = aRow()
    Next i
    Call GetChild(objDic, "", sFirst)
    With ActiveSheet.Range("F1").Resize(iR, 4)
        .EntireColumn.Clear
        .Value = arrRes
    End With
End Sub
Sub GetChild(oDic As Object, sParent As String, sChild As String)
    Dim vKey, aRow, j As Long
    aRow = oDic(sParent)(sChild)
    iR = iR + 1
    For j = 1 To 4
        arrRes(iR, j) = aRow(j)
    Next
    If oDic.exists(sChild) Then
        For Each vKey In oDic(sChild).keys
            Call GetChild(oDic, sChild, vKey)
        Next
    End 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作为第二个参数,即作为下一次调用的父成员。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美术馆预约小程序|基于微信小程序的美术馆预约平台设计与实现(源码+数据库+文档)

美术馆预约小程序目录 目录 基于微信小程序的美术馆预约平台设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、展品信息管理 3、美术馆信息管理 4、论坛信息管理 四、数据库设计 五、核心代码 七、最新计算机毕设选题推荐 八、源码获取&am…

谷歌BigQuery推出新玩意儿,向量搜索登场啦!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

AIGC: 2 语音转换新纪元-Whisper技术在全球客服领域的创新运用

背景 现实世界,人跟人的沟通相当一部分是语音沟通,比如打电话,聊天中发送语音消息。 而在程序的世界,大部分以处理字符串为主。 所以,把语音转换成文字就成为了编程世界非常普遍的需求。 Whisper 是由 OpenAI 开发…

【神经网络与深度学习】深度神经网络(DNN)

概述 深度神经网络(Deep Neural Networks,DNN)是一种由多个隐藏层组成的神经网络模型。每个隐藏层由多个神经元组成,这些神经元通过权重和激活函数进行信息传递和计算。 深度神经网络通过多层的非线性变换,可以学习到…

vue中实现3d词云效果(已封装组件)

<!--* Description: 词云组件 页面* Date: 2024/3/10 23:39 --> <template><div:style"{display: flex,justifyContent: center,border: 1px solid red,}"><svg:width"width":height"height"mousemove"listener($even…

Linux动态追踪——ftrace

目录 摘要 1 初识 1.1 tracefs 1.2 文件描述 2 函数跟踪 2.1 函数的调用栈 2.2 函数调用栈 2.3 函数的子调用 3 事件跟踪 4 简化命令行工具 5 总结 摘要 Linux下有多种动态追踪的机制&#xff0c;常用的有 ftrace、perf、eBPF 等&#xff0c;每种机制适应于不同的场…

ES分页查询的最佳实践:三种方案

Elasticsearch&#xff08;ES&#xff09;中进行分页查询时&#xff0c;最佳实践取决于具体的使用场景和需求。 以下是对每种分页方法的简要分析以及它们适用的情况&#xff1a; 1. From Size 最常见且直观的方法&#xff0c;通过from参数指定跳过多少条记录&#xff0c;si…

Autosar Crypto Driver学习笔记(一)

文章目录 Crypto DriverPre-ConfigurationCryptographic capabilities加密能力Available Keys可用密钥 General BehaviorNormal OperationFunctional RequirementsSynchronous Job ProcessingAsynchronous Job Processing Design NotesPriority-dependent Job Queue基于优先级的…

docker安装jenkins并实现CICD流程

docker安装jenkins并实现CICD流程 本文目录 docker安装jenkins并实现CICD流程安装命令初始化设置更新jenkins及插件更新jenkins版本更新插件 创建第一个任务修改配置插件更新中心时区设置 安装命令 官方安装参考&#xff1a;https://www.jenkins.io/zh/doc/book/installing/ …

Docker安装tomcat

目录 一、安装Docker 二、Docker安装tomcat 三、安装tomcat 一、安装Docker 安装docker阅读 Docker整理之安装(1)-CSDN博客https://blog.csdn.net/ywanju/article/details/135442406 二、Docker安装tomcat 本案例安装的tomcat最新版本 搜(dockerhub搜索镜像版本) 拉(拉…

十二要素应用: 云原生应用最佳实践

本文介绍了开发部署云原生应用的一套最佳实践&#xff0c;通过这套最佳实践&#xff0c;可以最大限度利用云原生的能力&#xff0c;创建灵活、健壮、易管理的现代云原生应用程序。原文: The Twelve-Factor App: Best Practices for Cloud-Native Applications[1] 导言 软件如今…

爬虫与DataFrame对象小小结合

import pandas as pd import requests from lxml import etree #数据请求 url"https://www.maigoo.com/brand/list_1715.html" headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari…

【实验报告】C语言实现猜单词的小游戏

之前帮别人写的一个简单的报告&#xff0c;无偿分享给大家~代码在后面&#xff0c;有一些图片出于懒惰没有上传。比较简单&#xff0c;喜欢的话关注我~&#xff0c;请勿商用~ 1 系统功能模块结构图 该程序主要思路&#xff1a; 头文件设计&#xff0c;存储结构设计&#xff0…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(一)

前言 Jmeter&#xff0c;Postman一些基本大家相比都懂。那么真实在项目中去使用&#xff0c;又是如何使用的呢&#xff1f;本文将一文详解jmeter接口测试 一、接口测试分类 二、目前接口架构设计 三、市面上的接口测试工具 四、Jmeter简介&#xff0c;安装&#xff0c;环境…

计算机网络—OSPF单区域配置

目录 目录 1.实验环境准备 2.配置 OSPF 3.验证 OSPF 配置 4.修改 OSPF hello 和 dead 时间参数 5.OSPF缺省路由发布及验证 6.控制 OSPF DR/BDR 的选举 7.配置文件 拓扑图&#xff1a; 1.实验环境准备 基本配置以及IP编址。 <Huawei>system-view Enter system vi…

YOLOv8改进 | 注意力篇 | 利用YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM&#xff0c;SEAM&#xff08;Spatially Enhanced Attention Module&#xff09;注意力网络模块旨在补偿被遮挡面部的响应损失&#xff0c;通过增强未遮挡面部的响应来实现这一目…

【JAVA】CSS定位与CSS3属性、渐变、CSS3字体、2D变换

1 定位 1.1 相对定位 相对定位没有脱离文档流 定位元素的显示层级比普通元素高 定位元素可以通过margin&#xff0c;float调整位置&#xff0c;但不推荐 包含块&#xff1a;父元素 left和right同时写&#xff0c;右失效 上下同时写&#xff0c;下失效 <head><s…

从零学习Linux操作系统 第三十四部分 Ansible中的执行流控制

一、ansible中的迭代循环 循环迭代任务# 1、简单循环# loop: ##赋值列表 – value1 – value2 – … {{item}} 迭代变量名称 2、循环散列或字典列表 二、Ansible中的条件语句 when: 条件1条件2 条件判断 ‘’value “字符串”,value 数字‘<’value < 数字‘>…

【基础计算机网络2】物理层——通信基础

【前言回顾】 【考纲内容】 一、物理层的基本概念 1.1 物理层的主要任务 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒介。物理层的主要任务&#xff1a;确定与传输媒体接口有关的一些特性。 1.2 物理层的一些特性 机械特性…

C++变参模板

从c11开始&#xff0c;模板可以接受一组数量可变的参数&#xff0c;这种技术称为变参模板。 变参模板 下面一个例子&#xff0c;通过变参模板打印一组数量和类型都不确定的参数。 #include <iostream> #include <string>void print(void) {std::cout<<&quo…