ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 月收入与一次性奖金的分配比例

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-10-31 18:27 | 显示全部楼层
原帖由 灰袍法师 于 2010-10-31 17:40 发表


这一段读取单元格三次,写入一次,而实际上你只需要读取一次,写入一次
arr=.value
计算arr()
最后 [F3].value=MM 即可

    If [L3] > Max Then
       Max = [L3]: MM = i
    End If
    If  < 0 The ...



请你出手写一个,谢了!

TA的精华主题

TA的得分主题

发表于 2010-11-1 17:59 | 显示全部楼层
尝试了一下,速度才提高30%,估计是楼主附件的公式太复杂了,导致读写单元格的减速效应不明显

建议楼主在我的上面的链接的基础上,增加自己的公式好了

而且我也没看懂楼主的附件跟上面连接的附件有什么不同,除了信息多了很多以外。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-1 18:23 | 显示全部楼层
原帖由 灰袍法师 于 2010-11-1 17:59 发表
尝试了一下,速度才提高30%,估计是楼主附件的公式太复杂了,导致读写单元格的减速效应不明显

建议楼主在我的上面的链接的基础上,增加自己的公式好了

而且我也没看懂楼主的附件跟上面连接的附件有什么不同, ...

































请把写好的发上来,大家交流、学习一下吗?

TA的精华主题

TA的得分主题

发表于 2010-11-1 19:44 | 显示全部楼层
看不明白,但可以肯定,这样写的代码绝对很慢,VBA快事因为可以直接处理数据.....你这样写会导致EXCEL不断的重算.和不断地读取某一单元格,而且居然要循环1200000次.能快才怪.

TA的精华主题

TA的得分主题

发表于 2010-11-1 20:06 | 显示全部楼层
原帖由 terqm 于 2010-11-1 19:44 发表
看不明白,但可以肯定,这样写的代码绝对很慢,VBA快事因为可以直接处理数据.....你这样写会导致EXCEL不断的重算.和不断地读取某一单元格,而且居然要循环1200000次.能快才怪.


如你所言,楼主的主要问题是循环次数太多,而且每次循环都读写大量单元格

其实楼主并没有做120万次循环,而且120万次循环对如今的电脑来说也就一秒钟的事情,关键还是要减少读写单元格的次数, 少一次读写,就快50%

另外,最重要的是,把循环的步长加大,基本上加大100倍,就会快100倍

附件1秒之内完成。

其实我在上面的链接,其处理手法更加合理,避免了加大步长的漏算。

因为现在的办法类似于工作表迭代,不断地增加写入单元格的值,公式计算结果,读取公式的结果
这样每次循环读写一次,已经不可能优化了

可以优化的只是降低循环的次数,但这样一来,有可能漏算某些值

如步长为1000,那么100000直接就到101000,100001到100999的值全部没有计算

而且到了最后的一步,假设是100500的总收入

那么实际上只计算了100000的所得税,要是100500刚好跨了税率区间,那么就可能不对了.

实际上,楼上附件算50500的话,两个最优值是不一致的

因为加大第二次循环的步长,等于是每月工资只能取某些值的倍数,那么就一定不会是最优值,不懂楼主为什么要算两次。

而这个第二次循环,跟第一次唯一差异就是每月工资要取整数。

[ 本帖最后由 灰袍法师 于 2010-11-1 20:30 编辑 ]

收益最大计算表 - 速度改善.rar

13.55 KB, 下载次数: 39

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-1 20:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 灰袍法师 于 2010-11-1 20:06 发表


如你所言,楼主的主要问题是循环次数太多,而且每次循环都读写大量单元格

其实楼主并没有做120万次循环,而且120万次循环对如今的电脑来说也就一秒钟的事情,关键还是要减少读写单元格的次数, 少一次读写,就 ...


学习你的代码,再一次感谢你!

TA的精华主题

TA的得分主题

发表于 2010-11-1 20:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 15楼 灰袍法师 的帖子

呵呵....大侠你误解我的意思了.....我的意思是说"EXCEL不断的重算.和不断地读取某一单元格"这个过程循环120万次.而不是单纯了For   i = 1 to  1200000
                       j=j+1
                  next
这样的过程,正如你加大步长,使   "EXCEL不断的重算.和不断地读取某一单元格"    这一过程次数减少   ,使得速度就快.

TA的精华主题

TA的得分主题

发表于 2010-11-1 20:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
嗯,楼主的第二次循环是不必要的

第一次循环算出最佳的奖金,那么每月工资 X = ( 总金额-奖金总额) / 12 即可

如果要发放整数工资,那么分别算一下 int(X) 和 roundup(X) 看哪个较好即可

TA的精华主题

TA的得分主题

发表于 2010-11-1 20:54 | 显示全部楼层
虽然看不懂,但这种单变量求最大值 用规划求解应该可以的.若然真的要用代码写的话,就得把所有的关系用代码表示,那样才有更好的速度

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-1 21:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 灰袍法师 于 2010-11-1 20:39 发表
嗯,楼主的第二次循环是不必要的

第一次循环算出最佳的奖金,那么每月工资 X = ( 总金额-奖金总额) / 12 即可

如果要发放整数工资,那么分别算一下 int(X) 和 roundup(X) 看哪个较好即可



主要是看,有几种算法,如一年收入:1、66000=4000*12+18000;2、66000=3500*12+24000
第一个方案最佳:税交最少,月收入最大!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-29 18:27 , Processed in 0.023490 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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