VBA数据类型Variant
官方文档定义:A special data type that can contain numeric, string, or date data as well as user-defined types and the special values Empty and Null. The Variant data type has a numeric storage size of 16 bytes and can contain data up to the range of a Decimal, or a character storage size of 22 bytes (plus string length), and can store any character text. The VarType function defines how the data in a Variant is treated. All variables become Variant data types if not explicitly declared as some other data type.
我以前一直好奇为什么能有什么数据都可以保存的类型,现在对内存知识有了一定了解才知道,其实说到底,Variant底层也是一种数据结构,16个字节分别会有不同的意义,对于一些VBA里的对象复制给Variant后,也只是保存了它的地址。至于通过地址怎么就能判断出对象的具体类型就不大清楚了!
所以想知道Variant的16个字节具体代表了什么,我们只需要让它保存不同的数据类型,然后查看16个字节的变化就可以了。
Variant16字节是如何分配的?
- 前8字节 b0:标识数据类型(也就是VarType返回的数字) b1:标识后8字节是数据还是指针 - 0x00 8-15数据类型的是数据本身,String是地址 - 0x40 8-11存的是数据地址,String是地址的地址 - 0x20 8-11存的是数组地址 - 0x60 8-11存的是数组地址的地址
- 后8字节8-15:数据或地址
Sub TestVariant()
Dim v As Variant
Dim i As Byte
i = &H10
v = i
Dim lenth As Long
lenth = 16
Dim b() As Byte
ReDim b(lenth - 1) As Byte
CopyMemory VarPtr(b(0)), VarPtr(v), lenth
Printf "VarType(v) = 0x%x, b = 0x% x", VarType(v), b
End Sub
输出:
i定义byte:VarType(v) = 0x11, b = 0x11 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00
i定义Integer:VarType(v) = 0x2, b = 0x02 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00
i定义Long:VarType(v) = 0x3, b = 0x03 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00
i定义Double:VarType(v) = 0x5, b = 0x05 00 00 00 00 00 00 00 00 00 00 00 00 00 30 40
i定义String:VarType(v) = 0x8, b = 0x08 00 00 00 00 00 00 00 74 02 f3 23 00 00 00 00
b1一直都是0,就算用v = VarPtr(i),仍然是0,因为VarPtr返回的也是Long,如何才能让b1出现呢?我们知道,VBA里面,函数的传值默认就是byref,所以加1个Function就可以了。
Sub TestVariant()
Dim i As Byte
i = &H10
TestVariantPtr i
End Sub
Function TestVariantPtr(v As Variant)
Dim lenth As Long
lenth = 16
Dim b() As Byte
ReDim b(lenth - 1) As Byte
CopyMemory VarPtr(b(0)), VarPtr(v), lenth
Dim ptr As Long
CopyMemory VarPtr(ptr), VarPtr(b(8)), 4
Dim Value As Byte
CopyMemory VarPtr(Value), ptr, 2
Printf "VarType(v) = 0x%x, b = 0x% x, ptr = 0x%x, Value = %x", VarType(v), b, ptr, Value
End Function
输出:
i、Value定义byte:VarType(v) = 0x11, b = 0x11 40 00 00 00 00 00 00 52 ef 19 00 00 00 00 00, ptr = 0x19efe4, Value = 10
i、Value定义Integer:VarType(v) = 0x2, b = 0x02 40 00 00 00 00 00 00 52 ef 19 00 00 00 00 00, ptr = 0x19efe4, Value = 10
i、Value定义Long:VarType(v) = 0x3, b = 0x03 40 00 00 00 00 00 00 50 ef 19 00 00 00 00 00, ptr = 0x19ef50, Value = 10
其他不多演示,注意Dim Value As语句下面的CopyMemory复制字节数和Value类型保持一致。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一个ABAP和JavaScript这两种编程语言的横向比较
- WebRTC & Android 开发学习环境搭建~
- word模板和XML数据源是如何合并生成最后的word文档的详细过程
- Angular路由跳转时,如何传递信息
- Angular里的购物车页面实现
- CentOS7部署WeADMIN监控主机交换机和URL(无坑版)
- JsonPath实践(一)
- 开源测试服务
- Charles报错Failed to install helper解决方案
- [890]scrapy之pipeline的使用
- Redis的slot迁移工具
- 一文搞懂Flink rocksdb中的数据恢复
- Linux expect用法介绍
- GitHub通过access token来clone代码
- 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入