Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]模仿做了一个自定义函数,怎样避免一部分结果显示为“# 错误​”?

qinghe  发表于:2021-03-20 00:43:55  
复制

Public Function HoursOD(dtmStart As Date, dtmEnd As Date) As Double
 
    Dim t As Double
    Dim tt As Double
    If IsNull(dtmStart) = True Then
        HoursOD = 0
    End If
    If IsNull(dtmEnd) = True Then
        HoursOD = 0
    End If
    If IsNull(dtmEnd) = False And IsNull(dtmEnd) = False Then
        tt = Round(Abs(DateDiff("n", dtmStart, dtmEnd)) / 60, 2)
        t = IIf(IsNull(IIf(tt > 15, 24 - tt, tt)), 0, IIf(tt > 15, 24 - tt, tt))
    End If
    HoursOD =  t
End Function
请教各位老师,
如果表中的dtmStart 或者 dtmEnd 有一项为空值,计算结果会显示“# 错误”,应该怎样修改才能让它显示为0?
谢谢!

 

Top
西出阳关无故人 发表于:2021-03-20 07:07:40

大约是这样:

...

If IsNull(dtmStart) = True Then
        HoursOD = 0

exit function    '
    End If

...

满足条件,就设置函数的返回值,同时跳出(结束)函数.

或者你把if嵌套在一起,更好理解,比如:

if isnull(a)=true then

    if isnull(b)=true then

'...

    else

'...

    end if

else

    if isnull(b)=true then

'...

    else

'...

    end if

end if



qinghe 发表于:2021-03-22 12:58:49
@西出阳关无故人老师,谢谢您的回复!按照您的指导,加了 Exit Function ,但还是一样的结果。

qinghe 发表于:2021-03-22 12:59:28


西出阳关无故人 发表于:2021-03-24 07:30:46

看看是不是你要的处理逻辑:

Public Function HoursOD(dtmStart As Date, dtmEnd As Date) As Double
    On Error GoTo er
    Dim t As Double
    Dim tt As Double
    If IsNull(dtmStart) = True Then
        'dtmStart参数为空
        HoursOD = 0
    Else
        If IsNull(dtmEnd) = True Then
            'dtmEnd参数为空
            HoursOD = 0
        Else
            tt = Round(Abs(DateDiff("n", dtmStart, dtmEnd)) / 60, 2) '得出两个时间参数的时间差,按小时计算,且保留两位小数
            '因为上面嵌套的两层if,已经排除了dtmStart,dtmEnd两个参数的任意一为为空的情况,所以上一句得出的tt肯定不为空,不需要再进行isnull()的判断
            '直接按照规则计算输出值
            If tt > 15 Then
                t = 24 - tt
            Else
                t = tt
            End If
            HoursOD = t
        End If
    End If
    Exit Function
er:
    MsgBox Err.Number & ":" & Err.Description
    HoursOD = 0
End Function





西出阳关无故人 发表于:2021-03-24 07:46:13

或者

Public Function HoursOD(dtmStart As Date, dtmEnd As Date) As Double
    Dim t As Double
    Dim tt As Double
    If IsNull(dtmStart) = True Then
        HoursOD = 0

        exit function
    End If
    If IsNull(dtmEnd) = True Then
        HoursOD = 0

        exit function
    End If
         tt = Round(Abs(DateDiff("n", dtmStart, dtmEnd)) / 60, 2)
        t =  IIf(tt > 15, 24 - tt, tt)'即使tt为〇,也不妨碍数据处理的逻辑
    HoursOD =  t
End Function



qinghe 发表于:2021-03-24 10:36:15

@西出阳关无故人老师,再次感谢您的回复
因为上传附件页面无响应,重新开了一个帖子上传了附件。
按照“西出阳关无故人”老师指导的修改结果 (accessoft.com)  <——链接 
但还是出现计算结果会显示“# 错误”的现象。



总记录:6篇  页次:1/1 9 1 :