VBA - 冒号`:`如何在有条件的VBA代码中工作

时间:2017-02-01 15:05:48

标签: vba excel-vba excel

冒号运算符:是VBA中的语句分隔符。

但是,是否有人知道为什么前三个例子有效,第四个(未注释时)产生错误?

Option Explicit

Public Sub TestMe()

    If 1 = 1 Then: Debug.Print 1

    If 2 = 2 Then Debug.Print 2

    If 3 = 3 Then:
        Debug.Print 3

'   Gives error:
'    If 4 = 4 Then
'        Debug.Print 4

'Other Examples, from the comments and the answers:

::::::::::::::::::::::::::::         '<-- This seems to be ok

    If 5 = 5 Then Debug.Print "5a"::: Debug.Print "5b"
    If 6 = 0 Then Debug.Print "6a"::: Debug.Print "6b"

    If 7 = 0 Then:
        Debug.Print 7 ' Does not have anything to do with the condition...

    If 8 = 0 Then Debug.Print "8a"::: Debug.Print "8b" Else Debug.Print "8c"

End Sub

2 个答案:

答案 0 :(得分:12)

我认为混淆来自3。我们认为34的行为应该相同。事实上,3等同于:

If 3 = 3 Then: (do nothing) 'an empty statement
   Debug.Print 3 ' <-- This will be executed regardless of the previous If condition

要查看它,请将3更改为:

If 3 = 0 Then:
    Debug.Print 3 '<-- 3 will be printed! ;)

总之,是的,:确实是在一行上合并许多陈述

干得好@Vityata !!! :)

答案 1 :(得分:3)

如果Then Blocks需要匹配的End If它们是多行的。

第一种情况很好,因为Then之后的命令在同一行。

第二种情况没错,出于同样的原因,:在这种情况下没有任何区别。

第三种情况有效,因为当IF语句的计算结果为True时,&#39;后面没有命令:&#39;。 :向编译器发出信号,告知下一个命令应该在同一行上。没有任何跟随,因此处理移动到下一行,这被视为在If Then Block之外。

第四种情况没有告诉编译器If Then命令是单行,因此它正在寻找块的结束IF。

Option Explicit

Public Sub TestMe()

  If 1 = 1 Then: Debug.Print 1 '<-- All on a single line - OK

  If 2 = 2 Then Debug.Print 2  '<-- All on a single line - OK

  If 3 = 3 Then:               '<-- No command following :
    Debug.Print 3              '<-- Seen as outside the If Then Block

'   Gives error:
'    If 4 = 4 Then
'        Debug.Print 4
'    End IF                   '<-- Required to show the end of the If Then block
End Sub