Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1650|回复: 5

[已解决]自己编的VBA自定义函数 有点小问题求帮助

[复制链接]
发表于 2016-5-21 13:09 | 显示全部楼层 |阅读模式
本帖最后由 d346836673 于 2016-5-21 13:49 编辑

一组数据取三个测值的平均值   当三个测值的最大值或最小值中 ,如有一个与中间值的差值超过中间值的15%时,则把最大值和最小值一并舍除,取中间值;    如有两个测值与中间值的差值均超过中间值的15%时,无效      自定义函数是中文    抗压     意思是  抗压(a#,b#,c#,d&)判断abc三个数  保留d位小数




Function 抗压(a#, b#, c#, d&) As Double
              If Application.And(Application.Max(a, b, c) / Application.Median(a, b, c) > 1.15, Application.Median(a, b, c) / Application.Min(a, b, c) > 1.15) Then
                           抗压 = "无效"
        ElseIf Application.Or(Application.Max(a, b, c) / Application.Median(a, b, c) > 1.15, Application.Median(a, b, c) / Application.Min(a, b, c) > 1.15) Then
                           抗压 = Round(Application.Median(a, b, c), d)
        Else
                           抗压 = Round(Application.Average(a, b, c), d)
        End If
End Function
              
最佳答案
2016-5-21 23:04
原因:因为返回值可能是文本,所以不可以定义成Double。
解决:函数返回值不定义成Double就行了。
这么写好查看些。



Function ky(a#, b#, c#, d#) As Variant
    Dim max, med, min, avg, tj1, tj2   

    max = Application.max(a, b, c)
    med = Application.median(a, b, c)
    min = Application.min(a, b, c)
    avg = Application.Average(a, b, c)
    tj1 = max / med > 1.15
    tj2 = med / min > 1.15

    Select Case tj1 + tj2
    Case 0
        ky = Round(avg, d)
    Case -1
        ky = Round(med, d)
    Case -2
        ky = "无效"
    End Select
End Function

256.rar

14.57 KB, 下载次数: 6

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-5-21 23:04 | 显示全部楼层    本楼为最佳答案   
原因:因为返回值可能是文本,所以不可以定义成Double。
解决:函数返回值不定义成Double就行了。
这么写好查看些。



Function ky(a#, b#, c#, d#) As Variant
    Dim max, med, min, avg, tj1, tj2   

    max = Application.max(a, b, c)
    med = Application.median(a, b, c)
    min = Application.min(a, b, c)
    avg = Application.Average(a, b, c)
    tj1 = max / med > 1.15
    tj2 = med / min > 1.15

    Select Case tj1 + tj2
    Case 0
        ky = Round(avg, d)
    Case -1
        ky = Round(med, d)
    Case -2
        ky = "无效"
    End Select
End Function

评分

参与人数 1 +1 收起 理由
d346836673 + 1 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-5-22 09:50 | 显示全部楼层
爱疯 发表于 2016-5-21 23:04
原因:因为返回值可能是文本,所以不可以定义成Double。
解决:函数返回值不定义成Double就行了。
这么写 ...

谢谢版主,你帮了我大忙了,现在工作效率提高了不少,excel打开速度也快了不少。因为以前用的是函数,当工作簿多了运行很慢所以想到了  VBA   由于自己是刚接触所以不是很懂。


还能请教个问题么!
Function ky(a#, b#, c#, d#) As Variant
     Dim max, med, min, avg, tj1, tj2

     max = Application.max(a, b, c)
     med = Application.Median(a, b, c)
     min = Application.min(a, b, c)
     avg = Application.Average(a, b, c)
     tj1 = max / med > 1.15
     tj2 = med / min > 1.15                       这段我能懂


Select Case tj1 + tj2
     Case 0
         ky = Round(avg, d)
     Case -1
         ky = Round(med, d)
     Case -2
         ky = "无效"                                                这段不是很懂可以解释哈么!
回复

使用道具 举报

发表于 2016-5-22 10:01 | 显示全部楼层
d346836673 发表于 2016-5-22 09:50
谢谢版主,你帮了我大忙了,现在工作效率提高了不少,excel打开速度也快了不少。因为以前用的是函数,当工 ...

Sub test2()
    Debug.Print True + True         '返回-2
    Debug.Print True + False        '返回-1
    Debug.Print False + True        '返回-1
    Debug.Print False + False       '返回0
End Sub


运行后可发现,2个逻辑变量,存在3种不同的结果 0,-1,-2。
其中,第2句和第3句的结果相同。

最后,对应这3种,通过select case语句,指定对应的处理方式。
当然,也可以用if语句指定。
回复

使用道具 举报

 楼主| 发表于 2016-5-22 17:25 | 显示全部楼层
爱疯 发表于 2016-5-22 10:01
Sub test2()
    Debug.Print True + True         '返回-2
    Debug.Print True + False        '返回 ...

再次谢谢啦 !!!有点懂了    。 我会if 和 iif 但不是很多,正在学习中  。。。
回复

使用道具 举报

发表于 2016-5-24 07:26 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 05:00 , Processed in 0.302715 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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