我正在使用旧版VBA / Excel应用程序,偶然发现了一些将长字符串(从文件中读取)切成小段的代码行。这些行看起来像这样:
Range("E16").Value = Mid(line, 49, [6])
很明显,写[6]
意味着要使用6个字符,但是我从未见过这种语法在数字前后加上方括号。
我做了一些测试,发现把那些方括号放在数字上并没有明显的作用
Dim x As Double
x = 5.1
Debug.Print [2], [3.1], [-5], x
Debug.Print [3.1] * [x] * [-5]
>> 2 3.1 -5 5.1
>> -79.05
因此,没有截断,没有舍入,没有绝对值。
我进行了更多测试,以检查它是否具有类似于在变量周围加上括号以防止修改通过引用传递的值的魔力,但事实并非如此:
x = 5.1: test2 x: Debug.Print x
x = 5.1: test2 (x): Debug.Print x
x = 5.1: test2 [x]: Debug.Print x
Sub test2(ByRef y As Double)
y = y * 2
End Sub
>> 10.2
>> 5.1
>> 10.2
令人惊讶的是,编译器甚至接受以下语法:使用这些括号的含义是什么?
答案 0 :(得分:12)
VBA / VB6中的方括号用于访问“外国标识符”,即原本不合法的标识符。例如:
Public Enum Foo
Some
Thing
[Some Thing] ' please don't do this
End Enum
以及以下划线开头的隐藏成员:
Public Property Get NewEnum() As IUnknown
Set NewEnum = myCollection.[_NewEnum]
End Property
但是,在此问题的代码上下文中,方括号as Scott indicated本质上是[_Global].Evaluate
的简写形式,它最终解析为Application.Evaluate
...假设我们不在Worksheet
模块的代码后面,在这种情况下,它是Worksheet.Evaluate
的简写-都返回Variant
,这意味着任何链接的成员调用都是盲目的,后期绑定的调用已解决在运行时:Option Explicit
无法将您从错字中救出来。
这就是Rubberduck(我管理/贡献的一个开源VBIDE外接程序项目)将它们解析为“运行时表达式”的原因:
换句话说:
Range("E16").Value = Mid(line, 49, [6])
也可以这样写:
[E16] = Mid(line, [49], [6])
...这可以说是很糟糕的代码,并且会进行大量的冗余隐式操作。
从来没有,从不有任何理由将整数文字放在方括号中:无非是将Integer
文字转换为Double
的一种round回的方法。 (因为工作表的数值为Variant/Double
):
Debug.Print TypeName(42)
Integer
Debug.Print TypeName([42])
Double
通过显式转换可以更好地解决问题:
Debug.Print TypeName(CDbl(42))
Double
...甚至带有( gasp )类型提示:
Debug.Print TypeName(42#)
Double