ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

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-12-22 00:17 | 显示全部楼层
905738810 发表于 2021-12-21 16:48
接口回调代替CWP回调
在第二版就更新增加了接口回调,一直没有说,现在补充一下。
接口回调主要是解决在2 ...

楼主居然又更新了这么多。
这个接口回调用起来虽然还算方便,但做起来要搞一堆类,老恶心了。
我用CallWindowProc一直没出过问题,最近也换了Excel2021。不过我的CallWindowProc是封装在DLL中。我觉得Excel2021下面出错有可能是使用的问题。
我是将参数转换为Variant使用的,虽然可能效率会降低一些,但通用方便。我的代码Declare Function CallBackProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpProc As Long, Optional ByRef Param1 As Any, Optional ByRef Param2 As Any, Optional ByRef Param3 As Any, Optional ByRef Param4 As Any) As Long

Function CallBackFunctionReturnVariant_(ByVal lpProc As Long, Optional ByRef Param1 = 0, Optional ByRef Param2 = 0, Optional ByRef Param3 = 0)
    Call CallBackProc(lpProc, CallBackFunctionReturnVariant_, Param1, Param2, Param3)
End Function


以上代码是用于32位Office的。在64位Office下要注意参数的位数。虽然我没装64位Office,但可以在MSDN上查参数类型的原始类型来判断参数位数。https://docs.microsoft.com/en-us ... /windows-data-types
LRESULT CallWindowProcA(    [in] WNDPROC lpPrevWndFunc,  64位参数  [in] HWND    hWnd, 64位参数,VBA中可用Byref Any类型  [in] UINT    Msg,  32位参数,这个只能用byval long。建议回调时这个参数就直接弃用,参数不够用可以用数组或结构的形式传递  [in] WPARAM  wParam, 64位参数,VBA中可用Byref Any类型  [in] LPARAM  lParam 64位参数,VBA中可用Byref Any类型);


返回值LRESULT 是64位
typedef LONG_PTR LRESULT
#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif


注意回调函数的原型
LRESULT CALLBACK WNDPROC (HWND, UINT, WPARAM, LPARAM);
VBA中可以这样
LONGPTR WNDPROC (HWND as longptr,byval UINT as long, WPARAM as variant, LPARAM as variant);


如果还出错可以弄个简单的例子发出来,我帮忙研究一下。

TA的精华主题

TA的得分主题

发表于 2021-12-22 09:08 | 显示全部楼层
不错,封装永无止境,如果有止境,那就是人人都能写代码。

TA的精华主题

TA的得分主题

发表于 2022-7-23 08:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
有没有类似pandas的合并两个表的数据,左合并 右合并 交叉合并 concat  concat join append
和分类聚合 透视表这些功能

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-23 08:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
天道酬勤y 发表于 2022-7-23 08:08
有没有类似pandas的合并两个表的数据,左合并 右合并 交叉合并 concat  concat join append
和分类聚合 透 ...

坛友没有看首页的教程啊
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-26 08:10 , Processed in 0.039853 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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