ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 905738810

[原创] VBA DataAutomation数据处理类模块,一行代码搞定复杂数据

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-23 15:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
下面演示组的作用:
image.png
在左表处添加姓名:郑苑的三个季度销量
        此时不考虑排序方法,如果VBA的话正常需要对整表循环找到第一、二、三季度的结尾插入数据
如果用da类以目前讲的方法都是对数据的整体进行修改,如何对第一、二、三季度的数据分别修改呢?
      这时就体现出组的作用,我们可以将第一、二、三季度分成三份数据,也就是分成三个子实例,
然后对子实例修改(将郑苑的三个季度销量分别添加到对应子实例中),这样修改好处在于子实例互相
是独立的互相不影响,修改后再把子实例拼接回来,数据就改好了。
实现代码如下:
image.png
通过上面示例演示了组的作用:
      对数据按条件分成多个独立单元,每个单元的数据互不影响,
      每个单元的也都是da实例,可以对单元数据很方便的修改
      组可以继续分组,俗称套娃

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-23 16:22 | 显示全部楼层
分组方法:
Public Function 按查找内容分组(ByVal 查找内容arr, ByVal index As Long, [ByVal True在第一行 As Boolean = True]) As DataAutomation
从上向下查找只要满足查找内容就从此位置进行分组
第1参数:查找内容参照前篇(da.查找)方法
            支持数组写法
第2参数:指定查找的列索引
第3参数:true时将从找到内容的上方分隔
            false时将从找到内容的下方分隔
演示:
第3参数=true(默认不写为true)
image.png
第3参数=false
image.png
对于这种分组常用于合并单格分组,把第一参数查找内容改成 "<>" 不等于空
image.png
Public Function 按自定义分组(ByVal AddressOf地址, [ByVal True在第一行 As Boolean = True], [ByVal key As String = "按自定义分组"]) As DataAutomation
通过CWP回调函数来编写逻辑,通过回调函数返回true确定分组边界
第1参数:回调函数地址,写法是 AddressOf 函数名 (AddressOf 关键字不能丢)
第2参数:参照按查找内容分组的第三参数

第3参数:给回调函数传递的方法标识符,如果一个回调函数有两个方法进行调用,可以利用标识符来判断具体方法
演示:
image.png
回调函数模板
'Private Function 自定义分组1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
'End Function

回调第1参数:调用的da实例
回调第2参数:调用次数
回调第3参数:组的层数,参考前面组的展示图
回调第4参数:标识符

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-23 20:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Public Function 按行上下不同分组(ByVal index As Long) As DataAutomation该方法从上向下查找,将上下行相同内容分成一个单元
第1参数:用来条件判断的列索引
演示如下:分成三个单元
image.png
缺陷:当判断列是如下图的情况,分组就不理想了,这是可以用按类别分组
image.png

Public Function 按类别分组(ByVal arr) As DataAutomation

该方法将内容相同的放入一个单元
第1参数:用来条件判断的列索引或数组(可以参照去前篇判断是否重复方法)
演示:
image.png




TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-24 08:15 | 显示全部楼层
本帖最后由 905738810 于 2021-11-24 09:41 编辑

Public Function 按条件分组(ByVal arr, ByVal index As Long, [ByVal 内容是否重复 As Boolean = True]) As DataAutomation
就像自定义排序那样,可以把要分组的条件全部写入,根据条件分组
第1参数:条件数组(条件可以参考前篇的查找方法)
第2参数:用来条件判断的列索引
第3参数:当有相同条件区间时是否重复
演示1:查找包含1和2的数字,将满足条件的放入组中,下列演示分成了两组
      注意:此方法分组对不满足条件行的不会写入组中,会产生叶子节点,以后讲遍历组时还会讲此问题
image.png
演示2:当第3参数为true时,满足条件多个的行会被重复放入组中
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-24 08:26 | 显示全部楼层
Public Function 按数量分组(ByVal 分组数量 As Long) As DataAutomation
按固定的行数分组
第1参数:指定一个单元的数量
演示:将数据按每10行分一组,不足10行的有多少分多少
image.png
Public Function 按列数量分组(ByVal 分组数量 As Long) As DataAutomation
按固定的列数分组
第1参数:指定一个单元的数量
演示:将数据按每3列分一组,将横向排列表格变成竖向

image.png

TA的精华主题

TA的得分主题

发表于 2021-11-24 08:46 | 显示全部楼层
作者水平应该挺高的。
不过这个适合偷懒,不适合迁移使用吧?VBA还有主要的用途,写给别人用,写好发别人会不会用不了?

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-24 08:58 | 显示全部楼层
Public Function 按叶子组查找内容分组(ByVal 查找内容arr, ByVal index As Long, [ByVal True在第一行 As Boolean = True], [ByVal 层 As Long = 0]) As DataAutomation
Public Function 按叶子组行上下不同分组(ByVal index As Long, [ByVal 层 As Long = 0]) As DataAutomation
Public Function 按叶子组类别分组(ByVal arr, [ByVal 层 As Long = 0]) As DataAutomation
Public Function 按叶子组数量分组(ByVal 分组数量 As Long, [ByVal 层 As Long = 0]) As DataAutomation
Public Function 按叶子组条件分组(ByVal arr, ByVal index As Long, [ByVal 内容是否重复 As Boolean = True], [ByVal 层 As Long = 0]) As DataAutomation
Public Function 按叶子组自定义分组(ByVal AddressOf地址, [ByVal True在第一行 As Boolean = True], [ByVal 层 As Long = 0], [ByVal key As String = "按叶子组自定义分组"]) As DataAutomation
这些方法名称起的有问题,应该叫 按子组**分组,叫叶子组不合理,但是我不想改了
这些方法是用来对组立里的每个单元再次分组
还是看这图,当da实例为第一次分组,如果想对da实例继续分组分出da孙子实例就必须使用上面方法
这张图的组有三层,也就是说执行了三次分组,例如这样的写法
             da.按查找内容分组().按叶子组查找内容分组().按叶子组条件分组()
              先用(按查找内容分组对da示例进行分组,之后用(按叶子组查找内容分组)和(按叶子组条件分组)对组在分组
上面方法和前面讲的分组方法用法参数一致,不同的是都多了一个 [ByVal 层 As Long = 0]这个参数
image.png
[ByVal 层 As Long = 0]参数详解:
这个层可以规定对组里的第N层进行遍历分组
层=0时遍历的就是叶子节点了,如上图标明的叶子节点
演示:
出个题目,有一表格需要按类别复制到模板,一个模板的行数最多不能超过5行,超过的换下一张表
image.png





TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-24 09:03 | 显示全部楼层
f8b1987 发表于 2021-11-24 08:46
作者水平应该挺高的。
不过这个适合偷懒,不适合迁移使用吧?VBA还有主要的用途,写给别人用,写好发别人 ...

因为我写的是单纯的VBA类模块,不是封装DLL,所以知道文件里放入了DataAutomation类就可以随文件走了可以参考我给别人回答的问题
https://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1607230&pid=10835900
https://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1574284&pid=10835467

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-24 09:40 | 显示全部楼层
本帖最后由 905738810 于 2021-11-24 09:42 编辑

Public Function 遍历组(ByVal AddressOf地址, [ByVal 层 As Long = 0], [ByVal key As String = "遍历组"]) As DataAutomation
组的最重要方法了,通过遍历组的单元,可以实现对数据分块处理
利用了CWP回调函数对遍历的每个单元都回调da子实例
第1参数:回调函数地址,写法是 AddressOf 函数名 (AddressOf 关键字不能丢)
第2参数:遍历的第N层组,回调第N层组的每个单元
              当传递0时遍历回调的是叶子节点单元(默认值)
              当传递任意负数时遍历所有层的组
第3参数:给回调函数传递的方法标识符,如果一个回调函数有两个方法进行调用,可以利用标识符来判断具体方法
CWP回调函数模板:
Private Function 遍历组1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
End Function

回调第1参数:da子实例(组的一个单元)
回调第2参数:调用次数
回调第3参数:第N层组
回调第4参数:标识符
如果将回调函数返回值设置true可以提前终止遍历
演示:遍历第一层
image.png
演示:遍历第二层组
这里回顾前面遗留问题:按条件分组按叶子组条件分组这两个方法会产生叶子节点
下图演示了对季度"第1季", "第2季"的第二层分组
第一层遍历出了三个单元数据,但是第三单元数据只有"第3季"按条件分组就会忽略掉产生空区
遍历第二层就是这样结果
image.png
演示:遍历叶子节点组
image.png

TA的精华主题

TA的得分主题

发表于 2021-11-24 12:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了,慢慢啃
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 02:29 , Processed in 0.048554 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表