【问题标题】:VBA: Single line if statement with multiple actionsVBA:具有多个操作的单行 if 语句
【发布时间】: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 行代码时,在结构上将代码划分为类别,按逻辑结构创建单独的模块等等。但是代码首先应该总是非常全面,只有在美学上令人愉悦。相信我,在重新访问代码时,您的同事、测试人员和未来的自己都会感谢您
  • 我认为您要查找的关键字是“三元运算符”
  • 肯定不会在条件语句中内联提前返回。退出是应该在任何编程语言中脱颖而出的东西。使用四行版本。任何阅读您的代码的人都会为您所做的感到高兴。

标签: excel vba


【解决方案1】:

你绝对可以!

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

【讨论】:

    【解决方案2】:
    • If 声明 does already support single-line syntax
      简单来说,这意味着我们可以:

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

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

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

      Dim x As Integer: x = 42
      

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

    1. 原代码

      If Dir("C:\file.txt", vbDirectory) = "" Then 
         MsgBox "File doesn't exist"
         Exit Sub
      End If
      
    2. 应用 单行 If 语法

      If Dir("C:\file.txt", vbDirectory) = "" Then MsgBox "File Doesn't Exist"
      Exit Sub
      
    3. 使用: 符号将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"
      

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 2020-11-09
        相关资源
        最近更新 更多