ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 16405|回复: 95

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2021-11-20 16:58 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 905738810 于 2021-11-22 10:31 编辑

名称: DataAutomation (VBA数据自动化)
简称: DA
作者: UFO(我本人)
作用: 处理Excel数据独家利器
     简化VBA代码,使VBA在数据处理的语法上不逊于python的pandas,Power Query
特色:1)采用回调函数机制,实现自定义功能效果
     2)采用分组思想,实现不同类型数据分离处理互不影响
     3)采用链式编程方式,实现三行代码搞定复杂数据
     4)利用自定义属性方式,实现数据回退、多类互通
     5)开发者可以针对调试期,用户使用期可以设定不同的容错处理
感慨: 身为VBA爱好者对VBA有着一种执着的爱
       但是事在人为VBA确实过时很久了 , 多数人已经放弃了对他的热爱, 没有人愿意为他浪费时间
       VBA的轮子还停留在上个时代 , 很多人抱怨VBA处理数据太繁琐
       像python的pandas,最近很火的Power Query,之所以很方便还不是因为有人写好了轮子
       我想证明VBA有轮子一样可以做到

222.gif GIF.gif
DataAutomation1.1.rar (18.55 KB, 下载次数: 160) 2021-11-22更新排序算法


补充内容 (2021-12-1 10:12):
版本更新见61楼,https://club.excelhome.net/forum ... 45&pid=10841940

补充内容 (2021-12-10 20:17):
版本提前更新见82楼,https://club.excelhome.net/forum ... 45&pid=10849695

评分

24

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 08:52 | 显示全部楼层
DataAutomation类用法很简单第一步:Dim da As New DataAutomation 生成一个da实例

第二步:向da中写入数据
第三步:对数据执行函数
第四步:输出数据

第一步详解:生成一个新的da实例有两种方法
                   方法一:Dim da As New DataAutomation
                   方法二:该方法的作用是减少变量的声明,利用一个da实例派生出N个子实例,对链式编程原则很方便
                             在已生成第一个实例上可以使用Public Function xin([ByVal key As String = ""]) As DataAutomation 方法
                              例一da.xin.初始化数据(“a1:d3”).排序(1).写入单元格([E2])
                             此例生成一个临时的da实例对临时数据进行操作,该操作不影响父亲da实例
                             例二da.xin("排序实例").初始化数据(“a1:d3”).排序(1).写入单元格([E2])
                             此例生成一个da实例并将此da实例写入到父亲da实例的属性中,下次可以使用da.属性("排序实例")取出这个实例继续使用

第二步详解:1)写入数据可以用Public Function 初始化数据(ByVal arr) As DataAutomation
                调用该方法传入一个数组参数,将数组写入da实例中,例如:da.初始化数据(range("a1:d3").value)
                该方法还可以传入range对象,例如:da.初始化数据(range("a1:d3"))
                该方法还可以传入range地址,例如:da.初始化数据("a1:d3")注意地址方式只适用于当前激活表中
                初始化数据由于是最常用的所以我加了语法糖,可以简写成da(range("a1:d3").value),da(range("a1:d3")),da("a1:d3")
                2)如果需要添加数据可以使用Public Function 添加数据(ByVal arr, ByVal 添加位置 As 添加位置) As DataAutomation
                注意添加数据的第一参数必须是数组
                第二参数是一个枚举,用来规定添加在原数据的哪个方向
                  Public Enum 添加位置
                       右添加 = 1
                       下添加 = 2
                       左添加 = 3
                       上添加 = 4
                  End Enum

                 例如:da("a1:d3").添加数据(range("a5:d5").value,下添加)
                3)在多个数据需要上下合并时使用添加数据是效率是很低的这是可以使用
                Public Function 初始化数据_集合方式(对象 As Object) As DataAutomation
                该方法可以传入Dictionary或Collection对象,对象里存的必须是数组
                该方法会将所有数组按顺序上下拼接成一个数组写入到da实例中
第三步以后详解:
第四步详解:1)输出到单元格可以用Public Function 写入单元格(rng As Range, [ByVal 合并单元格列arr = 0]) As DataAutomation
                第一参数只需要传入写入的左上角单元格就可以自动扩展写入数据
                第二参数(可选参数)是列索引,可以是单个数也可以是索引数组,用来指定合并单元格的列
                例如:da("a1:d3").写入单元格([a10])'直接写入
                          da("a1:d3").写入单元格([a10] , 1)'对第一列空值合并单元格
                         da("a1:d3").写入单元格([a10] , Array(1,2))'对第一列和第二列空值合并单元格
                1)输出数组用Public Function 取出数组() As Variant()
                    该方法很简单就是把da实例返回数组

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 09:03 | 显示全部楼层
da实例写入数据有两个注意
一,所有传进来的数组都会转化成下限为1的数组,为了减少内部转化操作,尽量传入数组下限为1的数据
       例如dim arr(1 to 100,1 to 3) 这样下限为1的数组 效率是最快的
二,假如删除最后一列数据多数人肯定会这样写
     da("a1:d3").删除列 (da.列数) 按思路是正确的,实际会报错
     VBA有函数是有计算顺序的,函数的计算顺序是从最深层参数开始执行代码
     比如 Left("a" & "b", 1)   VBA先计算 "a" & "b" 得到"ab"  再计算Left("ab", 1)  得到 "a"

    再来回顾da("a1:d3").删除列 (da.列数)
    VBA先计算da.列数  这是da还没有数据所里da.列数 是计算不出来的
    正确写法是在函数最深层初始化数据 da.删除列 (da("a1:d3").列数)

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 10:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
下面先列出一些基本用法,都是简单的方法不进行细说了,后续复杂方法在详解
Public Function 插入行(ByVal index As Long, ByVal 数量 As Long, [是否复制 As Boolean = False]) As DataAutomation类似excel的插入整行整列
第1参数:插入位置的行索引
第2参数:插入的数量
第3参数:true是插入的新行将复制上一行的内容,False时则为空值
Public Function 插入列(ByVal index As Long, ByVal 数量 As Long, [是否复制 As Boolean = False]) As DataAutomation
类似excel的插入整行整列
第1参数:插入位置的列索引
第2参数:插入的数量
第3参数:true是插入的新列将复制上一列的内容,False时则为空值
Public Function 复制N列(ByVal arr) As DataAutomation
根据arr列索引的对应列复制一份,复制到数据的末尾列,数据列数会增加
第1参数:可以是列索引如da.复制N列(1),也可以是列索引数组如da.复制N列(array(1,3))
Public Function 隔行插入() As DataAutomation
隔行插入空行,没什么好说的,没参数
Public Function 交换行(ByVal 行1 As Long, ByVal 行2 As Long) As DataAutomation
对两行数据位置进行交换
第1参数:行索引1
第2参数:行索引2

Public Function 交换列(ByVal 列1 As Long, ByVal 列2 As Long) As DataAutomation
对两列数据位置进行交换
第1参数:列索引1
第2参数:列索引2
Public Function 空值移动(ByVal arr, [ByVal 方向 As 移动方向 = 上移], [ByVal 空值 As String = ""]) As DataAutomation
类似excel定位整行或整列空值然后删除空值操作
第2参数:移动方向枚举
Public Enum 移动方向
    右移 = 1
    下移 = 2
    左移 = 3
    上移 = 4
    不移动 = 5
End Enum
第1参数:索引或索引数组,当移动方向时上移或下移时为列索引,当移动方向时左移或右移时为行索引
第3参数:判断空值的条件,例如把第3参数设置为“1”,那么就会把1当做空值删除
Public Function 判断是否重复(ByVal arr) As Boolean
判断整列是否用重复值
第1参数:列索引或列索引数组
Public Function 删除行(ByVal arr) As DataAutomation
删除整行
第1参数:行索引或行索引数组
Public Function 删除空行([ByVal 空值 As String = ""]) As DataAutomation
如果整行都为空那么就会被删除
第1参数:判断空值的条件
Public Function 删除列(ByVal arr) As DataAutomation
删除整列
第1参数:列索引或列索引数组
Public Function 删除区域(ByVal 行 As Long, ByVal 列 As Long, ByVal 高 As Long, ByVal 宽 As Long, ByVal 移动 As 移动方向, [ByVal st = ""]) As DataAutomation
类似excel删除一块区域
第1参数:区域的左上角对应数据行位置
第2参数:区域的左上角对应数据列位置
第3参数:区域的高度
第4参数:区域的宽度
第5参数:移动方向枚举(参照空值移动方法)
第6参数:被删除区域填充值默认空值
Public Function 转换列(ByVal arr) As DataAutomation
根据列索引,将整列进行重组
第1参数:列索引或列索引数组
例如:da("a1:d3"). 转换列(array(2,3))  转换后数据内容只保留了第2和第3列变成了“b2:c3”内容
          da("a1:d3"). 转换列(array(1,1,1))  转换后数据内容只保留了第1列数据,并把第1列数据复制成了三列
         da("a1:d3"). 转换列(array(4,3,2,1))  转换后数据的列被颠倒了
Public Function 转置数据() As DataAutomation
类似WorksheetFunction.Transpose函数
Public Function 去重(ByVal arr, [ByVal 保留第一行 As Boolean = True]) As DataAutomation


对数据相同的行进行去重
第1参数:列索引或列索引数组
第2参数:true时对其他列如果出现重复会取第一行数据,反之取最后一行
Public Function 是否有错误值() As Boolean
判断整个数据是否有公式错误值
Public Function 替换错误值([ByVal 新值 = ""]) As DataAutomation
对整个数据存在的公式错误值替换成新的支
第1参数:要替换的值
Public Property 数据(ByVal 行 As Long, ByVal 列 As Long)
这是属性,可以对数据的指定值读取,修改,像数组一样操作
例如:da.数据(1,3)=1 对数据的第一行第三列的值修改为1
         s=da.数据(1,3)  取得第一行第三列的值附给s变量

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 11:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
三个区域操作:
Public Function 裁剪区域(ByVal 行 As Long, ByVal 列 As Long, ByVal 高 As Long, ByVal 宽 As Long) As DataAutomation
对数据进行裁剪
第1参数:区域的左上角对应数据行位置
第2参数:区域的左上角对应数据列位置
第3参数:区域的高度
第4参数:区域的宽度
image.png
Public Function 覆盖区域(ByVal arr, ByVal 行 As Long, ByVal 列 As Long, [ByVal 是否扩展 As Boolean = False]) As DataAutomation
将一个arr数组,在指定位置把内容覆盖到da数据
第1参数:一个数组
第2参数:arr数组左上角对应数据行位置(可以为负数)
第3参数:arr数组左上角对应数据列位置(可以为负数)
第4参数:true时如果arr数组超出了da数据边界那么对da数据边界进行扩展
               false时如果arr数组超出了da数据边界那么对arr数组进行剪裁
image.png
image.png
image.png
image.png
Public Function 反覆盖区域(ByVal arr, ByVal 行 As Long, ByVal 列 As Long, [ByVal 是否扩展 As Boolean = False]) As DataAutomation
将da数据,在arr数组上的指定位置把内容覆盖到arr数组,并重新生成da数据
参数:参照覆盖区域
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 11:45 | 显示全部楼层
Public Function 透视(ByVal 字段arr, ByVal 透视arr, ByVal 值index As Long) As DataAutomation

将竖向表示的数据转成一个二维表,类似数据透视表
第1参数:透视后在左侧竖向显示的标题列索引或索引数组
第2参数:透视后在上侧横向显示的标题列索引或索引数组
第3参数:透视后填充在表格中间区域内容列索引
image.png
image.png
Public Function 逆透视(ByVal 列标arr, [ByVal 标题行 As Long = 1]) As DataAutomation
将一个二维表转成竖向表示的表格
第1参数:逆透视的标题列索引或索引数组
第2参数:标题的行数
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 12:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Public Function 数据透视(ByVal 字段arr, ByVal 计算arr, ByVal 规则arr, [ByVal 分隔符 = ""]) As DataAutomation对数据进行汇总
第1参数:汇总的字段列索引或索引数组
第2参数:要进行计算的的列索引或索引数组
第3参数:透视规则是枚举类型
        Public Enum 透视规则
            ts求和 = 1
            ts计数 = 2
            ts平均值 = 3
            ts最大值 = 4
            ts最小值 = 5
            ts乘积 = 6
            ts连接 = 7
        End Enum
           注意:如果第2参数是索引数组,那么第3参数也是对应的数组
          例如:da("A1:D10").数据透视(1, Array(2, 3), Array(ts计数, ts求和))
第4参数:如果透视规则是ts连接,那么可以设置连接分隔符
image.png

Public Function 数学计算(ByVal 规则 As 透视规则, [ByVal 分隔符 = ""])

对整个da数据进行计算
参数:参照数据透视的透视规则
image.png
数学计算通常和两个函数配合
Public Function 取整行(ByVal index As Long) As DataAutomation
第1参数:行索引
Public Function 取整列(ByVal index As Long) As DataAutomation
第1参数:列索引
这两个函数返回一个新的da实例,da数据就是对应的整行或整列
image.png
image.png
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 13:05 | 显示全部楼层

Public Function 添加计算行vbs(ByVal 公式 As String) As DataAutomation
Public Function 添加计算列vbs(ByVal 公式 As String) As DataAutomation
只支持32为excel所以不讲解了,方式可以参考后面的 添加计算列
Public Function 添加计算行(ByVal 公式 As String) As DataAutomation
同样不进行讲解因为方法和添加计算列 一样
Public Function 添加计算列(ByVal 公式 As String) As DataAutomation
为da数据末尾添加一列新数据,数据是第1参数的字符串公式计算而来
新的数据可以用 [列索引]   方式引用同一行的列索引内容
第1参数:一个字符串公式
此方法底层用的Evaluate所以你们应该会用了吧,可以使用各种excel函数计算
例如:
image.png
***这里我要将第一种回调函数,我称为"隐式回调"
隐式回调利用的就是Evaluate特性,看示例:
image.png
我没用回调函数调用了excel的sum,由于第一行标题也被计算了,产生了错误值
接下来我用回调函数重写sum,如下示例:
image.png
我的"da.添加计算列"方法调用了"um重写"函数,使得计算没有错误了
为什么我叫他隐式回调?因为他是在内部调用了,即时我在回调函数设置断点也不会停止
这种回调方式大大的增加了"添加计算"方法的灵活性

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-21 13:29 | 显示全部楼层
本帖最后由 905738810 于 2021-11-22 10:38 编辑

Public Function 排序(ByVal index As Long, Optional ByVal 升序 As Boolean = True) As DataAutomation
对数据的整行排序
第1参数:列索引
第2参数:true 升序,false降序
Public Function 添加排名(ByVal index As Long, ByVal 排名方式 As 排名) As DataAutomation
对一列进行排名,da数据会扩展一列,将排名结果添加到最后一列
第1参数:列索引
第2参数:枚举值如下
Public Enum 排名
    中式排名 = 1
    美式排名 = 2
    序号 = 3
End Enum
Public Function 随机排序([ByVal index As Long = 0]) As DataAutomation
对整行或者单列打乱顺序
第1参数:列索引
              如果列索引是0,则对整行打乱顺序
              如果列索引大于0且小于等于列数,则对单列打乱顺序
Public Function 自定义排序(ByVal arr, ByVal index As Long) As DataAutomation
根据自定义顺序arr数组排序(对arr数组采用字典方式匹配)
第1参数:自定义顺序arr数组
第2参数:列索引
Public Function 自定义like排序(ByVal arr, ByVal index As Long) As DataAutomation
根据自定义顺序arr数组排序(对arr数组采用like方式匹配)
第1参数:自定义顺序arr数组(可以带有通配符)
第2参数:列索引Public Function 上下翻转数据() As DataAutomation
将数据倒过来,无参数


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-22 11:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
查找替换篇
Public Function 查找(ByVal 内容arr, [ByVal 所有结果 As Boolean = False], [ByVal 查找方向 As 查找 = 全部查找], [ByVal 行 As Long = 1], [ByVal 列 As Long = 1])
类似ExcelVBA里的Fnd方法,返回值为二维假数组,数组存行列坐标,
例如:arr(1,1)找到的第一个内容的行索引 arr(2,1)找到的第一个内容的列索引
          arr(1,2)找到的第二个内容的行索引 arr(2,2)找到的第二个内容的列索引
          arr(1,3)找到的第三个内容的行索引 arr(2,3)找到的第三个内容的列索引
第1参数:可以是数字或字符串也可以是(数字,字符串)数组
              还可以使用like方法的通配符 例如:"*da*"查找包含"da"的内容
              还可以是比较符号 例如:">100"查找大于100 、"<10"查找小于10、">=100"查找大于等于100、"<>"查找不等于空
              还可以查找不符合条件的(vba解释就是 not like) 写法例如:"<>*da*"查找不包含"da"的内容
              如果传递不是数组 例如 ">1",则返回参数的格式是一个假二维数组,格式像这样 array(array()) 一个数组套一个坐标数组
              如果传递了数组 例如 array(">1","*da*"),则返回参数的格式是一个假二维数组,
               格式像这样 array(array(),array())一个数组套两个坐标数组
               假数组取值应该这样:
               arr(1)(1,1)找到的第一个元素进行查找的第一个内容的行索引 arr(1)(2,1)找到的第一个元素进行查找的第一个内容的列索引
第2参数:true返回所有结果,false只返回第一个结果
              设置成false可以利用查找判断数据里是否含有指定内容 例如 If IsArray(da.查找("", False)) Then MsgBox "有空值"
第3参数:枚举值,用来设置查找的方向
Public Enum 查找
    全部查找 = 1
    向下查找 = 2
    向上查找 = 3
    向右查找 = 4
    向左查找 = 5
End Enum

第4,5参数:分别是行列索引,用来设置查找的起始位置,如果第3参数=全部查找,则第4,5参数无效
Public Function 查找替换(ByVal 坐标arr, ByVal 内容arr) As DataAutomation
配合查找方法,将查找到的值进行替换
第1参数:查找方法返回的坐标arr
第2参数:用来替换的值,
            注意:查找方法的第一参数是数组,返回的坐标arr是一个假二维数组
                     这时第2参数的内容arr也要是一个数组,例如:
                         坐标格式=array(array(),array())  内容arr要与之对应的=array(替换内容1,替换内容2)
Public Function 查找坐标取值(ByVal 坐标arr)
配合查找方法,将查找到的值取出
第1参数:查找方法返回的坐标arr
返回值是与坐标arr相同格式的数据
Public Function 坐标取值(ByVal 坐标arr)
与查找坐标取值不同的是,坐标arr是只能是一个坐标数组,不能是假数组
此方法用来人为构造数组,批量提取指定位置的值更加方便
Public Function 坐标替换(ByVal 坐标arr As Variant, ByVal 内容arr As Variant) As DataAutomation
与查找坐标取值不同的是,坐标arr是只能是一个坐标数组,不能是假数组
此方法用来人为构造数组,进行批量覆盖指定位置的值更加方便

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-22 11:27 | 显示全部楼层
Public Function 填充上下(ByVal arr, [ByVal 下填充 As Boolean = True], [ByVal st = ""]) As DataAutomation
Public Function 填充上下清除(ByVal arr, [ByVal 下填充 As Boolean = True], [ByVal st = ""]) As DataAutomation
Public Function 填充左右(ByVal arr, [ByVal 右填充 As Boolean = True], [ByVal st = ""]) As DataAutomation
Public Function 填充左右清除(ByVal arr, [ByVal 右填充 As Boolean = True], [ByVal st = ""]) As DataAutomation
四个方法是为了处理合并单元格数据,将合并单元格数据填充,或将清除填充变回合并前模样
第1参数:行或者列索引或索引数组(上下方法为列索引,左右方法为行索引)
第2参数:填充方向
第3参数:默认找到空值被填充,如果想改变为其他值,设置此参数
image.png
image.png
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-22 11:48 | 显示全部楼层
本帖最后由 905738810 于 2021-11-22 11:57 编辑

第二种回调函数(因为用了CallWindowProc函数,我起名叫《CWP回调》)
为了方便后续方法讲解先将回调函用法
以da.循环 方法进行讲解
Public Function 循环(ByVal 次数 As Long, ByVal AddressOf地址, [ByVal key As String = "循环"]) As DataAutomation
第1参数:指定循环的次数,也可以理解为调用回调函数的次数
第2参数:回调函数地址,写法是 AddressOf 函数名 (AddressOf 关键字不能丢)
第3参数:给回调函数传递的方法标识符,如果一个回调函数有两个方法进行调用,可以利用标识符来判断具体方法
CWP回调函数模板
'Private Function 循环1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
'End Function
'Private Function 自定义分组1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
'End Function
'Private Function 子组自定义分组1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
'End Function
'Private Function 遍历组1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
'End Function
'Private Function 自定义筛选1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
'End Function
目前这5种方法的回调函数都是用了CWP回调,CWP回调的好处在于调用速度极快,所以我在频繁需要回调的方法上都用了CWP回调,并且回调函数采用了传址方法,可以回写变量。
但是他也有缺点就是要加AddressOf 关键字,回调函数只能写在模块中,格式不能乱写否则崩溃
注意:CWP回调的回调格式一定要按照模板来写,da类的顶部写也有模板可以直接复制
         模板的函数名,变量名是可以更改的,类型和关键字不能修改
以循环方法示例:
image.png
循环回调第1参数:调用的da实例
循环回调第2参数:调用次数
循环回调第3参数:总次数
循环回调第4参数:标识符
如果将回调函数返回值设置true可以提前终止循环


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-22 13:56 | 显示全部楼层
本帖最后由 905738810 于 2021-11-23 19:57 编辑

Public Function 筛选(ByVal index As Long, ByVal 条件arr, [条件共存 As Boolean = True]) As DataAutomation对数据进行整行筛选
第1参数:进行判断条件的列索引
第2参数:条件或条件数组,条件可以是数字,字符串,支持like通配符,可以是比较运算符
               详细内容可以参考前面的查找方法
               条件数组的互相运算方式是or运算,如果想and可以多次调用方法例如:da.筛选().筛选()
第3参数:如果第2参数是数组并且,条件有共同区间
                 例如:array("*d*","*da*") 此条件都满足包含"da"内容的区间
                           数据为("a","dav","da","dd")
             如果参数=true 则会把相同区间内容复制一份 ,结果为:数据("dav","da","dd","dav","da")
             如果参数=false则只会保留一个结果 ,结果为:数据("dav","da","dd")

Public Function 筛选自定义(ByVal AddressOf地址, [ByVal key As String = "筛选自定义"]) As DataAutomation

按CWP回调函数来筛选
回调函数返回true则保留数据,返回false则删除数据 2021-11-23更新这句话
第1参数:回调函数地址,写法是 AddressOf 函数名 (AddressOf 关键字不能丢)
第2参数:给回调函数传递的方法标识符,如果一个回调函数有两个方法进行调用,可以利用标识符来判断具体方法
回调函数模板:
'Private Function 自定义筛选1(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
'End Function

回调第1参数:调用的da实例
回调第2参数:调用次数
回调第3参数:调用次数(与回调第2参数一模一样)
回调第4参数:标识符

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-22 14:59 | 显示全部楼层
讲解属性的概念
       由于da类使用了回调机制,可以将数据分功能分块,使代码结构更清晰,
但是有一个弊端就是无法实现两函数间的互相通信,或者说主函数与回调函数的变量无法共用
所以我研究出了属性这个概念。
     因为回调函数的参数是有da实例的,在da实例中添加属性,就可以将主函数与回调函数通过
读写属性方法来实现通信。
Public Function 属性添加(ByVal key As String, ByVal 内容) As DataAutomation
底层就是字典实现的
第1参数:标识符(理解成字典的key)
第2参数:要写入属性的内容(理解成字典的item)
Public Function 属性(ByVal key As String)
通过标识符取出属性
第1参数:标识符

下面演示:两个da实例互相调用
image.png
此示例只用了已经讲过的方法,来实现高级筛选功能
这个示例效率肯定不高,代码也过于长了(应该比纯VBA少吧)
实际上这种查找功能,在后面查找篇章中会有更好的处理方法
主要是给大家体会da类的用法思路,以及属性的作用
属性的扩展方法
这些方法底层都是属性实现的
Public Function 备份还原数据(ByVal key As String) As DataAutomation
da类是对da数据操作的,比如筛选方法,执行后da数据就改变了,如果想复用筛选前的数据,可以将数据先备份
第1参数:标识符(理解成字典的key)
Public Function 备份数据(ByVal key As String) As DataAutomation
对备份的数据进行还原,还原后现有da数据会被替换掉
第1参数:标识符(理解成字典的key)
关于备份示例参照此贴开篇的演示动图
Public Function xin(Optional ByVal key As String = "") As DataAutomation
创建一个新的da实例,此函数已经在前面讲解过了
在高级筛选功能演示中,其实直接使用da.xin("da2")方法来创建一个新的实例,创建后直接可以da.属性("da2")调用了,这样更方便

TA的精华主题

TA的得分主题

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

组的概念,组可以是da类的灵魂了
对组操作大概分三部
一、分组(对da实例按条件拆分成N个da子实例)
      分组有一下几种方法
             1.按查找内容分组
             2.按行上下不同分组
             3. 按类别分组
             4.按列数量分组
             5.按数量分组
             6.按条件分组
             7.对组再分组
                 对组再分组分一下几种模式:
                     1.对叶子节点分组
                     2.对第N层组在分组

二、遍历组(利用回调函数逐个取出da子实例,对da子实例进行修改)
      遍历组分一下几种模式:
            1.全部遍历
            2.遍历叶子节点组
            3.遍历第N层组
三、合并组(通过遍历组对da子实例进行修改后,还原到da实例中)
      合并组分一下几种模式:
            1.合并全部节点的组
            2.合并叶子节点组
            3.合并第N层组


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-22 22:07 | 显示全部楼层
shimakaze 发表于 2021-11-22 17:12
额  没咋用过,学习了。判断是否重复那个功能,能举个例子么,感谢。


Public Function 判断是否重复(ByVal arr As Variant) As Boolean
判断整列是否重复,重复返回true
当传递列索引数组做参数时,对那几列整体进行比较,例如:
image.png
当只对姓名判断时,显示有重复值
当对季度和姓名一起判断时,姓名虽然有重复,但加上季度整体比较就没有重复值了

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-23 14:29 | 显示全部楼层
image.png 画了这张图来展示一下组的层级,并展示了什么是叶子组

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-23 15:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
下面演示组的作用:
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 | 显示全部楼层
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:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
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:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 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-25 13:18 | 显示全部楼层
Public Function 合并组([ByVal 层 As Long = 0]) As DataAutomation
将组的单元进行上下拼接,写入到da数据中,替换掉原数据
第1参数:要合并的第N层
              当传递0时按叶子节点单元合并(默认值)
              当传递任意负数时合并所有层
              详细参考遍历组方法
演示:隔两行插入一行
未命名1637736854.png
Public Function 清空组() As DataAutomation
将组内容全部清除,分组操作只会像组中添加单元,不会替换组里的内容
在需要重新分组时需要执行清空组
Public Property 组 As Object
这个属性可以返回组的字典
Public Property 父对象 As DataAutomation
通过da实例衍生出的子实例都对保留上一实例对象,保存在父对象属性中
方法大概有:da所有分组方法衍生的实例
                   da.xin
                   da.取整行
                   da.取整列
                   da.行列拼接
                  da.裁剪区域
                  da.字典取行
                  da.字典取行列
Public Property 名字 As String
可以对da实例起名字,当做标识

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-26 11:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
       对于前篇讲的合并组方法有一个缺陷,就是他只会按拆分顺序来合并,
而有时候想对组的单元有选择的合并,或者自己定义的顺序合并,这是就
需要重新定义组的顺序,可以用下面讲的方法:组排序
Public Function 组排序([ByVal key As String = "index"]) As DataAutomation
按自定义规则来重新组合单元,形成一个新的组,该方法会替换掉原先组
第1参数:与属性关联的key
原理:该方法是将组全部遍历,抽取组中所有人为设置好属性key的da.子实例,只要
有key属性的da子实例就会添加到新的组中,然后读取每个key属性的属性值作为排序
字段进行排序
使用前需要做好四步骤才可使用:
          1.分组-2.遍历组-3.遍历组回调函数中写入属性(key , 排序字段)-4.组排序(key)
演示:按季度排序,并过对组的单元滤出标题
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-26 12:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
da类的错误处理
如果你能坚持看到这的朋友会发现da类的编程方式为链式编程,编写很方便,如果有足够宽的显示甚至可以全部写到1行
同时他暴露出了一个严重的缺点,就是每个方法的计算都是参照上一个方法处理的数据,一旦上个方法处理错误后面方法
也会跟着对错误数据继续处理,会导致:1.计算的数据有误,2.对错误数据处理做了很多无用功浪费计算时间
da类提供了两个方法一个属性来控制上述问题
Public Function 错误停止运行() As DataAutomation
当前面方法出错时,后续方法全部跳过运行
Public Function 错误继续运行() As DataAutomation
当前面方法出错时,后续方法集训运行(默认)
Public Property 错误信息 As String
记录第一个报错的方法
演示1:运行到添加数据方法会报错,后续写入单元格不会被执行
image.png
错误停止运行和错误继续运行方法可以在任意位置添加任意数量
可以利用该方法控制某一串方法不运行
演示2:
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-26 12:33 | 显示全部楼层
开发者模式与用户模式
有这样需求:在开发阶段,我们希望能够发现代码中的错误,VBA可以给提供给我们报错提示
                   在用户使用阶段,不能将VBA的报错提示框展示给用户
此模式在da类中不是用代码修改的,是在da类模块中
在da类模块顶部有这样的代码,如图:
image.png
大概在40行左右
这是一个条件编译代码,不知道的不需要知道,只要知道把false改成true就是用户模式就够了
演示:#Const 用户模式 = False ,弹出错误提示
image.png
      #Const 用户模式 = True ,不弹出提示
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-27 15:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
今天不讲新方法,主讲回调函数,因为回调函数是da类的核心思想之一
为了不占地方,我开了新帖VBA回调函数作用讲解

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-28 13:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
很多场景对字符串操作还是蛮多的,所以我写了四个正则函数,可以对整行整列进行提取或替换操作
Public Function 正则取值置换列(ByVal indexarr, ByVal 表达式, [ByVal 内容index As Long = 1], [ByVal 组index As Long = 0], [ByVal 忽略大小写 As Boolean = True], [ByVal 匹配全部 As Boolean = True]) As DataAutomation
对整列进行正则提取文本
第1参数:实行正则匹配的列索引
第2参数:正则表达式
第3参数:如果正则匹配多个结果,指定提取的第几个结果
第4参数:如果正则有分组()内容,指定提取第几个分组,如果参数设置为0,则不提取组
第5参数:正则匹配原则是否忽略大小写
第6参数:正则匹配原则是全部匹配
演示1:只提取匹配结果
image.png
演示2:匹配组的结果
image.png
Public Function 正则取值置换行(ByVal indexarr, ByVal 表达式, [ByVal 内容index As Long = 1], [ByVal 组index As Long = 0], [ByVal 忽略大小写 As Boolean = True], [ByVal 匹配全部 As Boolean = True]) As DataAutomation

参考正则取值置换列

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-28 13:55 | 显示全部楼层

Public Function 正则替换列(ByVal indexarr, ByVal 表达式, ByVal 替换内容, [ByVal 忽略大小写 As Boolean = True], [ByVal 匹配全部 As Boolean = True]) As DataAutomation
对整列文本进行正则替换操作
第1参数:实行正则匹配的列索引
第2参数:正则表达式
第3参数:要对匹配结果进行替换的内容
第4参数:正则匹配原则是否忽略大小写
第5参数:正则匹配原则是全部匹配(这里很重要,如果只替换第一个内容可以设置false)
演示:正则我就不解释了
image.png
Public Function 正则替换行(ByVal indexarr, ByVal 表达式, ByVal 替换内容, [ByVal 忽略大小写 As Boolean = True], [ByVal 匹配全部 As Boolean = True]) As DataAutomation
参考正则替换列

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-28 14:07 | 显示全部楼层
本帖最后由 905738810 于 2021-11-30 14:15 编辑

Public Function 行列改变([ByVal 行 As Long = 0], [ByVal 列 As Long = 0], [ByVal 原数据先行后列 As Boolean = True], [ByVal 新数据先行后列 As Boolean = True]) As DataAutomation
重新定义da数据大小(行数,列数),将原da数据按顺序(先行后列,先列后行)写入新的da数据大小中
第1参数:新数据的行数
第2参数:新数据的列数
第3参数:原数据取出顺序
第4参数:新数据写入顺序
我真的不知道如何描述这个方法了,对于不理解的,da类的源码都在那里可以看源码演示1:一列变两列
image.png image.png
演示2:两列变一列
image.png





TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-30 14:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Public Function 拼接行列([ByVal 列标arr = 0], [ByVal 行标arr = 0], [ByVal 分隔符 As String = ","]) As DataAutomation
可以实现对数据的字符串拼接,返回一个新的da实例,用来装拼接后的数组
第1参数:要拼接的列索引或列索引数组
第2参数:要拼接的行索引或行索引数组
第3参数:拼接的分隔符[默认为","]
演示1:参数只传列索引时
image.png
演示2:参数只传行索引时
image.png
演示3:参数行,列索引都传时(会按笛卡尔积形式拼接)
image.png
演示4:参数行,列索引传数组时
image.png
大家也发现了,从讲完组以后,后面讲的da方法比较灵活,难理解,建议自己亲自试一试

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-30 16:51 | 显示全部楼层
接下来就将讲解da类中字典的用法
da类中可以对da数据设置字典索引,有如下两方法
Public Function 字典设置行索引(ByVal arr) As DataAutomation
针对一维表(只有列字段)设置行索引(采用拼接指定的列内容生成字典key)
生成字典的可以字段中间会有","分隔
第1参数:列索引或列索引数组(参考去重参数)
Public Function 字典设置行列索引(ByVal 行标arr, ByVal 列标arr) As DataAutomation
针对二维表(包含行列字段)设置索引(采用笛卡尔积拼接形式生成字典key)
生成字典的可以字段中间会有","分隔
第1参数:行索引或行索引数组(参考拼接行列)
第2参数:列索引或列索引数组(参考拼接行列)
两个方法运行后并没有效果,只是向da实例中存储了字典索引,可以在本地窗口中查看隐藏属性[字典索引],
需要配合下面方法取出数据,可以实现查找效果
Public Function 字典取行(ByVal arrStr) As DataAutomation
传入key对应的,从da数据中取出数据,会生成一个新的da实例
第1参数:key数组
Public Function 字典取行列(ByVal 行arrStr, ByVal 列arrStr, [ByVal index As Long = 1]) As DataAutomation
传入行key以及列key对应的,从da数据中取出数据,会生成一个新的da实例
第1参数:行key数组
第2参数:列key数组
第3参数:当运行的是字典设置行索引时,使用字典取行列方法会转为二维表,这时需要指定哪一列为二维表数据
演示1:字典设置行索引配合字典取行(一维表查找一维表)
image.png
演示2:字典设置行列索引配合字典取行(一维表查找二维表)
image.png
演示3:字典设置行索引配合字典取行列(二维表查找一维表)
image.jpg
演示3:字典设置行列索引配合字典取行列(二维表查找二维表)
image.png
da字典.rar (258.18 KB, 下载次数: 13) 此方法不好理解,特上传图片示例

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-1 10:11 | 显示全部楼层
更新说明:修复已知bug
               优化一些方法效率
               新增一些功能(后续会讲解)
               新增接口回调,以解决2021版本
版本附件: DataAutomation1.2.rar (278.25 KB, 下载次数: 45)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-1 13:51 | 显示全部楼层
Public Function 拆分数量(ByVal index As Long) As DataAutomation
对识别一列数据(数据是数字)进行复制对应的行数
第1参数:列索引
演示:
image.png
Public Function 拆分数组(ByVal index As Long, [ByVal 竖向展开 As Boolean = True]) As DataAutomation
处理数组套数组形式的假二维数组,将假数组拆成真数组
第1参数:数组所在的列索引
第2参数:true拆分后数组竖向排列,false拆分后数组横向排列
演示1:竖向拆分
image.png
演示2:横向拆分
image.png
Public Function 分列(ByVal index As Long, ByVal 分隔符arr, [ByVal 竖向展开 As Boolean = False], [ByVal 模式 As VbCompareMethod = vbBinaryCompare]) As DataAutomation
类似Excel的分列
第1参数:要分列的字符串所在列索引
第2参数:分隔符(支持多个分隔符数组)
第3参数:true拆分后数组竖向排列,false拆分后数组横向排列
第4参数:大小写模式(参照VBA的Split函数)
演示1:竖向分列
image.png
演示2:横向分列
image.png
演示3:多分隔符分列
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-1 14:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Public Function 遍历Excel([ByVal 初始路径 As String = ""], [ByVal 筛选工作簿名 As String = "*"], [ByVal 筛选工作表名 As String = "*"], [ByVal 单元格区域 As String = ""], [ByVal 是否查找子目录 As Boolean = False], [ByVal 处理函数 As String = ""]) As DataAutomation
跨工作表、工作簿合并函数
第1参数:搜索文件夹的路径(*为空时只遍历以打开的工作簿*)
第2参数:筛选的工作簿名称,(支持模糊筛选,参考查找方法)
第3参数:筛选的工作表名称,(支持模糊筛选,参考查找方法)
第4参数:指定单元格区域(*为空时为工作表已使用区域*)
第5参数:搜索文件夹时是否对子目录搜索
第6参数:指定回调函数名(字符串类型)
                该回调函数会以da子实例形式传回每个工作表的单元格数据
                可以通过修改da子实例,进行数据的处理(比如处理标题不对应情况)
                如果为空时不会触发回调,以原数据形式合并
演示1:
image.png image.png image.png
如上三个季度表,进行合并
image.png
演示2:继续用演示1的三个表数据进行季度销量汇总
image.png
上传演示附件以便更好理解: 遍历sheet合并.rar (291.7 KB, 下载次数: 18)
觉得代码简短精炼的的点个赞

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-1 14:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 905738810 于 2021-12-1 14:58 编辑

Public Function 格式化(ByVal 列标arr As Variant, ByVal 格式arr As Variant, Optional ByVal Farmat法 As Boolean = True) As DataAutomation
对整列数据进行VBA的Farmat函数操作
第1参数:要处理的列索引或列索引数组
第2参数:与第一参对应的格式字符串或字符串数组
               (如果第1参数是列索引数组,则第2参数要与之数量对应的字符串数组)
第3参数:true则用VBA的Farmat函数处理,false则用Excel的Text函数处理
演示:
image.png
Public Function 格式转换(ByVal indexarr As Variant, ByVal 格式 As 转格式, Optional ByVal 舍入位数 As Double = 0) As DataAutomation
对整列数据进行数据类型转换
第1参数:要处理的列索引或列索引数组
第2参数:转换的格式,枚举值
Public Enum 转格式
    gs转日期 = 1
    gs转文本 = 2
    gs转数值val = 3
    gs转数值CDbl = 4
    gs四舍五入 = 5
    gs向下舍入 = 6
    gs向上舍入 = 7
    gs转单元格文本 = 8'会强制在数据内容前拼接一个 ' 符号
End Enum
第3参数:处理小数是填写舍入位数
演示:
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-1 14:57 | 显示全部楼层
Public Function 对比DA包含情况(da As DataAutomation, ByVal ME列arr, ByVal DA列arr) As DataAutomation
两个da数据互相查找,在两个da数据后都增加了一列反应查找情况,列内容为1则存在包含
第1参数:另一个da实例
第2参数:调用该方法的da数据列索引,或索引数组(根据索引拼接成对比的key)
第3参数:另一个da实例的列索引,或索引数组(根据索引拼接成对比的key)
此方法没有使用字典,单纯的使用了循环,效率并不高
演示:
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-1 15:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Public Function 排列组合(ByVal index As Long, ByVal 取最小个数 As Long, ByVal 取最大个数 As Long, [ByVal 分隔符 As String = ","]) As DataAutomation
对一列数组进行排列组合,该方法会替换到原da数据,替换成排列组合数据
第1参数:列索引
第2参数:M里抽取N个,抽取的最小个数N
第3参数:M里抽取N个,抽取的最大个数N
第4参数:组合的分隔符
注意:穷举的效率是很低的而且算法没有优化,不要进行大量数据的穷举,否咋会假死
演示:
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-1 15:30 | 显示全部楼层
Public Function 求和凑数(ByVal index As Long, ByVal 最小值, ByVal 最大值, [ByVal 最大条数 = 0], [ByVal 随机次数 = 0]) As DataAutomation
对一列数据进行凑数,将凑数结果展示在新增一列,对满足凑数的标上序号
第1参数:凑数的列索引
第2参数:求和的最小值(包含最小值)
第3参数:求和的最大值(包含最大值)
第3参数:累加元素的个数最大数量[为0则无限制]
第3参数:随机的次数(按数据量的情况而定)[为0按计算机默认数量]
该采用随机凑数方法,结果不一定是最佳,凑数没结果可以也并不是没有结果,可以增加随机次数
随机次数较大会延长计算时间,造成假死
演示:
对数据凑出150~200的值
会增加一个凑数序号,相同的序号为一组结果
image.png
对序号进行排序后可以更明显看出结果,相同序号相加会在150~200
image.png


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-2 08:23 | 显示全部楼层
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参数:区域左上角在da数据的行索引
第2参数:区域左上角在da数据的列索引
第3参数:区域高度
第4参数:区域宽度
第5参数:查找的内容,传入数组可以同时查找多个内容(支持模糊搜索,参照查找方法)
第6参数:替换的内容
            当第5参数查找内容传入数组时,替换内容不是数组,则将全部找到的内容替换为替换内容
            当第5参数查找内容传入数组时,替换内容是数组且数量与查找内容数量一致,则将找到的内容按顺序替换为替换内容
演示1:将数据的8和9全部换成"A"

image.png
演示2:将数据的8换成"A",9换成"B"
image.png
演示3:将大于5的替换成0
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-2 08:47 | 显示全部楼层
前面所有的主方法讲完了,还剩辅助方法
所谓辅助方法是不对da数据进行处理的独立方法,主要用来配合主方法一起使用
Public Function 构造序列(ByVal L As Long, ByVal r As Long) As Variant()
在传参时很多方法都用到了行或列索引数组,如果遇到了50~100列序号,
那么手敲就很麻烦了,单独写VBA代码也麻烦,所以我写了这个方法
第1参数:序号最小值
第2参数:序号最大值
演示:
image.png
Public Function 新建数组(ByVal 行 As Long, Optional ByVal 列 As Long = 0, Optional 填充值 As Variant = "") As Variant()

创建一个数组就像dim arr(行,列),并且可以给数组一个初始值,这里不演示了
Public Function 数组拼一维(ParamArray arr()) As Variant()

处理数组套数组,将所有元素拼接成一位数组,主要配合构造序号方法,可以更灵活
演示:构造1,2,3,4,10,10,10,11,12,13,14序列数组
image.png
Public Function 转置(ByVal arr1)
对数组进行转置操作,比如原数组是一维数组(一行),在传入da数据时想变成二维数组(转一列),这是就可以套此方法
演示:在不使用转置时是这样的(拼接成一行了)
image.png
使用转置后(拼接成两列了)
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-2 09:01 | 显示全部楼层
Public Function 根据标题返回序号(ByVal 数据源标题arr, ByVal 自定义顺序arr)da数据都是根据行列索引操作数据的,如果想根据标题位置来操作,可以使用此函数返回对应的序列索引
第1参数:数据源的标题数组
第2参数:要查找的标题数组(支持模糊查找)
演示:表1变表2
image.png

两个正则辅助函数:
Public Function 正则取值(ByVal 内容, ByVal 表达式, [ByVal 内容index As Long = 1], [ByVal 组index As Long = 0], [ByVal 忽略大小写 As Boolean = True], [ByVal 匹配全部 As Boolean = True])
Public Function 正则替换(ByVal 内容, ByVal 表达式, ByVal 替换内容, [ByVal 忽略大小写 As Boolean = True], [ByVal 匹配全部 As Boolean = True])
这两个正则函数不进行演示了,该方法是正则取值置换列,正则替换列演变出来的,处理单个文本用的,可以去参考正则取值置换列,正则替换列

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-2 09:16 | 显示全部楼层

Public Function 开启自动处理(监视单元格区域 As Range, ByVal 函数名 As String) As DataAutomation
内置了工作表 Change事件,开启自动处理后只要监视区域被修改,则会调用回调函数
第1参数:要监视的单元格对象
第2参数:回调函数名(String类型)
使用该函数必须将da类声明到全局
演示:
动图看效果
GIF.gif
静图看代码
image.png
Public Function 关闭自动处理() As DataAutomation
可以关闭开启的自动处理

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-2 09:48 | 显示全部楼层
Function GZ(ByVal sr As String) As Variant
方法名演变过程:构造序号-->构造-->GZ
还是构造序号的辅助方法,为什么我给他起了这么简化的名字呢,因为他的强大
如此简单的声明背后都不会简单。
第1参数:构造表达式文本 (本人独创的构造达式)
表达式如下
(重复数量)(计算符+&*)(计算值)[ 值 , 数字下限 - 数字上限 ...]
并且支持表达式嵌套
1)首先表达式需要一个中括号[]
中括号里可以写任意值,或者是一个数字范围比如:1到10写成[1-10]
[]里可以用,英文逗号分隔符写入多个值或范围比如:"[1-4,10,10,10,11-14]"
image.png
2)然后中括号[]左边可以写上重复数量,比如 1,2,3 序列重复3次写成"3[1,2,3]"
image.png
3)再然后中括号重复数量后可以写上每次重复进行(加法+,乘法*,连接&)计算,
比如 1,2,3 序列重复3次每次递增1写成"3+1[1,2,3]"
image.png
4)减法和除法可以用+负数,*小数来解决,如递减"3+-1[1,2,3]"
image.png
5)构造公式可以嵌套嵌套再嵌套...
如"3+3[2[1-3]]"
先重复2次1到3,结果1,2,3,1,2,3
在对结果进行加1操作3次,结果如图:
image.png
6)不仅仅写数字,如"3[a,b,c]"
image.png
7)如果把[,]这些关键字写当成字符串,可以用转译符号/
image.png
到此所有方法全部讲完,完结了

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-3 08:52 | 显示全部楼层
案例解析,我就以这个朋友的贴做案例
excel用VBA按自定义排序
image.png
如图将左边的四个表格标题是乱的,对表格排序,使四个表格的标题顺序对应
解题分析:
1)如果四个表数据整体排序列那么肯定不会的到结果,所以需要将四个表分开处理
这时就应该想到分组
2)分组有很多方法,自定义分组,查找分组,类别分组,条件分组,数量分组,上下不同分组
忘记的可以翻回去看看,自定义应该是最后才考虑的,因为需要回调增加代码量,
根据分析,只要找到标题行就可以可以确定分组位置了,所以我选择查找分组,
代码:da(Range([A1], [D65536].End(3))).按查找内容分组(Array("姓名", "性别", "部门", "次数"), 1)
          先写入数据,然后按查找内容分组,只要找到标题那些关键字,就进行分组,
3)分组后,组里每个单元就是单独的表格了,这样对单元进行排序,不会影响其他单元
4)根据标题排序,可以想到我前面说的辅助方法<根据标题返回序号>这个方法就可以返回标题对应的序号
再使用<转换列>方法就可以转换列的顺序,忘的可以回顾70楼看看根据标题返回序号
注意的是,对组的每个单元操作肯定是要遍历他,所以使用遍历组方法,先遍历,在遍历组的回调函数进行单元操作
代码: Call da(Range([A1], [D65536].End(3))).按查找内容分组(Array("姓名", "性别", "部门", "次数"), 1).遍历组(AddressOf 标题排序, 1)
回调函数:
Private Function 标题排序(da As DataAutomation, 计数 As Long, 层数 As Long, key As String) As Boolean
    '取出第一行标题数组
    arr = da.取整行(1).取出数组
    '用转换列对表格排序
    Call da.转换列(da.根据标题返回序号(arr, Array("姓名", "性别", "部门", "次数")))
End Function
5)操作后每个单元的顺序都一致了,这是就可以把单元数据拼接会来,用合并组方法,合并后写回单元格
Call da(Range([A1], [D65536].End(3))).按查找内容分组(Array("姓名", "性别", "部门", "次数"), 1).遍历组(AddressOf 标题排序, 1)
Call da.合并组(1).写入单元格([G1])

6)分析完成代码截图如下
image.png
有些方法为了让你们看的清晰的写了两行,实际可以精简成7行
image.png
如果Sub,Function,Dim这些语句忽略不计,可以看出真正实现功能的只需要写两行代码就完成了
演示文件: excel用VBA按自定义排序.rar (245.45 KB, 下载次数: 20)





TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-3 09:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
案例:如图将左表变右表
image.png
思路分析:
1)首先他是对每个班级进行转换成一行,那么可以先对班级分组,分组方法肯定是<按类别分组>了
   分组肯定要遍历组的否则没意义了,先展示分组后效果
image.png
可以看出分组后每个班级到一个单元了
2)将每个班级转成一行可以用<行列改变>方法,演示如下
image.png
3)虽然转换成了一行不过,有班级进行干扰,可以先删除班级,在转换
image.png
4)效果已经出来了,这时再把班级加进去,
image.png
这段代码可以说一说了,我用了da.名字,这时什么?
           以前只是粗略的说了一下,da.名字,是da的标识符,如果做一个大工程这个属性你们就会替换到他的好处了
在这里da.名字是因为,使用了分组产生的da子实例,系统会自动给他安排一个名字,按类别分类就安排类别作为名字
按数量就会安排数量作为他的名字,大家可以一个一个去试一试不同分组产生的名字
          这里还用了<添加数据>方法,该方法只支持添加数组,所以我用array函数构造了一个数组
5)经过上面几步效果已经出来了,之后只需要将组的单元合并,就完成了
整理如下
image.png
6)构造标题,肯定要用构造序列函数 da.GZ
不会GZ函数表达式的请往回翻
表达式为:da.GZ("[班级,重复数量[姓名,成绩]]")
重复数量我们可以用合并后的da数据的列数来计算 (da.列数 - 1) / 2
所以表达式为:da.GZ("[班级," & (da.列数 - 1) / 2 & "[姓名,成绩]]")
image.png
7)之后只需要将标题数组arr写入单元格就可以了,可以用da方法套一下
da(da.GZ("[班级," & (da.列数 - 1) / 2 & "[姓名,成绩]]")).写入单元格 ([E1])
image.png
8)分析完成,可以看出三行有效代码就完成了复杂的转换,展示了da类的强大
附件: 班级转换.rar (259.09 KB, 下载次数: 12)
作业:还是此例子如何将右表转成左表?

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-8 10:51 | 显示全部楼层
出一个新案例:
image.png
要求根据工作量报表以及工资单价表,计算出每个人的工资
工作量报表+工资单价表算出工资报表
说明:1)根据产品对应的工资单价*数量可以计算出总价
          2)每人每人进行演讲,演出的人数,姓名是不固定的
          3)一个组里的总工资均分到每个人


TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-8 11:27 | 显示全部楼层
思路:
1)将工作量报表中的产品匹配工资单价表中的单价可以用da字典方法,创建工资单价表的da实例并用da.字典设置行索引方法生成字典索引
取出工作量报表中的产品的数组,在da工资单价表实例中用da.字典取行方法取出新的da实例
image.png
上述代码为了直观声明了三个da实例才完成操作,在da中可以用da.xin()方法创建新的da实例,整理后代码
image.png
2)将匹配到的数据,写入工作量报表中 的da数据中,可以用覆盖区域方法
image.png
因为产品名已经不需要了将产品位置替换成了单价
同样简化成一行后
image.png
3)计算每一行的总工资
用添加计算列的方法,产生新的一列总价
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-8 11:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
继续上面案例思路
4)根据小组对总价进行求和
可以用da.数据透视方法,注意数据透视前应该将小组的合并单元格填充
image.png
5)处理小组姓名的分隔符号,由于分隔符都不规范,使用正则统一替换为,
并且还存在两个姓名之前有多个分隔符情况也要用正则替换掉,所以用两次da.正则替换方法
image.png
6)计算一组里没人的人均工资,总工资/人数,人数可以用分隔符+来确定数量
同样适用da.添加计算列方法,可以使用excel函数计算人数,例如
image.png
代码就是这样
image.png
计算完最后删除一些没用的列
日期[1列],产品[3列],数量[4列],总价[5列],这些已经不需要了
image.png



TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-8 12:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
继续案例思路:
7)处理后如上图片,现在将姓名展开
da.分列方法
image.png
8)根据姓名进行求和
image.png
9)将工资小数位舍入1位
image.png
10)完成统计,整理出最终代码
image.png
今天这案例讲解完毕,分析这么多主要为了说清思路,可以看出实际代码就是那么几行

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-8 12:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
忘了上传案例附件 计算工资案例.rar (300.82 KB, 下载次数: 23)

TA的精华主题

TA的得分主题

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

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:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
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, 下载次数: 11)

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 | 显示全部楼层
本帖最后由 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, 下载次数: 17)

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-21 16:48 | 显示全部楼层
接口回调代替CWP回调
在第二版就更新增加了接口回调,一直没有说,现在补充一下。
接口回调主要是解决在2021版本中CWP回调崩溃问题,是用来代替CWP回调而写的
用到接口回调的方法和用到CWP回调的方法都是一样的,只需要在方法后加上接口就可以
具体方法列举如下:
Public Function 按叶子组自定义分组接口(函数类 As Da接口, [ByVal True在第一行 As Boolean = True], [ByVal 层 As Long = 0], [ByVal key As String = "按叶子组自定义分组"]) As DataAutomation
Public Function 按自定义分组接口(函数类 As Da接口, [ByVal True在第一行 As Boolean = True], [ByVal key As String = "按自定义分组"]) As DataAutomation
Public Function 遍历组接口(函数类 As Da接口, [ByVal 层 As Long = 0], [ByVal key As String = "遍历组"]) As DataAutomation
Public Function 筛选自定义接口(函数类 As Da接口, [ByVal key As String = "筛选自定义"]) As DataAutomation
Public Function 循环接口(ByVal 次数 As Long, 函数类 As Da接口, [ByVal key As String = "循环"]) As DataAutomation
与原先函数不同的是原方法传递的是CWP回调函数地址,现在需要传递接口回调函数的new实例
看下面图:
image.png
当前版本是需要三个类组成,
1)DataAutomation类:用于程序调用的da类
2)Da接口类:定义了接口回调函数的接口,固定不变的,至于要添加进程序就好,其他不用管





3)Da回调函数:这个类就是写回调函数用的,用来传递接口回调函数的new实例
         Da回调函数代码如下图,里面的所用函数不能更改,当需要写回调函数是,写到对应的函数中就可以
         注意:当需要写多个相同回调函数时,需要复制一个此类,将代码全部粘贴过去,这也是接口回调的缺点,太麻烦
          image.png
演示1:
模块1代码如图,这里代码.循环接口(10, New Da回调函数)以前是传递函数地址,现在改为了Da回调函数类的实例
image.png
Da回调函数类代码如图
image.png
本实例调用了循环方法,所以在Da接口_循环回调中写处理数据代码
演示2:多个相同回调函数调用(复制Da回调函数类
根据演示1用了循环,调用了Da回调函数类的实例中的Da接口_循环回调函数,
当需要再次使用循环方法时需要复制一个Da回调函数类,如图
image.png
这里插入了一个新的类:类1,第二个da.循环接口方法传递了 New 类1
类1代码如图:
image.png
这个类1代码的函数声明完全复制了Da回调函数类
类1的Da接口_循环回调函数中对数据进行了乘方
演示3:多个相同回调函数调用(key参数)
根据演示2可以改成如下图,模块1代码,传入key参数
image.png
Da回调函数类中识别key参数做不同的处理
image.png
补充:如果对接口不理解的,可以看我的贴VBA回调函数作用讲解
这贴在后面有热心朋友分享了学习接口的连接,再此感谢他们
通过上面演示也看出接口回调是很麻烦的,影响了da类代码简节,开发效率高的特性,接口回调代替CWP回调是对Excel2021版本的无力之举

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-21 16:52 | 显示全部楼层
DataAutomation接口回调实现,上一贴附件,又忘上传了... DataAutomation接口回调实现.rar (291.95 KB, 下载次数: 23)

TA的精华主题

TA的得分主题

发表于 2021-11-20 17:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢分享

能写点教程吗,水平不行,看不大懂
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-16 20:14 , Processed in 0.145673 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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