Excel VBA中“!=”的等价物是啥?
Posted
技术标签:
【中文标题】Excel VBA中“!=”的等价物是啥?【英文标题】:What is the equivalent of "!=" in Excel VBA?Excel VBA中“!=”的等价物是什么? 【发布时间】:2012-07-20 16:46:09 【问题描述】:问题是!=
在excel vba中不能作为函数工作。
我希望能够使用
If strTest != "" Then
而不是If strTest = "" Then
除了!=
,还有其他方法吗?
我模仿!=
的功能是
Sub test()
Dim intTest As Integer
Dim strTest As String
intTest = 5
strTest = CStr(intTest) ' convert
Range("A" + strTest) = "5"
For i = 1 To 10
Cells(i, 1) = i
If strTest = "" Then
Cells(i, 1) = i
End If
Next i
End Sub
【问题讨论】:
您确定是!=
而不是<>
?
您的问题是什么?为什么!=
在vba中不起作用,或者vba中的不等式运算符是什么?
duckduckgo.com/?q=VBA+comparison+operators
【参考方案1】:
因为VBA中的不等式运算符是<>
If strTest <> "" Then
.....
运算符!=
用于C#、C++。
【讨论】:
【参考方案2】:在 VBA 中,!=
运算符是 Not
运算符,如下所示:
If Not strTest = "" Then ...
【讨论】:
这是不正确的。Not
是逻辑反转运算符,对应于 C 风格语言中的 !
。【参考方案3】:
只是一个注释。如果要将字符串与 ""
进行比较,请使用
If LEN(str) > 0 Then
甚至只是
If LEN(str) Then
相反。
【讨论】:
我知道一些对 VBA 有点陌生的人,这个答案可能看起来很奇怪,但不管你信不信,这比检查<> ""
更有效
支持这个答案的有趣事实:Visual Basic 和 Pascal 语言在开头存储字符串,然后存储内容本身。另一方面,基于 C 的语言和 Java 语言不存储长度,并使用 '\0'(空)终止符来表示字符串结束。因此,在 VBA 中获取长度很快——它只是从内存中读取一个整数——而在 Java 中很慢——你需要遍历字符串。
@LimaNightHawk 远更有效率?你能详细说明一下吗?我猜大多数现代编译器都会捕获<> ""
模式并生成与Len(str)
相同的p 代码。
@Roland 这与 VBA 如何在内存中存储字符串有关。我会让你谷歌得到更完整的解释,但简而言之,字符串存储方式的一部分是第一个字节存储字符串的长度,然后以下字节存储字符:[3][C][A][T]
。 “空”字符串的第一个字节有一个[0]
,检查Len
允许代码只检查和比较整数。此外,当您执行= ""
时,第二个""
必须首先在内存中分配为它自己的字符串,然后与您的目标字符串进行比较。
@Roland:这将是一个简单的优化,但显然 VBA 编译器不会这样做。 Someone did a benchmark 的结果是,Len(str) > 0
在 1000 万次迭代中的速度大约是 str <> ""
的两倍。也就是说,我们在这里讨论的是 extreme 微优化(1000 万次迭代时为 0.36 秒 vs 0.72 秒),所以我肯定会坚持使用更具可读性的str <> ""
。【参考方案4】:
尝试使用<>
而不是!=
。
【讨论】:
以上是关于Excel VBA中“!=”的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法像 c# 一样在 Excel 的 VBA 中注释一行的一部分