我工作的一个遗产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
所以,没有截断,没有四舍五入,没有ABS-值。 我做了一些测试,以检查是否它类似于把周围一个变量,以防止修改通过引用传递的值括号一些魔术,但事实并非如此:
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
意外的是,即使编译器接受的语法如下:什么是使用这些括号的含义是什么?
在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
(因为工作表数值是Variant/Double
):
Debug.Print TypeName(42)
Integer
Debug.Print TypeName([42])
Double
这是好得多有一个明确的转换来完成:
Debug.Print TypeName(CDbl(42))
Double
...甚至有(GASP)类型提示:
Debug.Print TypeName(42#)
Double