gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:36:20 30 4
gpt4 key购买 nike

当我运行以下宏时:

Sub try()
Dim num As Integer
num = 123
MsgBox Len(num)
MsgBox VBA.Len(num)
End Sub

第一个 Msgbox 显示 2,第二个 Msgbox 显示 3。如果我删除第一行 Dim num As Integer,两个 MsgBox 都会显示 3

谁能解释一下为什么吗?

最佳答案

LenLenB 不仅仅是普通函数,它们是关键字,因此可以在 list of VBA keywords 上找到。 (尽管 LenB 仅在您点击 Len 后才会被提及)。
Mid 是此类关键字伪装成函数的另一个示例,而例如Left 根本不在列表中,因为那只是一个普通函数。

它必须是一个关键字,因为它的工作之一是执行确定变量存储大小的编译时任务。例如。对于私有(private)用户定义类型,普通函数根本无法做到这一点:

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

事实上,当您在 Len(f 上按 Shift+F2 时,对象浏览器会将您带到 VBA.Len ) 既正确又具有误导性。
这里的 Len(f) 实际上并没有调用确定字符串大小的 VBA.Len 函数,它根本无法做到这一点,因为它需要将私有(private)结构强制转换为变体。相反,它在编译时计算 foo 的大小,并将结果作为文字常量替换到可执行文件中。

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

关于vba - 为什么 Len 和 VBA.Len 返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29755772/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com