VBA:具有多个操作的单行 if 语句

Posted

技术标签:

【中文标题】VBA:具有多个操作的单行 if 语句【英文标题】:VBA: Single line if statement with multiple actions 【发布时间】:2019-04-23 12:36:19 【问题描述】:

我真的应该可以谷歌这个,但我找不到我想知道的。

我想检查一个文件是否存在。如果没有,应该弹出一个 MessageBox 并且 VBA 应该退出 sub。

If Dir("C:\file.txt", vbDirectory) = "" Then 
    MsgBox "File doesn't exist"
    Exit Sub
End If

它有效,我只是想知道您是否可以在单行语句中执行此操作?当不止一件事应该发生时(就像这里的情况一样),VBA 是否允许这样做?此代码不起作用(语法错误):

If Dir("C:\file.txt", vbDirectory) = "" Then  MsgBox "File doesn't exist" And Exit Sub

【问题讨论】:

个人意见:我不认为为了更紧凑的代码而牺牲代码可读性是值得的。因此,虽然这里可能很好,但我不建议将您的整个代码转换为单行代码 我同意@Rawrplus - 它让人很难阅读而没有收获 要进一步补充我的评论 - 如果您想缩短代码以提高可读性,那么不要。当你有 20k 行代码时,在结构上将代码划分为类别,按逻辑结构创建单独的模块等等。但是代码首先应该总是非常全面,只有在美学上令人愉悦。相信我,在重新访问代码时,您的同事、测试人员和未来的自己都会感谢您 我认为您要查找的关键字是“三元运算符” 肯定不会在条件语句中内联提前返回。退出是应该在任何编程语言中脱颖而出的东西。使用四行版本。任何阅读您的代码的人都会为您所做的感到高兴。 【参考方案1】:

你绝对可以!

If Dir("C:\file.txt", vbDirectory) = "" Then  MsgBox "File doesn't exist" : Exit Sub

【讨论】:

【参考方案2】:

If 声明 does already support single-line syntax。 简单来说,这意味着我们可以:

    If boolean-expression Then
       execution
    End If
    
    If boolean-expression Then execution
    
    注意第二个选项缺少End If,因为它在单行语法中被完全省略 还要记住,执行块只能包含一条语句

然后,将代码连接在一起的另一种方法是使用:,它在编译器中充当新行

这是在变量声明中相当普遍的做法:

Dim x As Integer: x = 42

现在,让我们一起应用这些步骤:

    原代码

    If Dir("C:\file.txt", vbDirectory) = "" Then 
       MsgBox "File doesn't exist"
       Exit Sub
    End If
    

    应用 单行 If 语法

    If Dir("C:\file.txt", vbDirectory) = "" Then MsgBox "File Doesn't Exist"
    Exit Sub
    

    使用: 符号将Exit Sub 放入我们的单行If

    If Dir("C:\file.txt", vbDirectory) = "" Then MsgBox "File Doesn't Exist" : Exit Sub
    

【讨论】:

这(尤其是您的步骤 #2)表明这两种形式不等价(也就是说,Exit Sub 不是分支的一部分),我不认为是这种情况。或者,如果是这种情况,所有这些答案都是错误的,因为这不是多行版本的正确等效代码。 @LightnessRacesinOrbit 你是对的,在某种意义上step #2 是不等价的,因为在该步骤中Exit Sub 的执行与if 表达式无关。 @Louis 这是一个有趣的语言功能,它模拟了一个词法换行符并在某种意义上导致了逻辑语句结束,而在另一种意义上不会导致逻辑语句结束! VB 的积木很奇怪。 @LightnessRacesinOrbit 是的。从技术上讲,它是用: 人为地将 2 行合并为 1 行。实际上,它与您认为单行表达式的语义有关。这是一个外观合并的表达式 (:),由两个单行表达式组成。 : 没有任何实际用途,只是在视觉上融合了两条换行符 @Rawrplus 但还不止这些,因为没有:,这两个子语句实际上是一个[无效]子语句。【参考方案3】:

在 VBA 中,您可以在一条指令中执行甚至超过两行的代码,只需在一条指令和另一条指令之间添加:!这是完全合法的:

If True Then MsgBox "True - Line 1": MsgBox "True - Line 2": Exit Sub

【讨论】:

【参考方案4】:
If Dir("C:\file.txt", vbDirectory) = "" Then : MsgBox "File doesn't exist" : End If

我没有足够的声誉来解决上述问题。 : 也应添加在 Then 和您的操作块之间。

【讨论】:

其实: 后面没必要放在Then 后面。 @Zamar 的答案是正确的。 不过,我遇到了一个错误。 'End If' must be preceded by a matching 'If' 一定是其他原因,我只是复制并执行了他的代码,它可以工作(我的也是)...... @Winand,哦,我没注意到。修复了帖子。谢谢!顺便说一句,我确实使用 End If 今天对其进行了测试,现在也进行了仔细检查。不: 仍然给我一个错误... 哦,显然我的眼睛终于开始工作了。这是具有与 VB.Net 的相似语法的 VBA。我现在觉得很笨。哈哈【参考方案5】:

如果你需要 Else 分词,sintaxis 将是:

If i Mod 2 <> 0 Then debug.print "Odd" Else: debug.print "Even"

【讨论】:

以上是关于VBA:具有多个操作的单行 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

vba基础二 条件判断语句和循环语句总结

数组中多个 if 语句的 VBA 代码

使用多个“For”和“if”语句加速 VBA 宏

excel VBA用户定义函数中是不是可以有多个if语句

VBA if语句

VBA if...else语句