ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-8 12:17 | 显示全部楼层
忘了上传案例附件 计算工资案例.rar (300.82 KB, 下载次数: 35)

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-10 20:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
更新说明:
1)上个版本发现64为声明有问题,提前更新(本想突破6000行代码在更新的)
2)修复一些小bug
3)继续优化了排序,并且直接挪用了香川裙子大侠的多key稳定排序算法,增加了多列排序,原排序方法依旧保留
4)新增方法,在后续讲解
使用说明:附件中有三个模块,导入到VBA中就可以正常调用了
附件: DataAutomation.rar (23.23 KB, 下载次数: 86)

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-15 16:34 | 显示全部楼层
新版增加方法
Public Function 查找替换区域(ByVal 行 As Long, ByVal 列 As Long, ByVal 高 As Long, ByVal 宽 As Long, _
        ByVal 查找内容arr As Variant, ByVal 替换内容arr As Variant) As DataAutomation
针对以前的查找和替换功能合并成了一个,使查找替换更方便
第1参数:区域的左上角对应数据行位置
第2参数:区域的左上角对应数据列位置
第3参数:区域的高度
第4参数:区域的宽度
第5参数:查找内容可以为数组,参照da.查找方法的第1参数
第6参数:要替换的内容,当不为数组时,所有找到的内容都会被替换为第6参数
              当是数组时需要与第5参数数组数量一致,将依次对应的替换
Public Function 正则添加列匹配数量(ByVal index As Long, ByVal 表达式 As Variant, _
        Optional ByVal 忽略大小写 As Boolean = True, _
        Optional ByVal 匹配全部 As Boolean = True) As DataAutomation
将通过正则计算出正则匹配数量,写入新创建的最后一列
第1参数:计算的列索引
第2参数:正则表达式
第3参数:正则匹配原则是否忽略大小写
第4参数:正则匹配原则是全部匹配
演示:计算出人数
image.png
Public Function 正则添加行匹配数量(ByVal index As Long, ByVal 表达式 As Variant, _
        Optional ByVal 忽略大小写 As Boolean = True, _
        Optional ByVal 匹配全部 As Boolean = True) As DataAutomation
参政正则添加列匹配数量

TA的精华主题

TA的得分主题

发表于 2021-12-15 16:45 | 显示全部楼层
太强大了!!!太牛了!!!  还想请教如何加入合计和总计行?

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-15 16:50 | 显示全部楼层
Public Function 正则添加列匹配组数(ByVal index As Long, ByVal 表达式 As Variant, _
        Optional ByVal 组数组 As Long = 0, _
        Optional ByVal 忽略大小写 As Boolean = True) As DataAutomation
将匹配结果所有结果以数组形式写入da数据,配合da.拆分数组方法使用
第1参数:实行正则匹配的列索引
第2参数:正则表达式
第3参数:如果第3参数为0则写入正则匹配结果,
               如果第3参数大于0,则写入第N个组结果,N为第3参数
第4参数:正则匹配原则是否忽略大小写
演示1:拆分数字
image.png
演示2:第3参数用法
image.png
演示附件: 演示.rar (333.58 KB, 下载次数: 21)

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-15 16:52 | 显示全部楼层
hhhlike 发表于 2021-12-15 16:45
太强大了!!!太牛了!!!  还想请教如何加入合计和总计行?

多谢提醒,我忘了说了,有一个da.添加一行数学计算 方法,讲解明天补上
Public Function 添加一行数学计算(ByVal arr, ByVal 规则 As 透视规则, [ByVal 是否新插入行 As Boolean = True], [ByVal 零为空 As Boolean = True], [ByVal 分隔符 = ""], [ByVal 小数位数 As Long = -1])
    VBAProject.DataAut

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-16 08:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Public Function 添加一行数学计算(ByVal arr As Variant, ByVal 规则 As 透视规则, Optional ByVal 是否新插入行 As Boolean = True, _
               Optional ByVal 零为空 As Boolean = True, Optional ByVal 分隔符 As Variant = "", _
               Optional ByVal 小数位数 As Long = -1) As DataAutomation
根据指定的列索引进行透视计算,写到da数据的末尾行,,使用场景一般用在求合计
第1参数:要计算的列索引或索引数组
第2参数:计算规则,枚举值
Public Enum 透视规则
    ts求和 = 1
    ts计数 = 2
    ts平均值 = 3
    ts最大值 = 4
    ts最小值 = 5
    ts乘积 = 6
    ts连接 = 7
End Enum
第3参数:为true时在末尾插入新的行,计算结果写到新插入的行
              为false时计算结果写到末尾行
第4参数:为true时计算结果为0时则为空""
第5参数:计算规则为ts连接时,指定分隔符
第6参数:计算规则不为ts连接时,设置四舍五入小数维数,为-1时不舍入
演示:
image.png
下帖演示添加小计,合计

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-16 09:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 905738810 于 2021-12-16 09:46 编辑

案例演示,根据部门给数据添加小计,对所用数据添加合计
image.png
思路分析:
1)根据上一贴da.添加一行数学计算方法演示了给该数据添加了合计
整理代码如下,不懂可以去看前贴图片
image.png
2)添加小计和添加合计的思路代码是通用的,只需要对部门进行分组,然后在求合计就可以了
image.png
3)看思路分析2的数据会发现,最后的合计也被写上了小计,
     这是因为分组会把所用数据分组,所以合计也会被分到组里
     解决方法1:可以删除最后一行用da.删除行(da.行数)方法,但是
     删除行内部原理会重新分配数组的效率不高
     解决方法2:在遍历组里判断如果是合计就不进行计算
     我采用解决方法2来演示
image.png
4)继续简化代码,由于合计,小计的代码很相似,唯一不同的是写入数据"合计","小计"不同
如图两个红框代码
image.png
这样可以把求合计也调用添加求和函数,并对第四参数key传递"合计","小计"
代码精简后如下
image.png
5)分析完成
附件: 添加合计小计.rar (345.02 KB, 下载次数: 28)

TA的精华主题

TA的得分主题

发表于 2021-12-16 11:16 | 显示全部楼层
感谢分享,继续关注,跟进学习。
功能强大的类非一般潜心研究的人可理解通透,只能按示例套用。
个人觉得对于有一定VBA基础的,可尝试一下这样易于操作的思路:
一、数据处理:不管何种格式(混乱)的原始数据,全部“打散”(包括不统一标题栏、合并单元格、一对多数据等不规范数据的一对一的拆分),再整合为统一标准格式的“数据库”,形成”基础数据库数组“,以作调用。
二、项目分类/建立字典函数:根据标题栏,或关键词,需建立的索引(可根据设计功能预定),建立各类”功能字典、集合“,以作调用。也可建立一些”查询“、”排序“、”去重“、”汇总“等常用功能的通用函数。
三、接口参数:根据实际需要的功能,通过自定义函数,建立参数、输入接口、输出返回值等,
四、编程及输出:最后结合 ”基础数据库数组“ + ”字典、集合“ +”函数“,通过函数及编程处理,在工作表/薄 输出最终结果。
这样就可以建立一些”小而通(/专)用“的实用模块了。
楼主建的是跑火车的轮子,这里建的是手推车的轮子,各取所需吧。
以上纯个人一种笨方法,希望楼主及老师们斧正或提供更好的思路。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-16 12:34 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aman1516 发表于 2021-12-16 11:16
感谢分享,继续关注,跟进学习。
功能强大的类非一般潜心研究的人可理解通透,只能按示例套用。
个人觉得 ...

感谢评价,大佬说的这几点和我写这个类的思想很相向,我就是要把这些集成一起形成da类,并且想实现用da类繁殖出da类,最终的效果就是只要有数据的地方是都可以调用da方法。
我写这个类也是针对有VBA基础的人使用的,有些思想没有基础很难理解。
目前版本我认为还没有达到上面所说要求,需要随着做题的积累,不断找出缺陷。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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