从选择案例返回值
Posted
技术标签:
【中文标题】从选择案例返回值【英文标题】:return value from select case 【发布时间】:2016-04-12 18:49:19 【问题描述】:如何从Select Case
语句中的表达式中获取值?
当我们编写select case
语句时,我们被告知最好的做法是在末尾加上case else
。我理解这样做的目的是,如果我们不考虑所有可能的情况,有一种方法可以通知我们,而不是继续前进。通常在这种情况下我只使用debug.assert
,它非常适合个人调试,有时对于交付后的某些最终用户来说已经足够了。
当我写信给 VBE 时,这不起作用,因为在调用 VBE 后的任何时候都不支持中断。我意识到我可能会先卸载 VBE 对象,然后再卸载 debug.assert
,但如果情况与我正在读/写到 VBE 的内容有关,那就违背了暂停我的代码的目的。
在我看来,最简单的解决方案是msgbox TheUnexpectedResultFromMyExpression
,但我不知道怎么称呼它。第二个最简单的解决方案似乎是对我的用户可能会或可能不会做的事情,以及他们何时以及如何做这件事有充分的预知。我也一直在努力,所以如果你不知道如何返回值,那么也许你有一些关于全知的技巧。
我知道,在大多数情况下,我可以简单地将表达式本身复制到 case else
内的 msgbox ...
,但我碰巧正在处理基于返回设置的决策树的情况一个对象,我对这样做两次不感兴趣。另一种选择可能是只使用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 语句运行时,它可能会在即时窗口中打印表达式的值(我提到的解决方法),我知道我可以对 msgbox
或变体或其他任何东西做同样的事情,但它会运行再次代码。是的,正如我上面已经提到的,我可以(在这种情况下)将值分配给 long,然后在 long 上运行 Select Case
,但该选项并不能解决我的应用程序中的问题。以免这成为我们讨论使用 VBE 对象的优点的对话,或者试图让我问一个不同的问题,即为什么我会得到意外的值(我不是,我正试图计划在运行时进行干净的调试),或者有人问我为什么不能让代码更简单易用,而不是几万行代码再写一千多行代码,那是因为我有一个客户端。他们为他们想要的东西买单。
所以,回到原来的问题,我只想知道如何从select case
表达式返回值。如果您是超级英雄,并且可以在调用 VBE 后让代码暂停,那么请务必回答该问题,而不是回答这个问题。
【问题讨论】:
".. 我们被告知最好的做法是在最后有一个案例。"这当然取决于。 “我可以(在这种情况下)将值分配给 long,然后在 long 上运行 Select Case,但该选项不能解决我的应用程序中的问题。” - 为什么不呢?这正是只运行一次语句的方法。如果这对您不起作用,也许您应该解释您的实际问题? 上面的 "(in this case)" 指的是示例。不是我的实际项目。我的实际问题是我需要返回select case
语句的表达式的值。该值保存在内存中,显然,我想访问它。如果答案是“这在 VBA 中是不可能的”,那么这就是我想要的答案,有一个来源:而不是“为什么有人想要那个,证明你真的想要你想要的”。
既然你问了,是的,恕我直言,你的问题中有太多令人分心的信息(我们在这里称之为“绒毛”)。最好只有第一行和一个简短的代码示例。其余的困惑来自这样一个事实,即(可能)很少有人问过自己或他人这个问题——因为(见我的回答)。
【参考方案1】:
答案是:你不能。
抱歉,没有来源,除了Select Case
的多个描述,例如MSDN,如果存在此功能,会提及它。
这是一个相当不寻常的问题,这是造成 cmets 混乱的原因之一。您正在寻找“元”变量或方法,例如 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
确实是,也是唯一的解决方案。
【讨论】:
我不情愿地接受这个答案。 :) 说实话,我们是通过代码中的选择案例编写 VBE 中的选择案例并与之交互的。我真的不想让它变得更复杂,但由于这个问题是由希望拥有干净的代码和正确的调试过程引起的,我想了更多,并决定我们可以添加更多行(代码,我们的 VBE 代码)正在写作和日志),以使我在一年内更容易理解。【参考方案2】:我刚刚写了这个,也许它会有所帮助?
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
【讨论】:
正如我最初提出的问题,让我的日志更加繁忙并不是理想的解决方案......但也许它是唯一可能的解决方案?顺便说一句,如果您使用的是debug.print
,为什么不直接使用debug.print stuff
?
你可以想象,如果我在调用 VBE 后在 select case 语句中得到了意想不到的值,那么有多个移动部分,我需要很多行 debug.print
语句来显示所有内容这可能会影响我的表达式值。
好问题......我经常用 debug.print 替换 MsgBox。那样可能更明智,哈哈无论哪种方式,我都很快输入了我的原始回复(而且你也没有真正让我继续下去)。无论哪种方式,您最终都会得到一些丑陋的东西,请参阅我编辑的回复。
有时添加大量的 debug.print 行会变得丑陋且超级乏味,直到您查明问题为止,但它有时是必要的邪恶
显然我不清楚。我现在在Select Case
语句中没有问题,我正在尝试使用良好的调试实践以防万一。所以,我并不是要添加行来解决问题(当然,当这种情况发生时,事情会变得非常丑陋),我的意思是每次运行程序时都会运行的日志,包括分发后。以上是关于从选择案例返回值的主要内容,如果未能解决你的问题,请参考以下文章