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
确实是也是唯一的解决方案。
如何从我的 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
确实是也是唯一的解决方案。