-2

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

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

当我写信给 VBE 时,这不起作用,因为在调用 VBE 后的任何时候都不支持中断。我意识到我可能会先卸载 VBE 对象,然后再卸载debug.assert,但是如果情况与我正在读/写到 VBE 的内容有关,那将违背暂停我的代码的目的。

在我看来,最简单的解决方案是msgbox TheUnexpectedResultFromMyExpression,但我不知道如何调用它。第二个最简单的解决方案似乎是对我的用户可能会或可能不会做的事情,以及他们何时以及如何做这件事有充分的预知。我也一直在努力,所以如果你不知道如何返回值,那么也许你有一些关于全知的技巧。

我知道,在大多数情况下,我可以简单地将表达式本身复制到msgbox ...inside 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 语句运行时,它可能会在即时窗口中打印表达式的值(我提到的解决方法),并且我知道我可以对 a msgboxor 变体或其他东西做同样的事情,但它会再次运行代码。是的,正如我上面已经提到的,我可以(在这种情况下)将值分配给 long 然后运行Select Case从长远来看,但该选项并不能解决我的应用程序中的问题。以免这成为我们讨论使用 VBE 对象的优点的对话,或者试图让我问一个不同的问题,为什么我会得到意外的值(我不是,我正试图计划在运行时进行干净的调试),或者有人问我为什么不能让代码更简单易用,而不是几万行代码再写一千多行代码,那是因为我有一个客户端。他们为他们想要的东西买单。

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

4

2 回答 2

1

答案是:你不能。

对不起,没有来源,除了多个描述Select Case,例如MSDN ,如果这个功能存在,它提到它。

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

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

所以

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

确实唯一的解决方案。

于 2016-04-15T17:28:25.113 回答
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
于 2016-04-12T19:17:51.827 回答