hil*_*hil 4 excel vba excel-vba
当我运行以下宏时:
Sub try()
Dim num As Integer
num = 123
MsgBox Len(num)
MsgBox VBA.Len(num)
End Sub
Run Code Online (Sandbox Code Playgroud)
第一个Msgbox显示2和第二个Msgbox显示3.如果我删除第一行,则Dim num As Integer显示两个框3.有谁能解释为什么?
它与VB存储整数的方式以及Len()函数如何处理非字符串的参数有关.
当一个非字符串的数据类型传递给该Len()函数时,它返回用于存储数据的标称字节数(VB使用2个字节来存储整数).请参阅该Len功能的文档.
该Len()函数将自动转换变量变量(通过为变量赋值而不首先声明它来创建)作为字符串.返回没有改变,因为存储分配发生了变化(虽然它确实存在;变体需要16个字节的存储空间,最小).由于隐式声明的变量实际上是变量类型,因此VB将根据情况自动更改其类型.在这种情况下,Len()需要一个字符串,以便VB使变量成为一个字符串.
如果您的意图是返回整数值中的字符数,则可以使用Msgbox Len(Cstr(num))将整数变量转换为字符串,然后再将其传递给Len函数.
Len并且LenB不只是普通的函数,它们是关键字,因此可以在VBA 关键字列表中找到(尽管LenB只有在您点击 后才会提到Len)。
Mid将是此类关键字伪装成函数的另一个示例,而 egLeft根本不在列表中,因为那只是一个普通函数。
它必须是一个关键字,因为它的工作之一是执行确定变量存储大小的编译时任务。例如,对于私有用户定义类型,普通函数根本无法做到这一点:
Private Type foo
a As Long
b As String
End Type
Sub TestLens()
Dim f As foo
MsgBox Len(f) ' OK
MsgBox VBA.Len(f) ' Compile time error
End Sub
Run Code Online (Sandbox Code Playgroud)
该对象浏览器带给你一个事实,VBA.Len当你按下Shift+F2上Len(f)是正确和误导。
在Len(f)这里并没有真正调用VBA.Len决定字符串的大小的功能,它根本不能这样做,因为它需要强迫私人结构成Variant。相反,它foo在编译时计算 的大小并将结果作为文字常量替换到可执行文件中。
在您的示例中,Len(num)计算变量num的编译时大小(即 2)并将常量替换2为生成的目标代码,而VBA.Len(num)将 的值num打包到 aVariant并将该变量传递到VBA.Len进一步转换为字符串的位置"123"和长度被退回。