为什么Len和VBA.Len会返回不同的结果?

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.有谁能解释为什么?

314*_*ils 7

它与VB存储整数的方式以及Len()函数如何处理非字符串的参数有关.

当一个非字符串的数据类型传递给该Len()函数时,它返回用于存储数据的标称字节数(VB使用2个字节来存储整数).请参阅Len功能文档.

Len()函数将自动转换变量变量(通过为变量赋值而不首先声明它来创建)作为字符串.返回没有改变,因为存储分配发生了变化(虽然它确实存在;变体需要16个字节的存储空间,最小).由于隐式声明的变量实际上是变量类型,因此VB将根据情况自动更改其类型.在这种情况下,Len()需要一个字符串,以便VB使变量成为一个字符串.

如果您的意图是返回整数值中的字符数,则可以使用Msgbox Len(Cstr(num))将整数变量转换为字符串,然后再将其传递给Len函数.

  • 我仍然不清楚这如何解决实际问题:为什么`Len` 和`VBA.Len` 返回不同的结果? (3认同)
  • 新的 GSerg 答案似乎是终极答案,解释了差异。Len() 和 VBA.Len() 之间。 (2认同)

GSe*_*erg 6

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+F2Len(f)是正确和误导。
Len(f)这里并没有真正调用VBA.Len决定字符串的大小的功能,它根本不能这样做,因为它需要强迫私人结构成Variant。相反,它foo在编译时计算 的大小并将结果作为文字常量替换到可执行文件中。

在您的示例中,Len(num)计算变量num的编译时大小(即 2)并将常量替换2为生成的目标代码,而VBA.Len(num)将 的num打包到 aVariant并将该变量传递到VBA.Len进一步转换为字符串的位置"123"和长度被退回。