【发布时间】:2025-12-25 08:50:12
【问题描述】:
如何从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 中是不可能的”,那么这就是我想要的答案,有一个来源:而不是“为什么有人想要那个,证明你真的想要你想要的”。 -
既然你问了,是的,恕我直言,你的问题中有太多令人分心的信息(我们在这里称之为“绒毛”)。最好只有第一行和一个简短的代码示例。其余的困惑来自这样一个事实,即(可能)很少有人问过自己或他人这个问题——因为(见我的回答)。
标签: excel ms-access vba select-case