return 个值来自 select 个案例

return value from select case

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

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

当我写入 VBE 时,这并不适用,因为在调用 VBE 后任何时候都不支持中断。我意识到我可能会卸载 VBE 对象,然后 debug.assert,但是如果这种情况与我对 VBE reading/writing 的情况有关,那会破坏暂停我的代码的目的。

在我看来,最简单的解决方案是 msgbox TheUnexpectedResultFromMyExpression,但我不知道如何称呼它。第二个最简单的解决方案似乎是对我的用户可能做什么或不做什么,以及他们何时以及如何做有充分和完整的先见之明。我也一直在研究这个,所以如果你不知道如何 return 这个值,那么也许你有一些关于无所不知的技巧。

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

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

编辑:

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

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 语句 运行s 时,它可能会立即打印表达式的值(我提到的解决方法)window,我知道我可以用一个msgbox 或变体或其他任何东西,但它又是 运行 代码。是的,正如我上面已经提到的,我可以(在这种情况下)只将值分配给长,然后 运行 长上的 Select Case,但该选项不能解决问题我的应用程序。以免这成为我们讨论使用 VBE 对象的优点的对话,或者试图让我问一个不同的问题,为什么我会得到意外的值(我不是,我正试图计划在 运行time),或者有人问我为什么不能直接把代码做的更简单好用,而不是几万行代码写另外一千+行代码,就是因为我有客户。他们为他们想要的付出代价。

所以,回到最初的问题,我只想知道如何 return 来自 select case 表达式的值。如果您是超级英雄,并且可以让代码在调用 VBE 后暂停,那么一定要回答这个问题,而不是回答这个问题。

我刚刚写了这个,也许它会有帮助?

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

答案是:不能。

抱歉,没有来源,除了 Select Case 的多个描述,例如MSDN,如果此功能存在,提及它。

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

不存在

以及不需要它的原因:您可以完全控制 Select 部分中的 testexpression。通常的方法,我实际上认为这是一个很好的编程习惯,总是将任何类型的复杂表达式或方法调用(如 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

确实是也是唯一的解决方案。