ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 342|回复: 3

[原创] 异步多线程求解子集和问题的UDF函数插件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-12-2 18:08 | 显示全部楼层 |阅读模式

如题,在各路AI的帮助下做了个基于ExcelDNA框架的插件,主要是用于求子集和,特点如下:


插件包含两个主要函数,其中SubsetSum用于常规子集和求解,即求和为定值的多个数:

1.核心算法采用经典的回溯+剪枝方案;

2.通过UDF函数方式(类似用VBA中的function类自定义函数,而非sub过程)实现,以便在任何excel文件中快速调用;

3.采用ExcelDNA的异步函数接口,在计算过程中excel的UI界面不会卡死,计算过程中不影响其他操作(尽管如此,依然不推荐在计算过程中操作该函数所在的工作表);

4.支持多线程模式,在本人的12700H笔记本上对于同样的测试样本多线程较单线程模式约快5倍;且在默认的自适应模式下会根据计算量自动在单线程与多线程模式间切换;

5.支持通过参数设定返回的解的个数、计算持续时间、是否考虑负数、解包含的数字上限、容错度、返回值的方式、缓存与否等;

另一个实验性的AutoReconcile函数基于SubsetSum的核心算法,用于处理多对多的数字核对,比如账务核对:

1.该函数可用的前提是:需要核对的往来双方的多数账项是1对1匹配的,1对多的情况较少,多对多的情况很少,如果1对多和多对多的情况很多,计算量会过大,难以在合理时间内完成;

2.在此前提下,函数会首先通过单线程计算找出1对1的组合,在剩下的数字中查找1对多的组合,最后尝试以多线程方式在最终剩下的数字中查找多对多的组合;

3.函数支持以常规UDF的形式返回结果,即返回标记符到函数所在的单元格并溢出到周边单元格,同一列内标记符序号相同的数值之和与对方列相同标记符数值之和一致;或者将上述标记符直接返回到原数列的右侧;或者将符合条件(匹配或者不匹配)的数据直接在原位置以单元格底色标记出来

此外插件内还包含其他一些实验性质的UDF函数,比如中英文数字大写转换、快速提取特定字段列等,全部可用函数可以在公式选项卡-插入函数-选择类别-EXDNA Add-in内查询。

使用方法:在excel的ribbon菜单空白处呼出右键菜单,单击“自定义功能区”,选择显示“开发工具”选项卡。然后在开发工具选项卡中单击“Excel加载项”,选择此前下载的对应版本xll文件加载即可。

提供.Net Framework 4.8.1和.Net6.0及32/64bit合计4个版本,.Net Framework版可在win10及以上系统直接使用(excel的32/64bit版本必须对应);.Net6.0需要从微软官网下载安装.Net运行时(向前兼容.Net6-.Net10,下载最新的.Net10即可)。两个版本功能一致,不过本人实测在使用SubsetSum函数时.Net10比.Net Framework快10%-15%。

dotnet10运行时


上述所有插件均仅在Microsoft Excel 64bit版上测试通过,WPS不保证能用。同时由于用到了动态数组功能,应该只能用于office 2019以上版本或者office 365。


欢迎各位试用,有问题随时反馈。

EXDNA-net6.0.7z (951.6 KB, 下载次数: 15)
EXDNA-framework481.7z (588.87 KB, 下载次数: 7)


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-12-2 22:27 | 显示全部楼层
学习了,有什么.net加密工具?

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-12-3 10:40 | 显示全部楼层
逍遥爱迪生 发表于 2025-12-2 22:27
学习了,有什么.net加密工具?

我没有加密混淆,自己写着好玩的。在exceldna的官方论坛里作者表示未来打算逐步支持aot,这样不仅性能更好也更不容易被反编译

TA的精华主题

TA的得分主题

 楼主| 发表于 2025-12-5 18:33 | 显示全部楼层

2025.12.05 v1.1更新:

1.优化了多线程模式下的任务分配方式,函数中新增了“多线程循环展开层数”参数,可以手动指定前几轮递归的展开层数以尽量避免不同线程间的负载不均问题。默认展开层数为2,在候选数字较多的情况下如将展开层数设置为2-3,与此前的方案相比提速80%-120%;

2.略微调整了递归主体函数的剪枝顺序,现在在某些情况下用单线程模式求解速度会比之前快20%左右,但是同样的调整对多线程几乎没有效果,原因不明;

3.将SubsetSum注册为了可供VBA调用的事件(event),并借助新版ExcelDNA框架的机制在加载本xll插件的同时自动暴露相应的COM接口。VBA程序可通过订阅事件调用该函数异步完成指定运算并以回调方式返回结果,计算过程中前台不卡死。

4.附件包括基于v1.1的演示文档,分为包含vba事件调用示例的版本和仅包含UDF示例的版本。

P.S.

3其实提供了一种可选的加载项开发思路,即VBA负责需要直接操作excel的UI界面同时对性能要求不高的部分,需要高性能计算的环节则通过exceldna开发的UDF函数实现,并通过COM接口与前台的VBA代码交互,以便兼顾易用性与性能。

EXDNA1.1-framework481.rar (1022.16 KB, 下载次数: 1)

EXDNA1.1-net6.0.rar (1.47 MB, 下载次数: 2)

演示excel文件.rar (98.26 KB, 下载次数: 5)


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-10 19:18 , Processed in 0.026278 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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