【问题标题】:Difference between Long and Object data type in VBAVBA中Long和Object数据类型的区别
【发布时间】:2013-05-31 04:48:05
【问题描述】:

在 VBA 中,Long 和 Object 数据类型都是 4 字节,即内存地址的大小。这是否意味着,从技术上讲,Object 数据类型不会做 Long 不能做的任何事情?如果是,那么是否可以说 Object 数据类型的存在只是为了让程序员更容易区分变量的用途?

我在考虑 Win32 API 函数声明时提出了这个问题。它们经常被声明为 Long,除非我弄错了,否则它们的返回值只是一个内存地址。似乎将这些函数定义为 Object 会更合适。

我完全不在了吗?提前致谢。

【问题讨论】:

  • Object 隐藏了大量的底层复杂性,它底层的 4 字节指针 必须 指向一个 COM 对象 vTable/IDispatch - 你不能分配任何东西的地址否则它并期望它能够工作。
  • 我不知道它只能指向 COM 对象。那么,这对 Win32 API 函数有什么影响呢?如果它们返回 COM 指针,那么为什么不将它们声明为 Object 而不是 Long?
  • 大多数使用 COM 的 Win32 都是直接使用 COM 接口而不是作为导出函数实现的,我想理论上如果你找到一个确实返回这样的函数(例如 COM 的 CoCreateInstance 的最后一个参数),你可以传递参数as Object

标签: vba variables


【解决方案1】:

基于 VBA/MSDN 帮助:

长(长整数)变量存储为带符号的 32 位(4 字节) 数值范围从 -2,147,483,648 到 2,147,483,647。

和其他定义:

对象变量存储为 32 位(4 字节)地址,这些地址引用 对象。使用 Set 语句,声明为 Object 的变量可以 有任何对象引用分配给它。

从实际的角度来看,它们都是不同的,并且在不同的情况下使用。哪些是必不可少的:Long >> 指代数字Object >> 指代对象

查看以下 VBA 代码(用于 Excel),我在其中添加了允许和不允许的 cmets:

Sub test_variables()

    Dim A As Object
    Dim B As Long

    'both below are not allowed, throwing exceptions
    'A = 1000
    'Set B = ActiveSheet

    'both are appropriate
    Set A = ActiveSheet
    B = 1000
End Sub

最后,就 API 而言,最好保留原始声明,不要对其进行操作,以避免对 API 函数的意外行为造成任何风险。

【讨论】:

  • 感谢您的回复。我知道如何使用这些数据类型并且它们不能互换。我只是很困惑为什么 Win32 API 函数返回一个定义为 Long 而不是 Object 的指针。一方面,Long 只能保存所有可能的地址值的一半。其次,为了保持一致性,我认为 Object 应该专门用于指针,而 Long 专门用于有符号整数。
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多