VBA递归过程快速组合数据

news2024/11/15 19:39:53

实例需求:数据表包含的列数不固定,有的列(数量和位置不固定)包含组合数据,例如C2单元格为D,P,说明Unit Config有两种分别为D和P,如下图所示。

在这里插入图片描述

现在需要将所有的组合罗列出来,如下所示。

在这里插入图片描述

示例代码如下。

Sub Demo()
    Dim i As Long, j As Long, c As Variant
    Dim arrData, arrRes, iR As Long, aRow() As Variant
    Dim LastRow As Long, ColCnt As Long
    Dim oSht1 As Worksheet, aTxt
    Dim oColl As New Collection
    Set oSht1 = Sheets("Sheet1") 
    arrData = oSht1.Range("A1").CurrentRegion.Value
    ColCnt = UBound(arrData, 2)
    ReDim aRow(ColCnt - 1)
    For i = LBound(arrData) + 1 To UBound(arrData)
        For j = LBound(arrData, 2) To UBound(arrData, 2)
            aRow(j - 1) = Split(arrData(i, j), ",")
        Next j
        GenerateCombinations oColl, aRow
    Next i
    ReDim arrRes(1 To oColl.Count, ColCnt - 1)
    iR = 0
    For Each c In oColl
        aTxt = Split(c, "|")
        iR = iR + 1
        For j = 0 To UBound(aTxt)
            arrRes(iR, j) = aTxt(j)
        Next
    Next
    Sheets.Add
    Range("A1").Resize(, ColCnt).Value = oSht1.Range("A1").Resize(, ColCnt).Value
    Range("A2").Resize(iR, ColCnt).Value = arrRes
End Sub

【代码解析】
第8行代码将数据表加载到数组中。
第9行代码获取数据表的列数。
第10行代码为数组aRow分配存储空间。
第11~16行代码循环遍历每行数据。
第12~14行代码循环处理一行中的每个单元格数据,将其按逗号拆分,并保存在嵌套数组aRow中。
第15行代码调用递归过程创建数据组合。
第17行代码为结果数组arrRes分配存储空间。
第19~25行代码循环遍历Collection对象中的元素。
第20行代码将字符串拆分为数组。
第22~24行代码将数组保存在结果数组。
第26行代码添加新工作表。
第27行代码将工作表标题由源工作表拷贝到结果工作表。
第28行代码结果保存到新建工作表中。

Sub GenerateCombinations(ByRef oColl As Object, aVals() As Variant, Optional curStr As String = "", Optional colIdx As Long = 0)
    Dim i As Long
    If colIdx = UBound(aVals) + 1 Then
        oColl.Add Mid(curStr, 2)
        Exit Sub
    End If
    For i = LBound(aVals(colIdx)) To UBound(aVals(colIdx))
        GenerateCombinations oColl, aVals, curStr & "|" & aVals(colIdx)(i), colIdx + 1
    Next i
End Sub

【代码解析】
递归过程有3个参数:

  • oColl为Collection对象,用于保存结果数据
  • aVals为包含拆分内容的数组
  • curStr为当前已经组合的字符串
  • colIdx为当前处理的层级(也可以理解为数据表的列)

第3行代码根据colIdx判断是否已经到达最后一个层级,如果满足条件,第4行代码将字符串(组合)添加到Collection对象中。
第5行代码结束当前调用过程的执行。
第7~9行代码循环处理数组aVals中的每个元素。
第8行代码调用递归过程,其中层级colIdx加一。

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

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

相关文章

模块化沙箱结合零信任实现一机两用解决方案

为实现数据防泄露的各类型市场需求以及“一机两用”标准落地,依靠十几年的沙箱技术积累,研发出了支持多平台的模块化沙箱,配合零信任SDP网关,提高数据安全,实现“一机两用”安全解决方案。 产品特点 -自2008年开始已…

奇点临近:人类与智能时代的未来

在信息爆炸的时代,我们每天都被海量的信息所淹没,如何才能在这个嘈杂的世界中找到真正有价值的信息?如何才能利用信息的力量,提升我们的认知水平,重塑我们的未来? 这些问题的答案,或许都能在雷…

基于MindSpore Quantum的Grover搜索算法和龙算法

如果你听过量子计算,那么你一定听说过Grover搜索算法。1996年,Lov Grover [1] 提出了Grover搜索算法,它是一种利用量子状态的叠加性进行并行计算并实现加速的算法。Grover搜索算法被公认为是继Shor算法后的第二大量子算法,也是第一…

【仿真建模-解析几何】求有向线段上距指定点最近的坐标

Author:赵志乾 Date:2024-06-25 Declaration:All Right Reserved!!! 问题描述: 有向线段起点A为(x1,y1),终点B为(x2,y2&a…

图片详解 —— 二维树状数组

\qquad 想要完全理解二维树状数组,要先完全理解一维树状数组。这里给大家推荐一个视频:五分钟丝滑动画讲解 | 树状数组。建议大家先看一遍视频再来看下面的讲解。 \qquad 在一维树状数组中, t r e [ i ] tre[i] tre[i] 可以理解为以 i i i 为…

MySQL集群高可用架构之双主双活+keepalived

该教程再linux系统下 从部署单台mysql -->到部署两台双主mysql-->再到安装keepalived-->整体测试 从而实现mysql双主双活高可用的目标。 改文档由本人亲自部署搭建一步一步编写而来,实属不易,如对您有所帮助,请收藏点个赞&#x…

装机必备一WinRAR安装使用以及常见问题

WinRAR是一款功能强大的压缩包管理器,支持多种压缩格式,如RAR、ZIP等。作为一款经典且广泛使用的压缩软件,WinRAR不仅在文件压缩率和速度方面表现出色,还提供了备份数据、缩减电子邮件附件大小以及解压缩网络下载文件等功能。 为…

瑜伽馆管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,教练管理,用户管理,瑜伽管理,套餐管理,体测报告管理,基础数据管理 前台账户功能包括:系统首页&#xff0…

计网入门还没到放弃

TCP报文段格式 源端口:标识报文的返回地址 目的端口:指明计算机上的应用程序接口 序号:通过SYN包传给接收端主机,每传送一次就1,用来解决网络包乱序的问题。 确认号:期望下一次收到的数据的序列号&#xff…

lvm,磁盘配额

文章目录 LVM概述Logical Volume Manager逻辑卷管理LVM机制的基本概念 LVM的管理命令LVM应用实例案例环境需求描述创建 LVM创建, 删除LVM 流程创建 LVM 流程删除 LVM 流程 磁盘配额概述实现磁盘限额的条件Linux 磁盘限额的特点 磁盘配额管理CentOS7设置磁盘配额步骤编辑用户和组…

61.指针和二维数组(1)

目录 一.回顾 二.思考 三.实验验证 四.视频教程 一.回顾 在一维数组中,一维数组的数组名就是一维数组中首个元素的地址。若有int a[5];int *p;则p&a[0]可以简写成pa; 在C语言中,二维数组如int a[2][2]{1,2,3,4…

英语口语练习评测的开发实现

英语口语评测是一个复杂的系统,需要综合考虑语音识别、语音评测、自然语言处理等多种技术。以下是一些常见的英语口语评测开发框架。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 基于语音识别的口语评测框架这种框架主要…

Python | Leetcode Python题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; def reverse(nums: List[int], left, right) -> None:i, j left, rightwhile i < j:nums[i], nums[j] nums[j], nums[i]i1j-1 class Solution:def rotate(self, nums: List[int], k: int) -> None:n len(nums)k % nreverse(num…

运行时库链接方式实践指南(MT、MD、MTd、MDd)

前言 笔者曾经编译一个库提供给使用者&#xff0c;提供库后发现由于运行时库连接方式不一致&#xff0c;导致使用者无法连接笔者提供的库。另一方面&#xff0c;理解和选择正确的运行时链接方式对于构建高效、可靠的应用程序至关重要。 因此&#xff0c;本文将展开运行时库的基…

web前端课程设计——农产品购物车

该课程设计使用的环境为:HTMLcssJavaScript,vue3,creat-vue脚手架工具&#xff0c;vscode编辑器 其中实现的功能为:购物车管理&#xff0c;商品展示。 1.购物车管理中包含对商品数量进行加减&#xff0c;对商品进行全选或反选操作&#xff0c;删除单个商品或批量删除商品。 …

C++ | Leetcode C++题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& nums, int k) {k % nums.size…

Android AOSP 编译并烧录到Google Pixel4XL

简介 AOSP&#xff08;Android Open Source Project&#xff09;是Android系统的开源版本&#xff0c;任何人都可以下载、编译和修改。手头上有一台Pixel 4XL&#xff0c;尝试编译AOSP并将其烧录到的设备上。 准备工作 在开始之前&#xff0c;您需要确保您的电脑满足以下条件…

文旅景区科技馆增加5D影院项目VR游乐场

王屋山风景名胜区增加20座5D影院设备&#xff0c;5D影院不像普通电影院&#xff0c;5D影院座椅可以根据影片播放内容&#xff0c;进行实时摆动和各种特效&#xff0c;闪电&#xff0c;振臀振臂&#xff0c;泡泡等个种特效。影片内容可以进行定制&#xff0c;根据景区文化风光&a…

OnlyOffice-8.1版本深度测评

2024年6月19日&#xff0c;ONLYOFFICE 发布了最新版本 8.1&#xff0c;带来了超过30项新功能和432个 bug 修复。本文将详细评测该版本的新功能和改进&#xff0c;帮助用户全面了解这一升级带来的实际体验提升。 一、功能全面的 PDF 编辑器 PDF 是日常工作中不可或缺的文件格式…

Waiting for table flush故障处理

故障排查 1 找到正处于open状态的表 show open tables where in_use >1; 2 找到引发故障的慢查询 ① 找到阻塞flush tables的慢查询 SELECT * FROM information_schema.PROCESSLIST WHERE info IS NOT NULL AND state NOT LIKE ‘Waiting for table flush’ AND info …