Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: jiangslly

[已解决]帮忙修改下自定义函数

[复制链接]
发表于 2011-8-11 16:17 | 显示全部楼层
回复 jiangslly 的帖子

弄点数据和结果说明,两个附件打包在一起,然后传上来看看
回复

使用道具 举报

 楼主| 发表于 2011-8-11 16:18 | 显示全部楼层
回复 无聊的疯子 的帖子

见附件1就是这个,里面自定义函数以及汇总代码都有了

工资计算模板.rar

25.42 KB, 下载次数: 6

回复

使用道具 举报

发表于 2011-8-11 16:38 | 显示全部楼层
回复 jiangslly 的帖子

用了那么多自定义函数,为何不用事件??速度比你那个要快得多,你的循环代码太多了,可以考虑使用数组来循环,每次写入一个值都要计算1秒钟左右
回复

使用道具 举报

 楼主| 发表于 2011-8-11 16:41 | 显示全部楼层
回复 无聊的疯子 的帖子

那你看怎么解决为好?如果用事件,可以写一段代码让我参考下吗?谢谢啦
回复

使用道具 举报

 楼主| 发表于 2011-8-11 16:47 | 显示全部楼层
回复 jiangslly 的帖子

你看这个附件吧,以这个为准,自定义函数已经根据的想法改过了

工资计算模板.zip

24.7 KB, 下载次数: 6

回复

使用道具 举报

发表于 2011-8-11 17:11 | 显示全部楼层
本帖最后由 无聊的疯子 于 2011-8-11 17:15 编辑

回复 jiangslly 的帖子

简单函数就能完成的为什么还要去写复杂的自定义函数呢??得不尝失啊!

以第三行为例:
你的 V 列(应付工资)中的自定义函数ADW()可以使用 =sum(N3:U3)

W列(应交所得税额)自定义函数 ITP()  可使用 =V3-SUM(Q3,Z3,2000) 或 =SUM(-V3,Q3,Z3,2000)*-1

AD列(实付工资)自定义函数netpay() 可使用 =ROUND(V3-SUM(X3:AC3),1)

AC列(个人所得税) PIT(W3) 保留

然后再运行你的汇总就没事了

回复

使用道具 举报

 楼主| 发表于 2011-8-11 17:21 | 显示全部楼层
回复 无聊的疯子 的帖子

非常谢谢你,有没有其他更好的办法?比如后面也用代码运行,我就是不想看到函数在工作表里面
回复

使用道具 举报

发表于 2011-8-11 17:31 | 显示全部楼层
jiangslly 发表于 2011-8-11 17:21
回复 无聊的疯子 的帖子

非常谢谢你,有没有其他更好的办法?比如后面也用代码运行,我就是不想看到函数在 ...

不想看到函数在工作表里可采用 保护工作表方法

设置单元格格式》保护》隐藏(勾选)》然后保护工作表  就行了

还有就是用VBA写代码,而不是写自定义函数,因为自定义函数太多会引起运行速度很慢!你可以在你的表里打开汇总代码用F8测试,每个自定义函数都会运行一次或者多次,这就会造成运行时间加长!

如果你学VBA只是用来做这么简单(得不尝失)的事情的话,那还不如花点时间好好学下函数!!

另外,要重新写代码就得知道你的表是怎么录入信息的,现在这个表只能写个汇总代码,工资表中的代码只有知道了操作方法后才能写!
回复

使用道具 举报

 楼主| 发表于 2011-8-11 17:32 | 显示全部楼层
回复 无聊的疯子 的帖子

可以了,为什么有多个自定义函数的时候会变成零?一个自定义函数却不会呢,有个人告诉我自定义函数加入参数,参数指定单元格区域或对单元格进行引用,但是我想不出好办法来,哎
回复

使用道具 举报

 楼主| 发表于 2011-8-12 12:17 | 显示全部楼层
回复 无聊的疯子 的帖子

Private Sub Worksheet_Change(ByVal Target As Range)
   For r = 3 To 112
     If Target.Column = 8 And Cells(r, 8) = "" Then
     Exit Sub
        Else
           End If
    Next
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim r As Integer
    For r = 3 To 112
    If Target.Column = 8 And Cells(r, 8) <> 0 Then
   
      Cells(r, 30).Value = Val(Cells(r, 22)) - Val(Cells(r, 24)) _
- Val(Cells(r, 25)) - Val(Cells(r, 26)) _
- Val(Cells(r, 27)) - Val(Cells(r, 28)) _
- Val(Cells(r, 29))
      Cells(r, 22).Value = Cells(r, 14) + Cells(r, 15) _
+ Cells(r, 17) - Val(Cells(r, 16)) _
+ Val(Cells(r, 19)) + Val(Cells(r, 20)) _
+ Val(Cells(r, 21)) + Val(Cells(r, 18))
      Cells(r, 23).Value = Val(Cells(r, 22)) _
- Val(Cells(r, 17)) _
- Val(Cells(r, 26)) - 2000
   
       End If
       Next
End Sub

这位大哥,你看我写的这个change事件,为什么运行不了,麻烦帮我看下问题出在哪里好吗?

回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-26 13:58 , Processed in 0.426059 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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