学习Excel技术,关注微信公众号:

excelperfect

数组是一种常用的数据结构,可用来存储一组相同类型的数据,你可以将一个数组变量视为一个迷你的电子表格,通过引用数组中的位置来存储或者获取数据。

下图1所示的示例是一个名为MyArray的一维数组,包含有6个元素。注意,数组的索引通常从0开始。

图1

下图2所示的示例是一个名为MyArray的3×4二维数组,包含有12个元素,像不像一个电子表格。注意,其行列的基准值都是从0开始的。

图2

当然,还可以使用三维甚至更高维度的数组,但我们最常使用的是一维数组或二维数组。如果你想详细学习数组的相关知识,可参阅相关文章:

Excel VBA解读|进阶篇(152):数据结构——谈谈数组

Excel VBA解读|进阶篇(153):数据结构——基本的数组操作

Excel VBA解读|进阶篇(154):数据结构——数组常用操作示例代码

Excel VBA解读|进阶篇(155):数据结构——数组相关的函数

VBA进阶|数组基础01:用最浅显的介绍来帮你认识数组

VBA进阶|数组基础02:简单的数组操作

……等等系列文章

快速了解数组后,我们来讲解在存储数据时动态调整数组大小的一些方法。

方法1:预先调整数组大小

在数组中存储数据之前,将数组大小调整为所要存储的数据数量。这非常适合事先知道需要存储的数据有多少的情形。

Sub PopulateArray1()    Dim MyArray() As Variant    Dim rngData As Range    Dim rng As Range    Dim i As Long       '确定要存储的数据    Set rngData = ActiveSheet.UsedRange       '在存储数据前调整数组大小    ReDim MyArray(rngData.Cells.Count)       '遍历单元格并在数组中存储数据    For Each rng In rngData.Cells        MyArray(i) = rng.Value        i = i + 1    Next rngEnd Sub

方法2:随时调整数组大小

VBA在调整数组大小时,会清除掉原先存储的数据。如果调整数组大小的同时,想要保留之前存储在数组中的数据,则需要使用Preserve关键字,告诉VBA在增加数组存储容量时,保留原来存储在数组中的数据。

Sub PopulateArray2()    Dim MyArray() As Variant    Dim rngData As Range    Dim rng As Range    Dim i As Long       '确定要存储的数据    Set rngData = ActiveSheet.UsedRange       '遍历单元格区域并在数组中存储数据    For Each rng In rngData.Cells        ReDim Preserve MyArray(i)        MyArray(i) = rng.Value        i = i + 1    Next rngEnd Sub

方法3:从带有分隔符的字符串中创建数组

分隔符是用于分隔数值的指定字符,例如CSV文件就是由逗号分隔的值组成的文件,我们可以将由分隔符组成的字符串拆分成数组。例如,下面的代码首先将数值转换成由“;|;”分隔成的字符串,然后将该字符串转换成数组。

Sub PopulateArray3()    Dim MyArray As Variant    Dim myString As String    Dim rngData As Range    Dim rng As Range       '确定要存储的数据    Set rngData =ActiveSheet.Range("C1:C100")       '遍历单元格区域并以指定的分隔符连接数值    '并将其存储在字符串中    For Each rng In rngData.Cells        myString = myString &";|;" & rng.Value    Next rng       '移除字符串末尾的分隔符(;|;)   myString = Right(myString, Len(myString) - 3)       '使用Split函数创建数组    MyArray = Split(myString, ";|;")End Sub

如果已经有一个带分隔符的字符串,那么可以使用代码很方便地将其拆分成数组:

Sub PopulateArray4()    Dim MyArray As Variant    Dim myString As String       '使用分隔符的字符串    myString = "一年级;|;二年级;|;三年级;|;四年级;|;五年级;|;六年级"       '使用Split函数创建数组    MyArray = Split(myString, ";|;")End Sub

方法4:直接赋值

可以直接将单元格区域赋值给数组变量来创建数组:

Sub PopulateArray5-1()    Dim MyArray() As Variant       '创建数组    MyArray =Application.Transpose(Range("A1:A6"))End Sub

还可以创建二维数组:

Sub PopulateArray5-2()    Dim MyArray() As Variant       '创建数组    MyArray = Range("A1:D3")End Sub

方法5:从表中提取数据直接创建数组

这个方法在表中的数据变化时,代码仍正常运行,也就是说,表使数组也具有了自动扩展功能。

Sub PopulateArray6()    Dim MyArray() As Variant    Dim myTable As ListObject       '设置表变量    SetmyTable = ActiveSheet.ListObjects("表1")       '创建数组    MyArray =Application.Transpose(myTable.DataBodyRange.Columns(1))End Sub

注意,方法4和方法5创建的数组其索引从1开始。

vba动态二维数组_VBA实战技巧05: 动态调整数组以存储所需数据相关推荐

  1. 动态二维码中值滤波处理_使用中值滤波原理过滤异常数据

    最近有一个程序需要做一些数据分析,遇见一个求平均值的需求.数据序列由传感器输出类似如下:[10,12,11,25,9,10,9,45,13,12,10,11,78,12,12,13,10,9].在这个 ...

  2. VBA 为什么你redim() 动态二维数组总出错?因为 redim 动态数组不太适合和循环搭配

    1总结 1.1 如何避免出错 如果是想生成一个二维数组,最后用静态声明,或则二次声明redim 一个足够大的动态数组 1.2 出错的原因是什么? redim时只有最后1维可变化,redim不太适合和循 ...

  3. C++动态二维数组演示的代码

    将代码过程中经常用到的代码珍藏起来,下边资料是关于C++动态二维数组演示的代码. #include <iostream> #include <string>using name ...

  4. C++建立动态二维数组

    C++建立动态二维数组主要有两种方法: 1.使用数组指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组            int **b=new int*[row ...

  5. 动态二维数组赋值及for循环遍历和toString遍历

    package com.Summer_0421.cn;import java.util.Arrays;/*** @author Summer* 动态二维数组赋值及for循环遍历和toString遍历* ...

  6. C语言实现动态二维数组及相乘

    一.二维数组的概念  1.二维数组本质上是以数组作为数组元素的数组,即数组的数组. 2.二维数组就是一个有行和列的矩阵,每一行代表一个数组,即数组的数组. 3.每一行数组内元素所在的位置可以用行和列号 ...

  7. C++之定义动态二维数组

    C++之定义动态二维数组 直接上代码 #include"stdio.h" #include<iostream> using namespace std; int mai ...

  8. java创建动态二维数组

    java创建动态二维数组 //声明Scanner对象,获取键盘输入值Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = s ...

  9. 二维动态数组空间分配 c语言,科学网—C语言中动态二维数组的使用和分配 - 王一哲的博文...

    好多年不用C语言了,最后一次使用还是读研的时候写矩量法的时候了,看见VS的界面总能想起当年读书的时候的各种错误,往事随风.本程序应人之约,首先得到一个随机的矩阵,之后通过将矩阵分解为几个小矩阵统计小矩 ...

最新文章

  1. 一起学WPF系列(2):第一个WPF应用程序
  2. mysql 监听器_实例讲解Oracle监听口令及监听器安全
  3. 树与森林的存储、遍历和树与森林的转换
  4. Nginx配置参数说明
  5. securecrt是什么工具_比较一下几款常用的SSH工具
  6. int最大值java_Java 中一个int型数组的求最大值最小值 | 学步园
  7. 计算机网络课程设计之简单 Web Server 程序的设计与实现
  8. Linux 进程信号详细总结
  9. 腾讯云AI平台张文杰:构建一站式机器学习服务平台
  10. php什么版本好玩_PHP各种版本区别对比详解
  11. 释放低代码小宇宙,微软 Power Platform 震撼来袭!
  12. 金蝶eas怎么引出凭证_如何引出会计分录序时簿?
  13. Arduino - 看门狗定时器的使用介绍
  14. element-ui图片上传组件之限制每次5张上传(或者自定义每次几张上传)
  15. 计算机专业初学者推荐书籍
  16. 苹果cms影片集数不更新解决方法
  17. DCDC开关电源学习
  18. OSChina 周一乱弹 ——我秃我长寿?
  19. HACKTHEBOX——Blocky
  20. Veritas针对通用数据保护再出手

热门文章

  1. MIP、PWA、WebGL、HTTPS,来看Web生态的领先技术
  2. Boost在Linux和windows下的编译 32位 64位
  3. 战疫期,钉钉如何扛起暴增百倍的流量?【阿里云快速扩容新纪录】
  4. 基于servletjspmysql的表格增删改查操作
  5. java基础---关于比较器Comparator和Comparable
  6. leetcode 260. Single Number III | 260. 只出现一次的数字 III(位运算:分组异或)
  7. 【Python爬虫】写个爬虫爬取自己的博客,可以刷访问量
  8. C++ STL栈Stack的使用
  9. Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  10. 服务器如何安装多系统,服务器如何安装双操作系统