如何在Excel VBA中实现Select Case语句的穿透?

8

鉴于

Select Case cmd

    case "ONE":   MsgBox "one"

    case "TWO":   MsgBox "two"

    case "THREE": MsgBox "three"

End select

我的要求是,如果 cmd = "ONE",我需要显示 "one",然后显示"two",但目前我只能看到 "one",然后程序就跳出了选择语句...


我认为这是设计上的问题;在 case 语句中,代码会自动跳转到最后一个语句之后。你需要通过编写程序来解决它(例如使用过程)。 - Michael Todd
@Gratzy:如果cmd =“two”,它应默认打印“two”并退出...我猜这是VBA的默认行为..我认为VBA在每个case后会隐式添加“break”语句,而我想绕过它。 - Kevin Boyd
8个回答

19
Select Case cmd
    case "ONE", "TWO":   
                  if cmd = "ONE" THEN
                      MsgBox "one"
                  end if
                  MsgBox "two"

    case "THREE": MsgBox "three"

End select

我正在尝试帮助您,已经修复了。 - manji

4

一些技术可以胜任这项工作:

If cmd = "ONE" Then 
    MsgBox "one"
    cmd = "TWO"
End If
If cmd = "TWO" Then 
    MsgBox "two"
    cmd = "THREE"
End If
If Cmd = "THREE" Then 
    MsgBox "three"
End If

不错的解决方案!我会推荐这个作为答案 :) - seadoggie01

3

你只能用较长的方式来完成它。

Select Case cmd

    case "ONE":   MsgBox "one"
                  MsgBox "two"
                  MsgBox "three"

    case "TWO":   MsgBox "two"
                  MsgBox "three"

    case "THREE": MsgBox "three"

End select

3
我发现最易读且可扩展的解决方案是使用一个小型状态机。只需将 Select 包装在 While 中,并在每个 case 结尾处指定下一步骤。
While cmd <> ""
Select Case cmd
    Case "ONE"
        MsgBox  "one"
        cmd = "TWO"
    Case "TWO"
        MsgBox  "two"
        cmd = ""
    Case "THREE"
        MsgBox  "three"
        cmd = ""
End Select
Wend

1

好的!我能否做类似于输入case "ONE":进行一些处理,然后说GOTO case "TWO"或在case "TWO"语句下添加一些标签的操作? - Kevin Boyd
1
是的,但这将非常丑陋且难以调试(任何继承代码的人都不会高兴地通过“意大利面条代码”进行筛选)。 - Michael Todd

1

我认为GoTo会很有效。

Select Case cmd

    Case "ONE"
        MsgBox "one"
        GoTo AfterONE:

    Case "TWO"
AfterONE:
        MsgBox "two"

    Case "THREE"
        MsgBox "three"

End Select

它有效;我已经测试过。


0
为什么要使用Select Case来完成这个任务?你所做的只是打印出“cmd”值的小写版本。
If cmd = "ONE" Then
  MsgBox LCase$(cmd)
  MsgBox "two"
Else
  Msgbox LCase$(cmd)
End If

实际上,我只是为了描述目的而显示小写字母,在实际情况下会有代码编写在这些情况下...我想要的条件是,如果程序通过cmd =“ONE”进入,则应执行“ONE”中的一些代码,然后落到“TWO”中... - Kevin Boyd

0

在C/C++中,非空Case语句中的“Fall through”是错误的主要来源,因此大多数其他语言(包括VBA)都没有实现它。因此,如其他地方所述,请采用冗长的方式并考虑过程调用以避免重复。

然而,如果像我一样,您来到这个页面是因为您不记得如何进行的drop-through,则可以对已接受答案进行轻微变化,即可以(与所有VBA命令一样)使用下划线表示继续到下一行:

Select Case cmd
Case "ONE", _
     "TWO":   
    if cmd = "ONE" Then MsgBox "one"
    MsgBox "two"
Case "THREE":
    MsgBox "three"
End select

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接