是什么意思,如果一个号码写在方括号,例如[5]

问题描述 投票:9回答:1

我工作的一个遗产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
1个回答
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])

......这无疑是一吨的多余的隐式操作回事可怕的代码。

有永远,永远任何原因方括号整数文本:它什么比一个相当迂回的方式更把文字的IntegerDouble(因为工作表数值是Variant/Double):

Debug.Print TypeName(42)
Integer

Debug.Print TypeName([42])
Double

这是好得多有一个明确的转换来完成:

Debug.Print TypeName(CDbl(42))
Double

...甚至有(GASP)类型提示:

Debug.Print TypeName(42#)
Double
© www.soinside.com 2019 - 2024. All rights reserved.