Forms 如何有条件地停止访问VBA代码?

Forms 如何有条件地停止访问VBA代码?,forms,ms-access,vba,procedure,Forms,Ms Access,Vba,Procedure,所以我在Access中创建了一个表单,它有一个组合框和一个文本框。表单在按下按钮后计算一些内容,但组合框和文本框都必须填充,或者两者都不能填充。我想做的是将其置于一个条件中,这样,如果只填充了其中一个,则会弹出一个消息框,解释如何填充这两个框,然后继续停止代码。我知道如何做消息框部分,但现在它显示消息框,然后继续执行产生错误的代码 我做了一些研究,但我发现大部分都与暂时暂停表单有关,而不是完全停止表单 关于如何做到这一点,我有一些想法,但我在执行这些想法时遇到了困难,坦率地说,我甚至不确定它们是

所以我在Access中创建了一个表单,它有一个组合框和一个文本框。表单在按下按钮后计算一些内容,但组合框和文本框都必须填充,或者两者都不能填充。我想做的是将其置于一个条件中,这样,如果只填充了其中一个,则会弹出一个消息框,解释如何填充这两个框,然后继续停止代码。我知道如何做消息框部分,但现在它显示消息框,然后继续执行产生错误的代码

我做了一些研究,但我发现大部分都与暂时暂停表单有关,而不是完全停止表单


关于如何做到这一点,我有一些想法,但我在执行这些想法时遇到了困难,坦率地说,我甚至不确定它们是否有效。我的第一个计划是复制并粘贴过程中的所有计算部分,用它们创建一个新过程,在单击按钮的过程中创建一个if语句,如果新过程通过if语句,则调用新过程。我的第二个计划有点乏味,但我相当有信心它会奏效。它只是用一个if语句来包围整个代码,如果它通过了,就执行代码,如果它没有通过,就什么也不做,让它到达过程的末尾,并结束它自己。第二种方法的唯一问题是我事先有很多代码,如果我能帮上忙的话,我不想浪费大量时间重新缩进行,但是如果我找不到更好的方法,我会把它作为备份。

当你弹出消息框时,你应该能够使用Exit Sub或Exit函数,这取决于你的过程是什么。它应该停止代码的执行并退出过程。

您有几个选项:

  • 正如您所建议的,获取当前绑定到按钮单击事件的代码,并将其移动到新的子过程。在按钮单击事件中,执行验证,如果一切都通过,则调用子过程。如果没有,请显示您的messagebox
  • 假设在按钮单击事件中有正确的错误处理,则引发错误而不是显示messagebox。这将把控制流移动到过程中的错误处理程序
  • 显示消息框后,使用Exit Sub或Exit函数停止代码执行
  • 选项1可能是最好的方法,因为它促进了更好的编码实践。如果您有很长的子例程,这可能表明您需要将子例程分解为更小的工作单元,这使得代码重用和调试更加容易

    在某些情况下,如果条件确实是错误,则选项2是合适的。有人可能会说,验证测试失败是一种错误情况


    就我个人而言,我倾向于在大多数情况下避免使用Exit Sub和Exit函数(选项3),因为我喜欢在子程序中有一个单点,其中例程退出并将控制权传递回调用过程。在一个例程中有多个退出点表明您需要重构代码\重新考虑正在应用的逻辑。有时这是无济于事的,但通常会造成更难调试的情况。

    我知道已经晚了,但我想补充一点,如果您想停止运行任何VBA代码,您可以在错误处理程序中使用
    End
    。 这样它就不会返回调用的子函数(如果有)


    希望有帮助。

    我尝试过这个,但主要的问题是,由于弹出消息框只在条件下出现(即在if语句中),如果我在之后放入退出过程,则会出现错误,因为我没有关闭if语句。@KryptKeeper:使用
    退出Sub
    ,而不是
    结束Sub
    Exit Sub
    的工作原理与常规语句类似,不会给您带来麻烦。open
    If
    语句(当然,您必须在
    Exit Sub
    之后用
    End If
    关闭它)。感谢您的解决方案,它成功了!谢谢你海因茨帮我澄清了这一点!我甚至没有意识到有一个单独的退出命令。谢谢你的回复!现在问题已经解决了你的3号解决方案,虽然我会考虑改变它,使它更有效。@ KrptKistor我认为提姆把它作为第3号选项,因为它不是最好的。正如他所说,几乎总是最好有一个单一的出口点。