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 语句的主要内容,如果未能解决你的问题,请参考以下文章