VBA函数返回第一个值,等待,返回第二个值

时间:2020-12-22 15:08:34

标签: excel vba

我正在尝试创建一个函数来延迟 excel 发送的电子邮件警报。基本上我的策略是在两个不同的单元格同时为 1 时触发电子邮件警报。为了延迟它,在最初的电子邮件之后,计划是有一个函数将其中一个值设置为 0,这样它就不会连续发送大量电子邮件。我对 VBA 不是很熟悉,但微软的网站说这是延迟的语法。但是,此函数只返回 1 而不是 0。有没有办法解决这个问题,以便在调用时返回值 0,等待指定的时间量,然后在结束之前再次返回 1。或者有没有更好的方法来完成我想要做的事情?

谢谢

Public Function Delay_Alert() As Integer
    
    Delay_Alert = 0

    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + 10
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    Application.Wait waitTime

    Delay_Alert = 1

End Function

1 个答案:

答案 0 :(得分:2)

您的问题的字面答案如下。该代码未按预期工作,因为您设置的值仅在函数完成后返回。所以它在功能上等同于

Public Function Delay_Alert() As Integer
    
    Dim ret as Integer
    ret = 0

    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + 10
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    Application.Wait waitTime

    ret = 1
    return ret 

End Function

如您所见,ret 仅在第二次设置后才返回,函数之外的任何内容都不知道它第一次设置了。

如果没有更多信息,更广泛的问题更难回答。粗略的解决方案是将延迟放在发送电子邮件的任何函数中,或者像 Avro 在评论中建议的那样更新函数中的单元格。

Public Function Delay_Alert() As Integer
    
    Cells(2,1).Value = 0

    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + 10
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    Application.Wait waitTime

    Cells(2,1).Value = 1

End Function

但是,如果您不得不采取人为措施来阻止您的代码成为垃圾邮件机器人,那么真正的答案是解决该问题。如果您觉得这不是垃圾邮件,那么只需根据需要发送电子邮件,我相信操作系统和服务器可以应付。

编辑:- 针对评论,我建议您在触发器中添加滞后 https://en.wikipedia.org/wiki/Hysteresis#Control_systems

听起来是个有趣的项目!

相关问题