VBA数组深入学习 vba 数组用法
yuyutoo 2024-10-12 00:46 7 浏览 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,查看更多
相关推荐
- ETCD 故障恢复(etc常见故障)
-
概述Kubernetes集群外部ETCD节点故障,导致kube-apiserver无法启动。...
- 在Ubuntu 16.04 LTS服务器上安装FreeRADIUS和Daloradius的方法
-
FreeRADIUS为AAARadiusLinux下开源解决方案,DaloRadius为图形化web管理工具。...
- 如何排查服务器被黑客入侵的迹象(黑客 抓取服务器数据)
-
---排查服务器是否被黑客入侵需要系统性地检查多个关键点,以下是一份详细的排查指南,包含具体命令、工具和应对策略:---###**一、快速初步检查**####1.**检查异常登录记录**...
- 使用 Fail Ban 日志分析 SSH 攻击行为
-
通过分析`fail2ban`日志可以识别和应对SSH暴力破解等攻击行为。以下是详细的操作流程和关键分析方法:---###**一、Fail2ban日志位置**Fail2ban的日志路径因系统配置...
- 《5 个实用技巧,提升你的服务器安全性,避免被黑客盯上!》
-
服务器的安全性至关重要,特别是在如今网络攻击频繁的情况下。如果你的服务器存在漏洞,黑客可能会利用这些漏洞进行攻击,甚至窃取数据。今天我们就来聊聊5个实用技巧,帮助你提升服务器的安全性,让你的系统更...
- 聊聊Spring AI Alibaba的YuQueDocumentReader
-
序本文主要研究一下SpringAIAlibaba的YuQueDocumentReaderYuQueDocumentReader...
- Mac Docker环境,利用Canal实现MySQL同步ES
-
Canal的使用使用docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中,并在springboo...
- RustDesk:开源远程控制工具的技术架构与全场景部署实战
-
一、开源远程控制领域的革新者1.1行业痛点与解决方案...
- 长安汽车一代CS75Plus2020款安装高德地图7.5
-
不用破解原车机,一代CS75Plus2020款,安装车机版高德地图7.5,有红绿灯读秒!废话不多讲,安装步骤如下:一、在拨号状态输入:在电话拨号界面,输入:*#518200#*(进入安卓设置界面,...
- Zookeeper使用详解之常见操作篇(zookeeper ui)
-
一、Zookeeper的数据结构对于ZooKeeper而言,其存储结构类似于文件系统,也是一个树形目录服务,并通过Key-Value键值对的形式进行数据存储。其中,Key由斜线间隔的路径元素构成。对...
- zk源码—4.会话的实现原理一(会话层的基本功能是什么)
-
大纲1.创建会话...
- Zookeeper 可观测性最佳实践(zookeeper能够确保)
-
Zookeeper介绍ZooKeeper是一个开源的分布式协调服务,用于管理和协调分布式系统中的节点。它提供了一种高效、可靠的方式来解决分布式系统中的常见问题,如数据同步、配置管理、命名服务和集群...
- 服务器密码错误被锁定怎么解决(服务器密码错几次锁)
-
#服务器密码错误被锁定解决方案当服务器因多次密码错误导致账户被锁定时,可以按照以下步骤进行排查和解决:##一、确认锁定状态###1.检查账户锁定状态(Linux)```bash#查看账户锁定...
- zk基础—4.zk实现分布式功能(分布式zk的使用)
-
大纲1.zk实现数据发布订阅...
- 《死神魂魄觉醒》卡死问题终极解决方案:从原理到实战的深度解析
-
在《死神魂魄觉醒》的斩魄刀交锋中,游戏卡死犹如突现的虚圈屏障,阻断玩家与尸魂界的连接。本文将从技术架构、解决方案、预防策略三个维度,深度剖析卡死问题的成因与应对之策,助力玩家突破次元壁障,畅享灵魂共鸣...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
推荐7个模板代码和其他游戏源码下载的网址
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
-
- ETCD 故障恢复(etc常见故障)
- 在Ubuntu 16.04 LTS服务器上安装FreeRADIUS和Daloradius的方法
- 如何排查服务器被黑客入侵的迹象(黑客 抓取服务器数据)
- 使用 Fail Ban 日志分析 SSH 攻击行为
- 《5 个实用技巧,提升你的服务器安全性,避免被黑客盯上!》
- 聊聊Spring AI Alibaba的YuQueDocumentReader
- Mac Docker环境,利用Canal实现MySQL同步ES
- RustDesk:开源远程控制工具的技术架构与全场景部署实战
- 长安汽车一代CS75Plus2020款安装高德地图7.5
- Zookeeper使用详解之常见操作篇(zookeeper ui)
- 标签列表
-
- 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)