在财务工作过程中,很大时候需要使用到凑数的需求,花了两三天时间认真研究了一下,本人水平也只能做代码搬运工,在用户体验上作了一下完善。完成了Excel版的凑数功能。
文章出处说明
原文在简书上发表,再同步到Excel催化剂微信公众号或其他平台上,文章后续有修改和更新将在简书上操作, 其他平台不作同步修改更新,因此建议阅读其他出处的文章时,尽可能跳转回简书平台上查看。
更新及修复
- 20180812重新修复一下函数,加入判断原始数据的小数点位数问题,原来的方式粗爆地对其乘10000,致使要凑数的数值变得虚大,一般财务的数据也就两位小数。修复后性能提升明细(凑数原理:输入的数值越大,两个数值之间的间隙越大,中间值越多,如10和20两个数,中间值有10个,但扩大10000倍后,中间值变为10万个,对底层算法影响很大)为Google的Or-Tools正名,修复后的性能不比EH差,初测貌似更快一些。
业务场景
有财务的朋友分享了一需求,开发票的过程中,需要一张发票发多个商品明细,有可能累计了许多的款项一次性给予开具发票,而同时发票又有面额最大的限制要求。
企业的每月可开发票数量也有限,故很需要有一个凑数的功能,帮助其从众多记录中抽取出部分记录,然后汇总求和得到接近或相等于发票最大开票面额。
其他的凑数场景略感觉还是有,一下子没想得太清晰,有相关的应用场景欢迎反馈补充,供后来人更多了解和使用。
功能演示
凑数的问题,涉及到规划求解类的知识,本人在数学方面造诣太浅,翻看ExcelHome论坛得知香川群子大神是这方面的专家,也无私公开了源代码,具体链接可查看:
同时顺藤摸瓜,按着这个背包算法,在师傅水晶鸡翼的指导下,得知Google的OR-Tools工具包里有同样的算法实现。抱着对Google科学家们的敬仰,学习了一点皮毛,也放到插件里使用了。
使用方式
本篇的功能,仍然采用自定义函数的方式实现,自定义函数较功能区按钮优越的地方,在前面29波中已有阐述,不再重复。
因凑数计算量大,而使用函数向导的方向输入的话,每输入一个参数都运算一遍,还有可能卡机报错等,建议使用手动输入的方式,输入两个参数。
- 参数srcRange数据源的部分,就是引用用于凑数的记录对应的数量或金额字段,最多处理4位小数点,且需要正数。
- 参数groupRange用于分组的部分,有可能不止凑一个组合,且多个组合间有可能不一定是相等的,开发此设置,方便处理各种灵活场景。
手动输入时,可利用名称功能,输入更方便,输入某个参数时,若已经定义好名称,可按F3快捷键调出粘贴名称来选择。同时函数的可读性也得到加强。
请务必输入区域时,不要全选整列数据,自定义函数没作整列的较验处理,整列选择意味着运算量是几万倍的增加,已经用到这些功能的表哥表姐们,也很必须学习好规范的Excel操作,减少不必要的麻烦和性能损耗
同样的引用的数据源,请务必保证是数字格式,最多4位小数点精度, 正数,中间没有空数据和字符等,不然函数计算会报错!
计算的结果存放在记录表的某一列中,用的是数组公式的方式返回多个值,故若需要修改删除,请使用功能区的数组函数相关的删除、数值化、选择等快捷操作。
若使用OR-TOOLS函数,在B列上可以看到更多的信息,如组名,组的大小,组的实际记录和和期望和的差异(0为无差异)
同一功能两个函数差异
EH版香川群子大神的代码,在分组的大小较大时,性能仍然保持优异,而用OR-TOOLS实现的函数,就有很大的性能瓶颈。
例如某300条记录,总和是1000,我要分一个900的组,不知道为何OR-TOOLS的函数很慢,甚至最后报超时错误(OR-TOOLS因大小太大了,做了个网络版部署,网络访问太久会超时,同时也需要有连接外网的能力)。
EH版的函数,因原代码没有太多的封装,部分细节不太会改写,故没法做成像OR-TOOLS的分组形式,其实其他额外信息,大可用透视表汇总一下组名,很快得到,也非必须的信息。
建议使用EH版的凑数函数,OR-TOOLS版可能后续其他应用场景再开发其他的函数。
总结
Excel的原生功能并非万能,虽然自带了规划求解功能,但貌似比较鸡肋的功能,经常报找不到结果,借助代码的力量,结合网络世界中一些现成的轮子,Excel的使用也能玩出很高的、很出乎意料、超越常规的事情来。
凑数功能就是其中一例,用人工的方法去做,那不是一般的累人,可能到某几年之后才能算出来的结果。大胆地去想吧,脑洞大开一下,许多的不可能将成为可能。
系列文章
关于Excel催化剂
Excel催化剂先是一微信公众号的名称,后来顺其名称,正式推出了Excel插件,插件将持续性地更新,更新的周期视本人的时间而定争取一周能够上线一个大功能模块。Excel催化剂插件承诺个人用户永久性免费使用!
Excel催化剂插件使用最新的布署技术,实现一次安装,日后所有更新自动更新完成,无需重复关注更新动态,手动下载安装包重新安装,只需一次安装即可随时保持最新版本!
Excel催化剂插件下载链接:
因插件使用VSTO开发技术完成,插件的安装需要电脑满足相关的环境配置才能运行,且需可连接外网的方式实现自动更新机制,若下载安装过程中有任何疑问或需要离线版安装等,尽量不单独私聊询问,加QQ群可高效解决(群内已汇集了VSTO开发、Powerbi技术、Sqlserver商业智能等方面的国内顶尖大牛人物,进群的好处不用多说了)
取名催化剂,因Excel本身的强大,并非所有人能够立马享受到,大部分人还是在被Excel软件所虐的阶段,就是头脑里很清晰想达到的效果,而且高手们也已经实现出来,就是自己怎么弄都弄不出来,或者更糟的是还不知道Excel能够做什么而停留在不断地重复、机械、手工地在做着数据,耗费着无数的青春年华岁月。所以催生了是否可以作为一种媒介,让广大的Excel用户们可以瞬间点燃Excel的爆点,无需苦苦地挣扎地没日没夜的技巧学习、高级复杂函数的烧脑,最终走向了从入门到放弃的道路。
最后Excel功能强大,其实还需树立一个观点,不是所有事情都要交给Excel去完成,也不是所有事情Excel都是十分胜任的,外面的世界仍然是一个广阔的世界,Excel只是其中一枚耀眼的明星,还有其他更多同样精彩强大的技术、工具等。*Excel催化剂也将借力这些其他技术,让Excel能够发挥更强大的爆发!
关于Excel催化剂作者
姓名:李伟坚,从事数据分析工作多年(BI方向),一名同样在路上的学习者。
服务过行业:零售特别是鞋服类的零售行业,电商(淘宝、天猫、京东、唯品会)技术路线从一名普通用户,通过Excel软件的学习,从此走向数据世界,非科班IT专业人士。
历经重重难关,终于在数据的道路上达到技术平原期,学习众多的知识不再太吃力,同时也形成了自己的一套数据解决方案(数据采集、数据加工清洗、数据多维建模、数据报表展示等)。擅长技术领域:Excel等Office家族软件、VBA&VSTO的二次开发、Sqlserver数据库技术、Sqlserver的商业智能BI技术、Powerbi技术、云服务器布署技术等等。
2018年开始职业生涯作了重大调整,从原来的正职工作,转为自由职业者,暂无固定收入,暂对前面道路不太明朗,苦重新回到正职工作,对Excel催化剂的运营和开发必定受到很大的影响(正职工作时间内不可能维护也不可能随便把工作时间内的成果公布于外,工作外的时间也十分有限,因已而立之年,家庭责任重大)。
和广大拥护者一同期盼:Excel催化剂一直能运行下去,我所惠及的群体们能够给予支持(多留言鼓励下、转发下朋友圈推荐、小额打赏下和最重点的可以和所在公司及同行推荐推荐,让我的技术可以在贵司发挥价值,实现双赢(初步设想可以数据顾问的方式或一些小型项目开发的方式合作)。)