VBA数组深入学习 vba 数组用法
yuyutoo 2024-10-12 00:46 3 浏览 0 评论
VBA里数组最基础的知识可以先看下数组Array里说的,是比较基础的一些东西。
1 定义数组
定义一个数组的时候,VBA编译器做了什么?
Sub Test()
Dim a1() As Byte
Dim a2() As Long
Dim a3() As String
Dim a4() As Variant
Dim p1 As LongPtr, p2 As LongPtr, p3 As LongPtr, p4 As LongPtr
p1 = VarPtrArray(a1)
p2 = VarPtrArray(a2)
p3 = VarPtrArray(a3)
p4 = VarPtrArray(a4)
Dim p1value As Long, p2value As Long, p3value As Long, p4value As Long
CopyMemory VarPtr(p1value), p1, 4
CopyMemory VarPtr(p2value), p2, 4
CopyMemory VarPtr(p3value), p3, 4
CopyMemory VarPtr(p4value), p4, 4
Debug.Print p1, p1value
Debug.Print p2, p2value
Debug.Print p3, p3value
Debug.Print p4, p4value
End Sub
'输出:
3074256 0
3074252 0
3074220 0
3074244 0
VarPtrArray得到的那个地址,也就是变量a1、a2、a3、a4的地址,这个和定义其他的数据类型的变量都一样,此时编译器仅仅是给变量分配了内存地址。
这个地址里面保存的数据就是数组的地址,不管定义一个什么类型的数组,在没有初始化数组容量的时候,变量地址里保存的数据都是0,也就是编译器还没有为数组申请任何的内存空间。
2 初始化数组
初始化一个数组的时候,VBA编译器做了什么?
Sub Test()
Dim a1() As Byte
ReDim a1(1) As Byte
Dim p1 As LongPtr
p1 = VarPtrArray(a1)
Dim p1value As Long
CopyMemory VarPtr(p1value), p1, 4
Debug.Print VBA.Hex(p1), VBA.Hex(p1value)
End Sub
'输出:
2CE950 C1774F8
使用ReDim将数组初始化后:
- 编译器申请了一块内存空间来保存数组的数据,这个空间的地址记作pvDatas。
- 编译器申请了一块内存空间来保存数组的信息,这个空间的地址就记作pSafeArray,并把这个空间的地址写入变量p1地址,并把pvDatas的值记录到pSafeArray后12的地址上。
3 数组的数据结构
官方介绍数组:一组顺序索引的元素。
数组在VBA里是一个数据类型,除了这一组顺序索引的元素之外,还有一个记录了数组一些信息的结构体SafeArray。
所以,上面的C1774F8指向的是SafeArray结构体,而并不是数组数据开始的地址:
Sub Test()
Dim a1() As Byte
ReDim a1(1) As Byte
Dim p1 As LongPtr
p1 = VarPtrArray(a1)
Dim p1value As Long
CopyMemory VarPtr(p1value), p1, 4
Dim sa As SafeArray
'获取SafeArrayBound之前的数据
CopyMemory VarPtr(sa.cDims), p1value, 16
ReDim sa.rgsabound(sa.cDims - 1) As SafeArrayBound
'根据维度再读取需要的数据
CopyMemory VarPtr(sa.rgsabound(0).cElements), p1value + 16, sa.cDims * 8
Debug.Print VBA.Hex(p1), VBA.Hex(p1value), VBA.Hex(sa.pvDataas), VBA.Hex(VarPtr(a1(0)))
End Sub
'输出:
2CEA50 1F5D28F8 1890A4A0 1890A4A0
可以看到sa.pvDataas和VarPtr(a1(0))的地址是同一个地址,这个才是真正的数组数据开始的地方,SafeArray的作用就是记录一些数组的信息,长度、维度等,方便来操作数组。
这个的用法和String类型是类似的,主要是为了方便操作和处理,就在数据开始的前面记录了数据的长度信息。SafeArray记录的数据更多,而且记录的位置也不是在紧挨着数据开始的前面,而是另外开辟空间来记录。
VBA 学习 学习使用Excel VBA 177篇原创内容 -->
公众号,关注xyjvba,查看更多
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)