选择案例

时间:2016-04-12 18:49:20

标签: vba excel-vba access-vba select-case excel

如何从Select Case语句中的表达式中获取值?

当我们写select case语句时,我们被告知良好的做法是最后有一个case else。我理解这样做的目的是,如果我们不考虑所有可能的情况,有办法通知我们而不是继续前进。通常我只是在这种情况下使用debug.assert,这对于个人调试很有用,有时对于某些最终用户来说已经足够了。

当我写VBE时,这不能很好地工作,因为在VBE被调用后的任何时候都不支持中断。我意识到我可以卸载VBE对象,然后debug.assert,但是如果案例与我正在阅读/写入VBE的情况有关,那就会导致暂停我的代码。

在我看来,最简单的解决方案是msgbox TheUnexpectedResultFromMyExpression,但我不知道怎么称呼它。第二个最简单的解决方案似乎是对用户可能做或不做的事情以及他们何时以及如何做到这一点有充分而完整的预见。我一直在努力,所以如果你不知道如何返回价值,那么也许你有一些关于全知的提示。

我知道,在大多数情况下,我可以简单地将表达式本身复制到msgbox ...内的case else,但我碰巧正在处理一个基于决策树的案例返回设置对象,我对这两次做不感兴趣。另一种选择可能只是myVariable=<expression>select case myVariable而不是select case <expression>,然后在每debug.print myVariable之前始终select case,但我的日志已经很忙了,在一个更大的项目中,这意味着我必须购买另一台显示器,而我现在正在努力购买杂货。

在这里询问似乎更容易。感谢。

编辑:

对于那些似乎很难理解我想要问的人,我尽可能地简化了代码。显然,下面的内容并不是非常有用,但你明白了。

Select Case Forms("Form1").Module.CreateEventProc("Click", Forms("Form1").Controls("label0").Name)
Case 1
    Debug.Print "line1"
Case 2
    Debug.Print "line2"
Case Else
    Debug.Print Forms("Form1").Module.CreateEventProc("Click", Forms("Form1").Controls("label0").Name)
End Select

当我的Case Else语句运行时,它可以在即时窗口中打印表达式的值(我提到的解决方法),并且我知道我可以使用msgbox或变体或其他任何方式执行相同操作,但是它再次运行代码。是的,正如我上面提到的,我可以(在这种情况下)将值分配给long,然后在long上运行Select Case,但该选项不能解决我的应用程序中的问题。并且,为了避免这成为我们讨论使用VBE对象的优点的对话,或者试图让我问一个不同的问题,为什么我会得到意想不到的值(我不是,我正在尝试计划在运行时进行干净的调试),或者有人问我为什么我不能让代码更简单,更容易使用,而不是成千上万行代码编写另外一千多行代码,这是因为我有一个客户端。他们付出了他们想要的东西。

所以,回到原始问题,我只想知道如何从select case表达式返回值。如果你是一个超级英雄,并且可以在调用VBE后让代码暂停,那么无论如何都要回答这个问题。

2 个答案:

答案 0 :(得分:1)

答案是:你做不到。

很抱歉,除Select Case的多个说明外,没有任何来源,例如MSDN,如果此功能存在,提及它。

这是一个相当不寻常的问题,这是评论中混淆的一个原因。您正在寻找一个“元”变量或方法,如T-SQL中的@@IDENTITY。但这对于VBA Select Case来说并不存在。

以及不需要它的原因:您可以完全控制testexpression部分中的Select。通常的方式,我实际上认为这个良好的编程实践,总是将任何类型的复杂表达式或方法调用(如CreateEventProc)分配给变量,然后将此变量用于Select Case。 / p>

所以

LineNr = Forms("Form1").Module.CreateEventProc("Click", Forms("Form1").Controls("label0").Name)

Select Case LineNr 
    Case <expected values>
        ' do something useful
    Case Else
        Debug.Print "Whoa, unexpected LineNr: " & LineNr
End Select

实际上是 和唯一的解决方案。

答案 1 :(得分:0)

我刚写了这个也许有帮助吗?

Private Sub mystuff()
Dim stuff As String


Select Case stuff
    Case Is = "Mine"
        stuff = "yours "
    Case Is = "Not yours"
        stuff = "his "
    Case Else
        stuff =  "Hers"
    End Select

    debug.print "stuff"; stuff    

End Sub